目的用于测试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中添加协定(契约Contract)IsOneWay=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方式实现(默认的方式)
WCF的IserviceShowMsg接口中添加方法:
[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
客户端:
服务器消息返回
成功