zoukankan      html  css  js  c++  java
  • WCF——消息格式(一)

    目的用于测试WCF服务

     

    准备工作两项。

    (一)WCF服务

    这部分包含WCF服务及其宿主,用于运行WCF服务。这部分新建立控制台应用程序。

    (二)访问WCF服务的客户端

    这部分用于测试申请WCF服务

     

    这里简化所有操作。这个示例不仅提供用于测试WCF服务的测试结构,且实现三种消息交换方式

    One-Way Calls

    Request/Reply

    Duplex

     

    (一)One-Way方式实现

    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]

        public interface IServiceShowMsg

        {

            [OperationContract(IsOneWay=true)]

            void SingleMsg(string str);       

    }

     

    public class ServiceSHowMsg : IServiceShowMsg

        {

            #region IServiceShowMsg 成员

            public void SingleMsg(string str)

            {

    Console.Write("单工 "+str);

            }

            #endregion

    }

     

    在控制台程序中添加WCF服务。

     

    这个是oneway实现:在方法SingleMsg中添加协定(契约ContractIsOneWay=true

    ·没有返回值,返回类型只能为void

    ·不能包含ref或者out类型的参数

    ·只有客户端发起请求,服务端并不会对请求进行回复

     

    (二)控制台Main

    static void Main(string[] args)

    {

     

    Uri baseAddress = new Uri("http://localhost:9876/WCFConsole/ServiceSHowMsg");

    ServiceHost selfHost = new ServiceHost(typeof(ServiceSHowMsg), baseAddress);

    selfHost.AddServiceEndpoint(typeof(IServiceShowMsg),

    new WSHttpBinding(), "ServiceSHowMsg");

    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();

    smb.HttpGetEnabled = true;

    selfHost.Description.Behaviors.Add(smb);

     

    selfHost.Open();

    Console.WriteLine("WCF服务准备好了……");

    Console.WriteLine("回车退出.");

    Console.WriteLine();

    Console.ReadLine();

     

    selfHost.Close();

    }

     

    启动控制台,访问http://localhost:9876/WCFConsole/ServiceSHowMsg

    可以看到WCF服务页,这说明服务运行正常。

    (三)客户端

    客户端申请WCF服务,和WS感觉有很大的相似性。这里建立测试类库

    有两种方式:

    (1)WS中通过wsdl命令生成代理类,在WCF中以svcutil来生成。

    (2)UI添加服务的方式添加,客户端(测试类库)添加web引用(vs05)对WS调用,添加服务引用(vs08)WCF调用。

     

    新建立类库,这个建立的类库这次不要和上边那个控制台在同一个项目(为了测试)。

    建立好类库测试项目后,还要添加System.ServiceModel引用

     

    现在添加对WCF服务代理,以第(2)种方式实现。右键类库—》添加服务引用

    在地址里添加http://localhost:9876/WCFConsole/ServiceSHowMsg

     

    取名为:WcfInstance

     

    测试:

     

    [Test]

    public void Test2()

    {

        WcfInstance.ServiceShowMsgClient client = new UNTest.WcfInstance.ServiceShowMsgClient();

        client.SingleMsg("客户端请求");

    }

     

    输出结果:客户端(测试类库),无打印信息;服务端(控制台)打印信息:单工客户端请求

     

    Oneway 测试完成。

     

    WCF服务有变动时,要及时更新代理:在生成的代理类上右键—》更新服务引用

     

    (四)R/R方式实现(默认的方式)

    WCFIserviceShowMsg接口中添加方法:

    [OperationContract]

            string PrintMessage(string strMsg);

     

    并实现:

    public string PrintMessage(string strMsg)

            {

                Console.WriteLine(strMsg);

                return strMsg;

            }

    它带有返回值

     

    ·调用服务方法后需要等待服务的消息返回,即便该方法返回 void 类型

    ·相比Duplex来讲,这种模式强调的是客户端的被动接受,也就是说客户端接受到响应后,消息交换就结束了。

    ·在这种模式下,服务端永远是服务端,客户端就是客户端,职责分明。

    ·它是缺省的消息交换模式

     

    (五)控制台不变,客户端

    先更新服务引用

    public void Test1()

    {

      WcfInstance.ServiceShowMsgClient client = new UNTest.WcfInstance.ServiceShowMsgClient();

      Console.WriteLine(client.PrintMessage("这是信息内容!"));

    }

     

    输出结果:客户端(测试类库),这是信息内容!;服务端(控制台)打印信息:这是信息内容!

     

     

    (六)Duplex

    在服务端新建WCF服务IserviceDuplexShowMsg,并添加CallBack回调方法接口,代码为:

    [ServiceContract]

        public interface ICallBack

        {

            [OperationContract]

            void Done();

        }

     

        [ServiceContract(CallbackContract = typeof(ICallBack))]

        public interface IServiceDuplexShowMsg

        {

            [OperationContract]

            string DoMsg(string str);

        }

     

        [ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)]

        public class ServiceDuplexShowMsg : IServiceDuplexShowMsg

        {

            #region IServiceDuplexShowMsg 成员

            public string DoMsg(string str)

            {

                ICallBack callback = OperationContext.Current.GetCallbackChannel<ICallBack>();    

                Console.WriteLine("得到消息:"+str);

                callback.Done();

                return "成功";

            }

            #endregion

    }

     

    ·消息交换过程中,服务端和客户端角色会发生调换

    ·服务端处理完请求后,返回给客户端的不是reply,而是callback请求。

    (七)控制台Main修改

    Uri baseAddress = new Uri("http://localhost:9876/WCFConsole/ServiceDuplexShowMsg");

    ServiceHost selfHost = new ServiceHost(typeof(ServiceDuplexShowMsg), baseAddress);

    selfHost.AddServiceEndpoint(typeof(IServiceDuplexShowMsg),new WSDualHttpBinding(),

     "ServiceDuplexShowMsg");

    (八)启动控制台测试服务

    启动控制台,浏览地址:http://localhost:9876/WCFConsole/ServiceDuplexShowMsg是否正常

    (九)客户端

    客户端工作2个,

    一是与以前一样,新添加服务引用,取名:WCFDuplexInstance

    二是实现回调方法。

    这里给出实现方法,要实现IcallBack接口,这个接口是代理类中IcallBack接口

     

    public class MyCallback : WCFDuplexInstance.IServiceDuplexShowMsgCallback

        {

            #region IServiceDuplexShowMsgCallback 成员

            void UNTest.WCFDuplexInstance.IServiceDuplexShowMsgCallback.Done()

            {

                Console.WriteLine("服务器消息返回");

            }

            #endregion

        }

    (十)客户端测试

            public void Test3()

            {

                MyCallback callback = new MyCallback();

                WCFDuplexInstance.ServiceDuplexShowMsgClient client =

    new UNTest.WCFDuplexInstance.ServiceDuplexShowMsgClient(

    new System.ServiceModel.InstanceContext(callback));

                string result = client.DoMsg("duplex job");

            }

     

    测试结果:

    服务端:

    得到消息 duplex job

     

    客户端:

    服务器消息返回

    成功

  • 相关阅读:
    nginx
    DNS
    lrzsz上传下载命令
    linux命令大全20180614
    解决Nginx的connect() to 127.0.0.1:8080 failed (13: Permission denied) while connect
    安装nginx
    scp复制
    Vue3中报错“export ‘createWebHistory, createRouter‘ was not found in ‘vue-router‘
    点击div,span, p这些文本标签时隐藏光标的方法
    el-upload使用beforeUpload不生效
  • 原文地址:https://www.cnblogs.com/jams742003/p/1646001.html
Copyright © 2011-2022 走看看