ServiceRoute + WebServiceHostFactory уничтожает поколение WSDL? Как создать сервис WCF без расширения с? wsdl

Я пытаюсь использовать расширение меньше / .svc-меньше сервисов WCF. Кто-либо еще может подтвердить или отклонить проблему, которую я испытываю?

Я использую маршрутизацию в коде и делаю это в Application_Start global.asax.cs:

RouteTable.Routes.Add(new ServiceRoute("Data", new WebServiceHostFactory(), typeof(DataDips)));

Я протестировал и в IIS 6 и в IIS 7.5, и я могу использовать сервис очень хорошо (т.е. на мой дополнительный меньше подстановочный знак, отображающий конфигурацию обработчика, правильно указывают на ASP.NET). Однако поколение метаданных полностью завинчено. Я могу поразить свою/mex конечную точку Тестовым Клиентом WCF (и я предполагаю svcutil.exe) - но? поколение wsdl, которое Вы обычно получаете с .svc, является тостом. Я не могу совершить нападки, это с браузером (получите 400 плохих запросов), я не могу поразить его wsdl.exe и т.д. Поколение метаданных настроено правильно в web.config.

Это - проблема, конечно, потому что сервис подвергается как basicHttpBinding так, чтобы старый стиль клиент ASMX мог добраться до него. Но конечно, клиент не может генерировать прокси без описания WSDL.

Если я вместо этого использую serviceActivation, направляющий в конфигурации как это, вместо того, чтобы регистрировать маршрут в коде:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
  <serviceActivations>
    <add relativeAddress="Data.svc" service="DataDips" />
  </serviceActivations>
</serviceHostingEnvironment>

Затем вуаля... работает.

Но затем у меня нет чистого URL без расширения. Если я изменяю relativeAddress от Data.svc до Данных, то я получаю исключение конфигурации, поскольку это не поддерживается конфигурацией. (Должен использовать расширение, зарегистрированное для WCF).

Я также попытался использовать этот код в сочетании с вышеупомянутой конфигурацией:

RouteTable.Routes.MapPageRoute("","Data/{*data}","~/Data.svc/{*data}",false);

Мои взгляды состоят в том, что я могу просто указать на URL без расширения на настроенный .svc URL. Это не работает-/Data.svc продолжает работать, но Данные / возвращают 404.

Я действительно находил обходное решение при использовании urlMappings в конфигурации как это, в сочетании с serviceActivation выше:

<urlMappings>
   <add url="~/Data" mappedUrl="Data.svc"/>
</urlMappings>

Проблема с этим является двукратной - 1. Это кажется замысловатым 2. В сгенерированном WSDL операционные конечные точки все еще относятся к Data.svc/, а не Данные / - поэтому существует зависимость от Data.svc, на самом деле существующего / ответ.

Это не действительно, что я хочу, даже если это отчасти / вид решает проблему.

Существует ли надлежащий способ заставить дополнительные меньше сервисные URL WCF генерировать WSDL правильно?

21
задан Martin Konecny 8 January 2015 в 03:09
поделиться

1 ответ

Вау, я чувствую себя тупым.

Я должен был разместить свой сервис с помощью ServiceHostFactory, НЕ WebServiceHostFactory.

Как только я вернулся в код из config... и перешел к этой строке кода:

RouteTable.Routes.Add(new ServiceRoute("Data", new ServiceHostFactory(), typeof(DataDips)));

Я был в деле с URL без расширения, обслуживающим WSDL и страницы помощи.

Жаль, что я потратил на это столько времени. То, что я использовал WebServiceHostFactory, было случайностью, но на странице фабрики в MSDN нет предупреждения об урезанной функциональности. (Я бы сказал, что удаление WSDL имеет смысл, но удаление страниц справки - нет, поскольку они могут просто предоставить атрибут в конфигурации для переименования страницы 'Help', если будет REST-операция с таким именем... вздох).

В документации WebServiceHost есть примечание. http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webservicehost.aspx

36
ответ дан 29 November 2019 в 20:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: