目的用于测试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

 

客户端:

服务器消息返回

成功

posted on 2010-01-13 08:55  梅桦  阅读(1190)  评论(0编辑  收藏  举报