Я пытаюсь использовать службы 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). Однако генерация метаданных полностью запутана. Я могу поразить конечную точку my/mex с помощью тестового клиента WCF (и я предполагаю svcutil.exe), но генерация? Wsdl, которую вы обычно получаете с .svc, - это тост. Я не могу ударить его с помощью браузера (получить 400 плохих запросов), я не могу ударить его с помощью wsdl.exe и т.д. Генерация метаданных настроена правильно в web.config.
Это, конечно, проблема, потому что сервис отображается как basicHttpBinding, так что клиент ASMX старого стиля может добраться до него. Но, конечно, клиент не может генерировать прокси без описания WSDL.
Если вместо этого я использую маршрутизацию serviceActivation в config, как это, вместо того, чтобы регистрировать маршрут в коде:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<serviceActivations>
<add relativeAddress="Data.svc" service="DataDips" />
</serviceActivations>
</serviceHostingEnvironment>
Затем вуаля... это работает.
Но тогда у меня нет чистого URL без расширения. Если я изменяю relativeAddress из Data.svc в Data, тогда я получаю исключение конфигурации, поскольку это не поддерживается конфигурацией. (Необходимо использовать расширение, зарегистрированное в WCF).
Я также попытался использовать этот код в сочетании с приведенной выше конфигурацией:
RouteTable.Routes.MapPageRoute("","Data/{*data}","~/Data.svc/{*data}",false);
Мое мышление заключается в том, что я могу просто указать URL без расширения на сконфигурированный URL-адрес .svc. Это не работает -/Data.svc продолжает работать, но /Data возвращает 404.
Я нашел обход, используя urlMappings в config, подобный этому, в сочетании с serviceActivation выше:
<urlMappings>
<add url="~/Data" mappedUrl="Data.svc"/>
</urlMappings>
Проблема с этим двоякая - 1. Кажется свернутым 2. В сгенерированном WSDL конечные точки операции по-прежнему относятся к Data.svc/, а не к Data/- поэтому зависимость от Data.svc фактически существует/отвечает.
Это не совсем то, что я хочу, даже если это kinda/sorta решает проблему.
Правильно ли вы используете URL-адреса службы WCF без расширения для правильного создания WSDL?