ServiceRoute + WebServiceHostFactory убивает генерацию WSDL?Как создать службу без расширений WCF с помощью? Wsdl - PullRequest
21 голосов
/ 27 мая 2010

Я пытаюсь использовать службы 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?

Ответы [ 2 ]

36 голосов
/ 27 мая 2010

Ух ты, я чувствую себя глупым?

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

Как только я вернулся к коду из конфигурации ... и переключился на эту строку кода:

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

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

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

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

0 голосов
/ 09 декабря 2013

У меня та же проблема. Ваше решение работает на моем коде. Я просто изменил Global.asax так:

<%@ Application Language="C#" %>
<%@ Import Namespace="System.Web.Routing" %>
<%@ Import Namespace="System.ServiceModel.Activation" %>
<%@ Import Namespace="System.ServiceModel.Web " %>

<script RunAt="server">
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
    }

    private void RegisterRoutes(RouteCollection routes)
    {
        routes.Add(new ServiceRoute("URLWithoutSVC", new WebServiceHostFactory(), typeof(Service))); 
   }
</script>

Для

<%@ Application Language="C#" %>
<%@ Import Namespace="System.Web.Routing" %>
<%@ Import Namespace="System.ServiceModel.Activation" %>
<%@ Import Namespace="System.ServiceModel.Web " %>

<script RunAt="server">
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
    }

    private void RegisterRoutes(RouteCollection routes)
    {
        routes.Add(new ServiceRoute("URLWithoutSVC", new ServiceHostFactory(), typeof(Service))); 
   }
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...