小编典典

WCF 服务的 REST / SOAP 端点

all

我有一个 WCF 服务,我想将它作为 RESTfull 服务和 SOAP 服务公开。以前有人做过这样的事情吗?


阅读 91

收藏
2022-03-21

共1个答案

小编典典

您可以在两个不同的端点中公开服务。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 格式,则操作的参数不能包含复杂类型。

回复 SOAP 和 RESTful POX(XML) 的帖子

对于作为返回格式的普通旧 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");

另一种方法是公开两个不同的服务合同,每个服务合同都有特定的配置。这可能会在代码级别生成一些重复项,但是在一天结束时,您希望使其正常工作。

2022-03-21