簡體   English   中英

WCF 4 - Soap和REST端點

[英]WCF 4 - Soap and REST endpoints

我正在考慮使用WCF REST服務應用程序模板來托管我的所有RESTful Web服務,但是,我也希望能夠使用SOAP端點公開我的WCF服務。

我可以使用以下示例輕松地在WCF 4中使用WCF RESTful服務: http//christopherdeweese.com/blog2/post/drop-the-soap-wcf-rest-and-pretty-uris-in-net-4

這可能嗎? 我想在Global.asax中應該有一種方法可以連接其他端點並指定是否使用了basicHttpBinding。 我是否需要不使用WCF REST服務應用程序模板並創建標准服務應用程序並通過配置將其連接起來?

謝謝你的幫助。

雖然在大多數情況下我不會混用REST和SOAP端點,但我同意在某些情況下它是必要的。 這個問題的答案是:是的,可以將它們混合起來。 您可以使用兩個選項:

Global.asax.cs中的調用,它定義了REST端點的路由

`RouteTable.Routes.Add(new ServiceRoute("Service1", new WebServiceHostFactory(),   typeof(Service1)))` 

在地址/ Service1本質上定義了一個服務。 您可以使用相同的服務實現添加新的“服務”,但使用不同的服務主機工廠(而不是使用定義REST端點的WebServiceHostFactory,您可以使用自己的):

public class SoapServiceHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
        ServiceMetadataBehavior smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
        if (smb == null)
        {
            smb = new ServiceMetadataBehavior();
            host.Description.Behaviors.Add(smb);
        }

        smb.HttpGetEnabled = true;
        host.AddServiceEndpoint(serviceType, new BasicHttpBinding(), "soap");
        return host;
    }
}

在global.asax.cs中,RegisterRoutes:

    private void RegisterRoutes()
    {
        // Edit the base address of Service1 by replacing the "Service1" string below
        RouteTable.Routes.Add(new ServiceRoute("Service1", new WebServiceHostFactory(), typeof(Service1)));

        RouteTable.Routes.Add(new ServiceRoute("SoapService", new SoapServiceHostFactory(), typeof(Service1)));
    }
  • 如果你真的想要一個帶有兩個端點的“邏輯”服務(我不建議,因為前面的方法很簡單),你可以再次創建一個自定義的ServiceHostFactory,然后在那個工廠你要添加兩個端點:一個用於REST(使用WebHttpBinding / WebHttpBehavior),一個用於SOAP(例如,使用BasicHttpBinding)。

我不得不在carlosfigueira的工廠添加一個構造函數,所以它從接口而不是服務本身構建端點:

public class SoapServiceHostFactory : ServiceHostFactory
{
    private Type serviceInterfaceType;

    public SoapServiceHostFactory(Type serviceInterfaceType) 
    {
        this.serviceInterfaceType = serviceInterfaceType;
    }

    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
        host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
        host.AddServiceEndpoint(serviceInterfaceType, new BasicHttpBinding(), "soap");
        return host;
    }
}

我有一個運行Web服務,客戶端需要SOAP和REST訪問。 您可以使用WebGet和WebInvoke屬性定義REST URL模板。

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
    RS DoSomething(RQ request); 
}

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service : IService
{
    public RS DoSomething(RQ rq)
    {
        return new RS(rq);
    }
}

然后只需在配置中根據需要映射端點

  <system.serviceModel>
    <services>
      <service name="Service" behaviorConfiguration="defaultBehavior">
        <endpoint address="soap11" binding="basicHttpBinding" contract="IService" behaviorConfiguration="soapBehavior" />
        <endpoint address="rest" binding="webHttpBinding" contract="IService" behaviorConfiguration="restBehavior"/>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="restBehavior">
          <webHttp faultExceptionEnabled="true" />
        </behavior>
        <behavior name="soapBehavior">
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="defaultBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"  />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM