Хотя в большинстве случаев я бы не совмещал конечные точки REST и SOAP, но я согласен, что в некоторых случаях это необходимо.Ответ на вопрос: да, их можно смешивать.Вы можете использовать две опции:
Вызов в Global.asax.cs, который определяет маршрут для конечной точки REST
`RouteTable.Routes.Add(new ServiceRoute("Service1", new WebServiceHostFactory(), typeof(Service1)))`
, определяет, по существу, службу по адресу / Service1.Вы можете добавить новый «сервис», используя ту же реализацию сервиса, но используя другую фабрику хостов сервиса (вместо использования WebServiceHostFactory, которая определяет конечную точку REST, вы бы использовали свою собственную):
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).