Я пытаюсь использовать расширение меньше / .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 правильно?
Вау, я чувствую себя тупым.
Я должен был разместить свой сервис с помощью 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