Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Ничего себе, я чувствую себя глупым.

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

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

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

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

Слишком плохо, что я потратил столько времени на это. Это был случай, когда я использовал WebServiceHostFactory, но на странице factory в MSDN не было отказано в сокращенной функциональности. (Я бы сказал, что удаление WSDL имеет смысл, но удаление страниц справки не так просто, как они могли просто предоставить атрибут в config для переименования страницы "Справка", если есть операция REST с этим именем... sigh).

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

Ответ 2

У меня такая же проблема. Ваше решение работает над моим кодом. Я просто изменил 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>