Я пытаюсь использовать службы WCF без расширения / .svc-less. Кто-нибудь еще может подтвердить или опровергнуть проблему, с которой я столкнулся?
Я использую маршрутизацию в коде и делаю это в 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 без расширения. Если я изменяю относительный адрес с Data.svc на Data, я получаю исключение конфигурации, поскольку это не поддерживается config. (Необходимо использовать расширение, зарегистрированное в WCF).
Я также пытался использовать этот код в сочетании с вышеуказанным конфигом:
RouteTable.Routes.MapPageRoute("","Data/{*data}","~/Data.svc/{*data}",false);
Я думаю, что могу просто указать URL без расширения на сконфигурированный URL .svc. Это не работает - /Data.svc продолжает работать, но / Data возвращает 404.
Я нашел обходной путь, если использовал urlMappings в конфигурации, как это, в сочетании с serviceActivation выше:
<urlMappings>
<add url="~/Data" mappedUrl="Data.svc"/>
</urlMappings>
Проблема с этим двоякая -
1. кажется запутанным
2. В сгенерированном WSDL конечные точки операции по-прежнему ссылаются на Data.svc /, а не на Data /, поэтому существует зависимость от Data.svc, фактически существующего / отвечающего.
Это не совсем то, чего я хочу, даже если это вроде / решает проблему.
Существует ли правильный способ получения URL-адресов служб WCF без расширения для правильной генерации WSDL?