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

原创粉丝点击