WCF分布式开发常见错误(14):无效的操作异常,At least one operation on the ...

简介:
  WCF事务编程过程中,会出现这个操作无效异常。信息如下:
At least one operation on the 'WCFServiceTransaction1' contract is configured with the TransactionFlowAttribute attribute set to Mandatory but the channel's binding 'NetTcpBinding' is not configured with a TransactionFlowBindingElement. The TransactionFlowAttribute attribute set to Mandatory cannot be used without a TransactionFlowBindingElement.
异常界面如图:
我是在调试客户端事务模式的时候出现的错误,服务契约和服务类的代码如下:
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ServiceModel; 
using System.Runtime.Serialization; 
using System.Transactions; 
using System.Diagnostics; 
//ServiceContract 属性以及 Indigo 使用的所有其他属性均在 System.ServiceModel 命名空间中定义, 
//因此本例开头使用 using 语句来引用该命名空间。 

namespace WCFService 

        //1.服务契约 
        [ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")] 
        public interface IWCFServiceTransaction1 
        { 
                //操作契约 
                [OperationContract] 
                //强制事务流,使用客户端事务 
                //[TransactionFlow(TransactionFlowAttribute 
                [TransactionFlow(TransactionFlowOption.Mandatory)] 
                bool AddNewData(string name); 

        } 
        //2.服务类,实现契约 
        //事务有10分钟的超时限制 
        //[ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
        [ServiceBehavior(IncludeExceptionDetailInFaults = true, TransactionTimeout = "00:30:00")] 
        public class WCFServiceTransaction1 : IWCFServiceTransaction1 
        { 
                //实现接口定义的方法 
                //需要事务环境,启动事务 
                [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
                public bool AddNewData(string name) 
                { 
                        Transaction transaction = Transaction.Current; 
                        Debug.Assert(System.Transactions.Transaction.Current.TransactionInformation.DistributedIdentifier!=Guid.Empty); 
                        Console.WriteLine("Create a new Transaction at {0}", System.Transactions.Transaction.Current.TransactionInformation.CreationTime); 
                        Console.WriteLine("WCFService 1 Transaction Status is {0}", System.Transactions.Transaction.Current.TransactionInformation.Status); 
                        Console.WriteLine("WCFService 1 Transaction LocalIdentifier is {0}", System.Transactions.Transaction.Current.TransactionInformation.LocalIdentifier); 
                        Console.WriteLine("WCFService 1 Transaction DistributedIdentifier is {0}", System.Transactions.Transaction.Current.TransactionInformation.DistributedIdentifier); 

                        //using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope()) 
                        //{ 
                        try 
                        { 
                                using (userTableAdapter adapter = new userTableAdapter()) 
                                { 
                                        if (1 == adapter.CreateUser(name)) 
                                        { 
                                                Console.WriteLine("Calling WCF Transaction sucessfullyname length is:{0}", name.Length); 
                                        } 
                                        else 
                                        { 
                                                Console.WriteLine("Calling WCF Transaction unsucessfullyname length is:{0}", name.Length); 
                                                //return false; 
                                        } 
                                } 
                        } 
                        catch (Exception e) 
                        { 
                                Console.WriteLine("Calling WCF Transaction error:{0}", e.Message); 
                                throw e; 
                                //return false; 
                        } 

                        //ts.Complete(); 
                        return true; 

                } 
        } 
}
我查阅到的资料:
1.http://social.msdn.microsoft.com/Forums/en-US/windowstransactionsprogramming/thread/d3020922-92b3-4dc5-ab22-b8fe34cbf40e;这个是属性没定义在操作契约上。
2.http://blogs.msdn.com/thelever/archive/2007/03/29/configuration-of-transactions-of-use-in-wcf.aspx;这个建议更换[TransactionFlow(TransactionFlowOption.Allowed)].
可以解决问题。但是我不能这样。
我这里是为了测试客户端事务模式写的代码。
所以大家都什么好的解决办法~谢谢
3.已经找到解决办法:
使用配置文件方式:
添加一个绑定协议节点,。也可以使用编程方式。这里给出代码:
     < bindings >
      
< netTcpBinding  >
        
< binding name = " netTcpBindingTcp "  transactionFlow = " true "  transactionProtocol = " WSAtomicTransactionOctober2004 "    >

          
<!--< reliableSession enabled = " true "  ordered = " true " />
          
< security mode = " None " ></ security >-->
        
</ binding >
      
</ netTcpBinding >
    
</ bindings >
然后在服务终结点里使用这个配置:

< endpoint 
          address
= " net.tcp://localhost:9002/WCFServiceTransaction2 "  
           bindingConfiguration
= " netTcpBindingTcp "
          binding
= " netTcpBinding "  
          contract
= " WCFService.IWCFServiceTransaction2 " >
        
</ endpoint >
 



 本文转自 frankxulei 51CTO博客,原文链接:http://blog.51cto.com/frankxulei/320434,如需转载请自行联系原作者

相关文章
|
2月前
|
NoSQL Java Redis
开发实战:使用Redisson实现分布式延时消息,订单30分钟关闭的另外一种实现!
本文详细介绍了 Redisson 延迟队列(DelayedQueue)的实现原理,包括基本使用、内部数据结构、基本流程、发送和获取延时消息以及初始化延时队列等内容。文章通过代码示例和流程图,逐步解析了延迟消息的发送、接收及处理机制,帮助读者深入了解 Redisson 延迟队列的工作原理。
|
4月前
|
开发者 云计算 数据库
从桌面跃升至云端的华丽转身:深入解析如何运用WinForms与Azure的强大组合,解锁传统应用向现代化分布式系统演变的秘密,实现性能与安全性的双重飞跃——你不可不知的开发新模式
【8月更文挑战第31天】在数字化转型浪潮中,传统桌面应用面临新挑战。本文探讨如何融合Windows Forms(WinForms)与Microsoft Azure,助力应用向云端转型。通过Azure的虚拟机、容器及无服务器计算,可轻松解决性能瓶颈,满足全球用户需求。文中还提供了连接Azure数据库的示例代码,并介绍了集成Azure Storage和Functions的方法。尽管存在安全性、网络延迟及成本等问题,但合理设计架构可有效应对,帮助开发者构建高效可靠的现代应用。
33 0
|
7月前
|
NoSQL Java Redis
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件(二)
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的分布式锁的功能组件
46 0
|
7月前
|
存储 运维 分布式计算
分布式云容器平台ACK One概述
分布式云容器平台ACK One概述
109 2
|
7月前
|
分布式计算 负载均衡 Java
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用:介绍分布式系统设计与开发
76 0
|
7月前
|
缓存 监控 负载均衡
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(数据缓存不一致分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(数据缓存不一致分析)
132 2
|
7月前
|
存储 负载均衡 NoSQL
【分布式技术架构】「Tomcat技术专题」 探索Tomcat集群架构原理和开发分析指南
【分布式技术架构】「Tomcat技术专题」 探索Tomcat集群架构原理和开发分析指南
144 1
|
7月前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
156 1
|
7月前
|
存储 缓存 安全
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(存穿透、缓存击穿和缓存雪崩)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(存穿透、缓存击穿和缓存雪崩)
113 1
|
7月前
|
存储 缓存 监控
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)
115 0