WCF服务的REST / SOAP端点

我有一个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>

所以,该服务将在

  • http://www.example.com/soap
  • http://www.example.com/json
  • 将[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 Plain Old 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>
    

    服务将在

  • http://www.example.com/soap
  • http://www.example.com/xml
  • 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");
    

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


    这篇文章已经得到了“社区wiki”的非常好的回答,我也推荐看看Rick Strahl的网络博客,关于WCF Rest有很多好的帖子,像这样。

    我使用这两种方法来获取这种MyService-service ...然后我可以使用jQuery中的REST接口或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>
    

    这是我的服务级别(.svc代码隐藏,无需接口):

        /// <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请求。 要插入数据,我会使用具有属性的方法:

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

    如果您只想开发单个Web服务并将其托管在许多不同的端点(即SOAP + REST,带有XML,JSON,CSV和HTML输出)上。 您还应该考虑使用我为此构建的ServiceStack ,其中开发的每个服务都可以在SOAP和REST端点上自动使用,而无需进行任何配置。

    Hello World示例显示了如何使用just(仅需要配置)创建一个简单的服务:

    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 };
        }
    }
    

    没有其他配置是必需的,并且此服务立即可用于REST中:

  • 肥皂
  • XML
  • JSON
  • HTML
  • 它还内置了友好的HTML输出(当使用具有Accept:text / html(例如浏览器)的HTTP客户端进行调用时),以便更好地可视化您的服务输出。

    处理不同的REST动词也是微不足道的,这是一个完整的REST服务CRUD应用程序,在1页C#中(比配置WCF所用的要少):

  • 前端TODO应用程序
  • 后端REST服务实施
  • 链接地址: http://www.djcxy.com/p/12335.html

    上一篇: REST / SOAP endpoints for a WCF service

    下一篇: JavaScript: Learning how to "consume RESTful APIs"