虽然在大多数情况下我不会混合使用 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)。