WCF分布操作-如何判断通道关闭并再次创建通道
来源:互联网 发布:marva collins 知乎 编辑:程序博客网 时间:2024/06/03 17:25
分布操作含义解释
一个会话协定的操作有时会隐含了操作调用的顺序。有的操作不能被最先调用,而有的操作则必须被最后调用。
WCF实现分布操作的技术
WCF允许协定设计者指定协定操作为启动会话的操作,还是终止会话的操作,方法是使用 OperationContract 特性的 IsInitiating 和 IsTerminating 属性,还有一个前提条件是,必须在相应的服务协定上添加 SessionMode 设置为 Required。
例子
服务协定定义如下:
using System.ServiceModel;namespace wcfserviceTest{ [ServiceContract(SessionMode = SessionMode.Required)] public interface IOrderService { [OperationContract(IsTerminating = true)] string AcceptOrder(PartPlan planInstance); }}
客户端调用如下:
private void buttonSave_Click(object sender, EventArgs e) { try { Cursor = Cursors.WaitCursor; PartPlan plan = new PartPlan { OrderCode = txtboxOrderCode.Text, RowNo = Convert.ToInt32(numericUpDownRowNo.Value), RequireAmount = Convert.ToInt32(numericUpDownRequiredAmount.Value) }; MessageBox.Show(Proxy.OrderService.AcceptOrder(plan)); Cursor = Cursors.Default; } catch (Exception) { Cursor = Cursors.Default; throw; } }
当我们第一次点击保存界面,发送服务到服务端,
此时处理成功,见下图所示:
但是编辑订单另外一个订单,再次点击保存时,会在客户端弹出如下异常:
已经在此通道上调用了标记为 IsTerminating 的操作,导致要终止通道的连接。可能不会在此通道上调用更多操作。请重新创建通道以继续通信。
由此可见,启用 IsTerminating的服务方法,调用后会自动关闭本次会话,所以再调用 Proxy.OrderService.AcceptOrder(plan)
就会报错。
详见说明如下:
如何判断通道关闭并再次创建通道
private void buttonSave_Click(object sender, EventArgs e) { PartPlan plan=null; try { Cursor = Cursors.WaitCursor; plan = new PartPlan { OrderCode = txtboxOrderCode.Text, RowNo = Convert.ToInt32(numericUpDownRowNo.Value), RequireAmount = Convert.ToInt32(numericUpDownRequiredAmount.Value) }; //判断客户端-服务端的会话通道是否已经关闭,如果关闭,则需要重新创建通道 var clientstate = Proxy.OrderServiceClientInstance.State; if (clientstate == CommunicationState.Closed) { var factory = new ChannelFactory<IOrderService>(new WSHttpBinding()); IOrderService service = factory.CreateChannel(new EndpointAddress("http://localhost:8732/wcfserviceTest/")); MessageBox.Show(service.AcceptOrder(plan)); } else { MessageBox.Show(Proxy.OrderServiceClientInstance.AcceptOrder(plan)); } Cursor = Cursors.Default; } catch (Exception) { Cursor = Cursors.Default; throw; } finally { Proxy.OrderServiceClientInstance.Close(); } }
更多相关博客:
1 WCF中操作的分界于调用顺序和会话的释放
http://www.cnblogs.com/xiaoyaojian/p/4150018.html
阅读全文
1 0
- WCF分布操作-如何判断通道关闭并再次创建通道
- (二)、WCF通道模型
- WCF双工通道
- 通道
- 通道
- 通道
- 通道
- 关闭IDE通道检测
- Windows 关闭_IPV6_通道
- 注册表关闭IDE通道
- Go 通道(chan)关闭和后续读取操作
- java:BufferedImage判断图像通道顺序并转RGB/BGR
- [XD5.5]如何关闭XD的Audio UDP通道
- 创建反向通道
- 《WCF技术内幕》翻译36:第2部分_第6章_通道:创建自定义通道和本章小结
- 《WCF技术内幕》翻译36:第2部分_第6章_通道:创建自定义通道和本章小结
- 一个创建迷宫并寻找通道的小程序
- Redis的通道操作
- SecureCRT 7.3软件下载及破解工具+教程
- 正则表达式速成教程
- [App] NFS 服务器搭建及使用
- 一句话详细题解+优质题目及其博客(清真代码)链接 (持续更新)+知识点讲解汇总
- LDAP学习笔记(二)LDAP安装配置
- WCF分布操作-如何判断通道关闭并再次创建通道
- Linux操作快捷键整理
- maven : Failed to load class "org.slf4j.impl.StaticLoggerBinder"
- 登陆成功后返回前一个页面
- Java 基础之 DecimalFormat 用法
- 我遗憾的事情
- springMVC:HandlerInterceptor拦截器的使用
- 自带cookie的httpClient请求
- CodeForces 279A Point on Spiral