Консолидация избыточных объявлений для полной службы WCF REST
Я использую.NET 4 WCF для предоставления следующего полного веб-сервиса REST
[OperationContract]
[WebGet]
void Test();
Поскольку это программа, ориентированная на разработчиков, я хочу поддерживать разработчиков HTTP, полных REST, а также разработчиков, которым нравится использовать WSDL. Мой подход состоит в том, чтобы дважды объявить службу, чтобы предоставить как традиционный WSDL, так и конечную точку REST:
Web.config
<serviceHostingEnvironment aspNetCompatibilityEnabled="True" multipleSiteBindingsEnabled="true" >
<serviceActivations >
<add relativeAddress ="~/KeyService.svc" service="SecretDistroMVC3.Services.KeyService3"/>
</serviceActivations>
</serviceHostingEnvironment>
Global.asax
void Application_Start(object sender, EventArgs e)
{
// The following enables the WCF REST endpoint
//ASP.NET routing integration feature requires ASP.NET compatibility. Please see
// 'http://msdn.microsoft.com/en-us/library/ms731336.aspx
RouteTable.Routes.Add(new ServiceRoute("KeyService3", new WebServiceHostFactory(), typeof(KeyService3)));
Вопрос
Так как мне не нравится объявлять службу в двух местах, как мне настроить обе конечные точки в конфигурации или обе конечные точки в Application_Start
?
Примеры
1 ответ
Вероятно, проще сделать это в файле web.config, чем по коду. Вы можете настроить свой сервис в соответствии с частичной конфигурацией, показанной ниже. Я обычно разделяю реализацию службы и пространства имен интерфейса WSDL & REST, чтобы облегчить понимание конфигурации, но это необязательно. Имена конфигурации привязки и поведения приведены просто для ясности, чтобы показать, как можно настроить их по мере необходимости в их соответствующих элементах serviceModel.
Поскольку вы не хотите, чтобы маршрутизация URL-адреса ASP.NET влияла на версию службы WSDL, я установил ее базовый адрес как нечто вроде.../Wsdl/KeyService3.svc в своей конечной точке.
<service name="YourNamespace.Impl.KeyService3" behaviorConfiguration="yourServiceBehaviorSettings">
<!-- Service Endpoints -->
<endpoint address="Wsdl"
binding="wsHttpBinding"
bindingConfiguration="Http"
contract="YourNamespace.Wsdl.IKeyService3" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"/>
<endpoint address="Services"
behaviorConfiguration="webBehavior"
binding="webHttpBinding"
name="webHttp"
contract="YourNamespace.IKeyService3"
listenUriMode="Explicit" />
</service>