我有一个 WCF 服务,我想将它作为 RESTfull 服务和 SOAP 服务公开。以前有人做过这样的事情吗?
您可以在两个不同的端点中公开服务。SOAP 可以使用支持 SOAP 的绑定,例如 basicHttpBinding,RESTful 可以使用 webHttpBinding。我假设您的 REST 服务将采用 JSON 格式,在这种情况下,您需要使用以下行为配置来配置两个端点
<endpointBehaviors> <behavior name="jsonBehavior"> <enableWebScript/> </behavior> </endpointBehaviors>
您的场景中的端点配置示例是
<services> <service name="TestService"> <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/> <endpoint address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="ITestService"/> </service> </services>
因此,该服务将在
将 [WebGet] 应用于操作合约,使其成为 RESTful。例如
public interface ITestService { [OperationContract] [WebGet] string HelloWorld(string text) }
注意,如果 REST 服务不是 JSON 格式,则操作的参数不能包含复杂类型。
对于作为返回格式的普通旧 XML,这是一个适用于 SOAP 和 XML 的示例。
[ServiceContract(Namespace = "http://test")] public interface ITestService { [OperationContract] [WebGet(UriTemplate = "accounts/{id}")] Account[] GetAccount(string id); }
*REST普通旧 XML *的 POX 行为
<behavior name="poxBehavior"> <webHttp/> </behavior>
端点
<services> <service name="TestService"> <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/> <endpoint address="xml" binding="webHttpBinding" behaviorConfiguration="poxBehavior" contract="ITestService"/> </service> </services>
服务将在
REST 请求 在浏览器中尝试,
http://www.example.com/xml/accounts/A123
*添加服务引用后 SOAP 服务的 *SOAP 请求客户端端点配置,
<client> <endpoint address="http://www.example.com/soap" binding="basicHttpBinding" contract="ITestService" name="BasicHttpBinding_ITestService" /> </client>
在 C# 中
TestServiceClient client = new TestServiceClient(); client.GetAccount("A123");
另一种方法是公开两个不同的服务合同,每个服务合同都有特定的配置。这可能会在代码级别生成一些重复项,但是在一天结束时,您希望使其正常工作。