WCF 4 - Soap和REST端点

Bra*_*don 8 .net c# wcf soap

我正在考虑使用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服务应用程序模板并创建标准服务应用程序并通过配置将其连接起来?

谢谢你的帮助.

car*_*ira 6

虽然在大多数情况下我不会混用REST和SOAP端点,但我同意在某些情况下它是必要的.这个问题的答案是:是的,可以将它们混合起来.您可以使用两个选项:

Global.asax.cs中的调用,它定义了REST端点的路由

`RouteTable.Routes.Add(new ServiceRoute("Service1", new WebServiceHostFactory(),   typeof(Service1)))` 
Run Code Online (Sandbox Code Playgroud)

在地址/ 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在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)));
    }
Run Code Online (Sandbox Code Playgroud)
  • 如果你真的想要一个带有两个端点的"逻辑"服务(我不建议,因为前面的方法很简单),你可以再次创建一个自定义的ServiceHostFactory,然后在那个工厂你要添加两个端点:一个用于REST(使用WebHttpBinding/WebHttpBehavior),一个用于SOAP(例如,使用BasicHttpBinding).