在现代的软件开发中,服务的灵活性和可扩展性是至关重要的。WCF(Windows Communication Foundation)提供了一种机制,允许开发者根据需要为服务配置不同的绑定。不同的绑定可以支持不同的通信协议和数据格式,使得同一个服务可以被不同平台和应用程序所使用。本文将介绍如何在同一个WCF服务中实现多种协议绑定,包括基本HTTP绑定、WS-*协议和REST协议,以及如何在客户端应用程序中使用这些绑定。
假设有一个组织“ABC”开发了一个WCF服务。现在,另一个组织“X”正在开发一个Silverlight应用程序,并且想要使用这个服务。因此,组织“ABC”配置了WCF服务,使用基本HTTP绑定以便在Silverlight应用程序中使用。几天后,另一个组织“Y”正在开发一个ASP.NET Web应用程序,并且想要使用WS-*协议来使用这个服务。于是,组织“ABC”引入了wsHttp绑定以满足ASP.NET应用程序的需求。再然后,组织“Z”正在开发一个基于JAVA的Web应用程序,并且想要以REST方式使用这个服务,他们希望服务的响应不是以典型的XML格式,而是以JSON格式。组织“ABC”通过引入新的webHttp绑定来满足这个需求。
为了实现上述概念,将开发一个简单的WCF服务项目。这个WCF服务有一个单一的方法GetData()。
打开web.config文件并检查ServiceModel元素。如果没有在配置文件中定义绑定,WCF默认会暴露基本HTTP绑定。一旦想要暴露多个绑定,需要在配置文件中明确定义基本HTTP绑定。以下是定义基本HTTP绑定的示例:
<system.serviceModel>
<services>
<service name="YourNamespace.YourService">
<endpoint address="" binding="basicHttpBinding" contract="YourNamespace.IServiceContract" />
</service>
</services>
</system.serviceModel>
为了引入wsHttp绑定,需要在web.config文件中添加以下条目:
<system.serviceModel>
<services>
<service name="YourNamespace.YourService">
<endpoint address="" binding="wsHttpBinding" contract="YourNamespace.IServiceContract" />
</service>
</services>
</system.serviceModel>
为了以REST方式使用WCF服务,首先需要在服务接口定义中引入一些属性。在REST中,可以通过查询字符串传递服务方法的参数值,并生成GET、POST、PUT、DELETE请求。这里,服务将通过HTTP GET请求被调用。此外,响应表示将采用JSON格式。打开IMyService.cs文件,并使用WebGet属性和UriTemplate属性标记接口IMyService,如下所示:
[ServiceContract]
public interface IMyService
{
[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "data/{param}")]
string GetData(string param);
}
现在,需要引入一个端点,以便以REST方式使用服务。为此,需要定义一个带有webHttp绑定的端点行为,然后使用它作为绑定的端点行为。以下是修改web.config文件的示例:
<system.serviceModel>
<services>
<service name="YourNamespace.YourService">
<endpoint address="" binding="webHttpBinding" contract="YourNamespace.IServiceContract" behaviorConfiguration="webBehavior" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
添加一个Windows Forms应用程序项目,并在表单上添加三个按钮。每个按钮点击将使用不同的绑定调用服务。右键单击引用->添加服务引用。点击发现或在地址框中输入服务URL。
一旦点击确定,将生成存根代码。打开Form1.cs并添加以下命名空间:
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Channels;
实现以下代码以在表单按钮中使用基本HTTP绑定调用服务:
private void btnBasicHttp_Click(object sender, EventArgs e)
{
BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress address = new EndpointAddress("http://localhost:8733/Design_Time_Addresses/YourService/YourService/");
ChannelFactory factory = new ChannelFactory(binding, address);
IMyService service = factory.CreateChannel();
string result = service.GetData("some data");
MessageBox.Show(result);
}
实现以下代码以在表单按钮中使用wsHttp绑定调用服务:
private void btnWsHttp_Click(object sender, EventArgs e)
{
wsHttpBinding binding = new wsHttpBinding();
EndpointAddress address = new EndpointAddress("http://localhost:8733/Design_Time_Addresses/YourService/YourServiceWsHttp/");
ChannelFactory factory = new ChannelFactory(binding, address);
IMyService service = factory.CreateChannel();
string result = service.GetData("some data");
MessageBox.Show(result);
}
可以以多种方式调用REST WCF服务,例如使用HTML表单中的get方法或使用XMLHttpRequest。这里使用WCF代理调用它。添加以下两个引用:
using System.Net;
using System.IO;
实现以下代码以在表单按钮中使用web绑定调用服务:
private void btnWebHttp_Click(object sender, EventArgs e)
{
WebClient client = new WebClient();
string result = client.DownloadString("http://localhost:8733/Design_Time_Addresses/YourService/YourServiceWebHttp/data/some%20data");
MessageBox.Show(result);
}