Консолидация избыточных объявлений для полной службы WCF REST - PullRequest
0 голосов
/ 09 мая 2011

Я использую .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?

Примеры

Конечная точка справки REST WCF

образец WCF WSDL

1 Ответ

0 голосов
/ 09 мая 2011

Возможно, это проще сделать в файле 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>
...