Хорошо, поэтому я хотел, чтобы одна служба была представлена как 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
(конечная точка мыла)
Вопросы
- У меня есть две фабрики обслуживания?Один из web.config, а другой из global.asax?Если да, как я могу избежать этого, сохраняя чистые URL-адреса (без .svc).Мне на самом деле не нужны те, у которых в пути указан файл .svc ...
- Мне не нравится перегруженный 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), переписать это просто клудж.Вздох, на данный момент я борюсь со структурой, чтобы сделать вещи.И он чувствует себя таким таймером ...