wcf - REST / SOAP endpoints for a WCF service

  显示原文与译文双语对照的内容

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

时间:

你可以在两个不同的端点中公开服务。 SOAP可以使用支持 SOAP 比如 basicHttpBinding的绑定,RESTful的用户可以使用 web webHttpBinding 。 具有以下行为configuration,其他我都假定你的服务将在 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 。 e.g.


public interface ITestService
{
 [OperationContract]
 [WebGet]
 string HelloWorld(string text)
}

注意,如果REST服务不是 JSON,那么操作的参数不能包含复杂类型。

对SOAP和rest式 POX(XML )的日志回复

对于纯XML作为返回格式,这对于SOAP和XML都是一个很好的例子。


[ServiceContract(Namespace ="http://test")]
public interface ITestService
{
 [OperationContract]
 [WebGet(UriTemplate ="accounts/{id}")]
 Account[] GetAccount(string id);
}

REST Plain普通旧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");

另一种方法是公开两个不同的服务契约,每个服务都有特定的配置。 这可能在代码级别产生一些重复,但是在一天结束时,你想让它工作。

这篇文章已经被"社区维基"一个很好的答案,我也推荐给看里克网络开始Strahl的博客,有很多很好的关于 WCF Rest就像这个

我使用这两种方法来获得 myservice-service 。 然后我可以使用来自jQuery的REST-interface或者来自Java的SOAP 。

这是来自我的Web.Config:


<system.serviceModel>
 <services>
 <service name="MyService" behaviorConfiguration="MyServiceBehavior">
 <endpoint name="rest" address="" binding="webHttpBinding" contract="MyService" behaviorConfiguration="restBehavior"/>
 <endpoint name="mex" address="mex" binding="mexHttpBinding" contract="MyService"/>
 <endpoint name="soap" address="soap" binding="basicHttpBinding" contract="MyService"/>
 </service>
 </services>
 <behaviors>
 <serviceBehaviors>
 <behavior name="MyServiceBehavior">
 <serviceMetadata httpGetEnabled="true"/>
 <serviceDebug includeExceptionDetailInFaults="true"/>
 </behavior>
 </serviceBehaviors>
 <endpointBehaviors>
 <behavior name="restBehavior">
 <webHttp/>
 </behavior>
 </endpointBehaviors>
 </behaviors>
</system.serviceModel>

这是我的service-class ( 。svc-codebehind,不需要接口):


///<summary> MyService documentation here ;) </summary>
[ServiceContract(Name ="MyService", Namespace ="http://myservice/", SessionMode = SessionMode.NotAllowed)]
//[ServiceKnownType(typeof (IList<MyDataContractTypes>))]
[ServiceBehavior(Name ="MyService", Namespace ="http://myservice/")]
public class MyService
{
 [OperationContract(Name ="MyResource1")]
 [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate ="MyXmlResource/{key}")]
 public string MyResource1(string key)
 {
 return"Test:" + key;
 }

 [OperationContract(Name ="MyResource2")]
 [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate ="MyJsonResource/{key}")]
 public string MyResource2(string key)
 {
 return"Test:" + key;
 }
}

实际上我只使用Json或者 Xml,但它们都是为了演示目的。 那些是用来获取数据的GET-requests 。 要插入数据,我将使用带有属性的方法:


[OperationContract(Name ="MyResourceSave")]
[WebInvoke(Method ="POST", ResponseFormat = WebMessageFormat.Json, UriTemplate ="MyJsonResource")]
public string MyResourceSave(string thing){
//...

如果你只想开发一个单独的web服务并将它的托管在许多不同的端点上( 例如 。 使用 XML,JSON,CSV,HTML outputes的SOAP + REST 。 也可以考虑使用 ServiceStack,我对建立开发正是这一点目的,其中的每一个服务所需在两台out-of-the-box肥皂和REST终结点上,会自动获得,不需要任何配置。

hello helloworld 示例演示如何使用( 不需要配置) 创建一个简单的服务:


public class Hello {
 public string Name { get; set; }
}

public class HelloResponse {
 public string Result { get; set; }
}

public class HelloService : IService
{
 public object Any(Hello request)
 {
 return new HelloResponse { Result ="Hello," + request.Name };
 }
}

不需要其他配置,并且这里服务可以立即使用:

它还带有in-built和友好的HTML输出 ( 当使用具有接受的HTTP客户端调用时:文本/HTML web e.g ),这样你就可以更好地可视化你的服务的输出。

1页面中 C# 处理不同休息作为微不足道的,下面是一个完整的词又 REST-service CRUD app:

MSDN现在似乎有一篇文章:

http://msdn.microsoft.com/en-us/library/bb412196(VS.100).aspx

简介:

默认情况下,Windows 通信基金会( WCF ) 使端点只对SOAP客户端可用。 在如何:创建基本的WCF Web HTTP服务中,可以向non-SOAP客户端提供一个端点。 有时,你可能希望使相同的协定同时可用,作为一个站点终结点和一个SOAP端点。 本主题演示如何执行这里操作。

...