WCF——消息格式(一)

简介: 目的用于测试WCF服务   准备工作两项。 (一)WCF服务 这部分包含WCF服务及其宿主,用于运行WCF服务。这部分新建立控制台应用程序。 (二)访问WCF服务的客户端 这部分用于测试申请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

 

客户端:

服务器消息返回

成功

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
Web App开发 JSON JavaScript
艾伟:WCF以Json格式返回对象,客户端以JS调用显示
很少写东西,但是看到别人写的文章自己又禁不住写点,写了有时候又觉得不好意思给大家看! 今天好不容易鼓起勇气写点…… 这几天看了一些WCF的资料 第一感觉是:这玩艺太深了 第二感觉是:这玩艺,挺麻烦的(光配置就搞不明白) 今天调了半天,好不容易把这个返回Json对象,在客户端展示的实例给整理出来了。
676 0
|
网络协议
|
SQL 存储 JSON
silverlight + wcf(json格式) + sqlserver存储过程分页
silverlight并没有提供现成的分页控件,百度了一圈,也没有发现aspx中好用的类似AspNetPager成熟控件,网上现有的一些分页代码,很多也是基于1.0版本的,silverlight2.0的并不多,自个儿琢磨了一下,发现自己弄一个也并非难事,思路和主要代码分享如下: 1.
958 0
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
62 0
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
93 0
|
C++
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
125 0
WCF基础教程(二)——解析iis8和iis8.5+VS2013发布wcf服务问题
WCF使用纯代码的方式进行服务寄宿
服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以以纯代码的方式实现服务的寄宿工作。
878 0