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