Служба WCF SOAP + REST / Json без .svc - у меня вдвое больше фабрик услуг? - PullRequest
2 голосов
/ 17 февраля 2012

Хорошо, поэтому я хотел, чтобы одна служба была представлена ​​как SOAP, а также как конечная точка REST (Json).Поскольку это не шаблон приложения службы WCF, у меня есть файл web.config, и я добавил следующее в ...

web.config

<configuration>
  ...
  <system.serviceModel>
    <services>
        <service name="MySvcClass">
            <endpoint address="" binding="webHttpBinding" contract="MySvcInterfaceClass" behaviorConfiguration="restBehavior" />
            <endpoint address="soap" binding="basicHttpBinding" contract="MySvcInterfaceClass" />
            <endpoint address="mex"  binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="restBehavior">
                <webHttp helpEnabled="true"/>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>
  </system.serviceModel>
  ...
</configuration>

Предполагая, что класс MySvcClass реализован в \ MySvcClass.svc, вышеуказанное предоставляет ...

Исходные конечные точки

localhost\MySvcClass.svc\ (конечная точка покоя)

localhost\MySvcClass.svc\mex (обмен метаданными с использованием конечной точки SOAP ниже)

localhost\MySvcClass.svc\soap (конечная точка мыла)

Пока все хорошо (я думаю!).

Тогда я хотел избавиться от уродливого ".svc", видимого в путях выше.Поэтому я следил за этим MSDN блогом и имел это в своем ...

global.asax

void Application_Start(object sender, EventArgs e)
{       
    RouteTable.Routes.Add(new ServiceRoute("MySvcClass", new WebServiceHostFactory(), typeof(MySvcClass)));
}

Интересно, когда я поставилточка останова внутри Application_Start, VS2010 не достигает этой конкретной точки останова - даже когда я останавливаюсь -> начинаю отладку или останавливаюсь -> запускаю пул приложений IIS.Bizarre!В любом случае, возвращаясь к точке, я теперь могу получить доступ к службам перечисленных выше конечных точек И

Чистых конечных точек

localhost\MySvcClass\ (конечная точка отдыха)

localhost\MySvcClass\mex (обмен метаданными с использованием конечной точки SOAP ниже)

localhost\MySvcClass\soap (конечная точка мыла)

Вопросы

  1. У меня есть две фабрики обслуживания?Один из web.config, а другой из global.asax?Если да, как я могу избежать этого, сохраняя чистые URL-адреса (без .svc).Мне на самом деле не нужны те, у которых в пути указан файл .svc ...
  2. Мне не нравится перегруженный web.configs, поэтому есть ли способ перенести вышеуказанную конфигурацию SOAP и REST из XML (web).config) в код (например, global.asax?)?Я знаю, как переместить только конечную точку REST - стереть в файле web.config, оставив global.asax без изменений.Однако это убивает конечную точку SOAP.

[Update] Я также пытался перезаписать URL-адрес, но это уничтожило конечную точку SOAP, сохранив живую конечную точку REST.То, что я сделал: использовал модуль URL Rewrite 2.0 от MS с этим в web.config

<system.webServer> 
  <modules runAllManagedModulesForAllRequests="true"/> 
  <rewrite> 
    <rules> 
      <rule name="RemoveSvcExt" stopProcessing="true"> 
        <match url="^MySvcClass(.*)$" /> 
        <action type="Rewrite" url="MySvcClass.svc{R:1}" /> 
      </rule> 
    </rules> 
  </rewrite> 
</system.webServer> 

Однако, это оставляет веб-приложение в некотором несовместимом состоянии, потому что есть некоторые части, которые все еще придерживаются .svc URL.Например: страница справки HTML в конечной точке службы показывает svcutil.exe http://localhost/MySvcClass.svc?wsdl Даже WSDL в чистом месте в http://localhost/MySvcClass?wsdl делает ссылки на http://localhost/MySvcClass.svc внутри него - это эффективно убивает конечную точку SOAP.

Вот почему яПодумайте ($ 0,02), переписать это просто клудж.Вздох, на данный момент я борюсь со структурой, чтобы сделать вещи.И он чувствует себя таким таймером ...

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

У меня есть проект REST, который предоставляется как сервисам REST, так и SOAP.Теперь я поместил файл .svc для службы SOAP, к которой некоторые клиенты обращаются.

На приведенном ниже снимке экрана показана структура папок моего проекта, конфигурация маршрута в global.asax, вывод, доступ к службе отдыха и доступфайл .svc (сервис SOAP).Чтобы удалить расширение .svc, используйте модуль перезаписи URL.

sample screenshot

Найдите мой web.Config (мое приложение размещено на IIS):

web.config

Пожалуйста, найдите мой класс, который реализует мой интерфейс ISampleService:

class

0 голосов
/ 17 февраля 2012

Для сервисов без .svc поиск файлов без активаций в wcf http://www.a2zdotnet.com/View.aspx?Id=188

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...