Как я могу разместить службу WCF без файла SVC в IIS

#asp.net #web-services #wcf #rest #soap

#asp.net #веб-службы #wcf #rest #soap

Вопрос:

Я хотел бы развернуть службу WCF с двойным интерфейсом (SOAP / REST / XML / JSON) в IIS только с файлом конфигурации и двоичными файлами и без файла svc в URL

Мы используем VS2012 и .Net 4.5

У нас работает что-то подобное, я следовал руководству здесь: http://blogs.msdn.com/b/rjacobs/archive/2010/04/05/using-system-web-routing-with-data-services-odata.aspx

Я добавил глобальный класс с

 public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes();
    }

    private void RegisterRoutes()
    {
        DataServiceHostFactory factory = new DataServiceHostFactory();
        RouteTable.Routes.Add(new ServiceRoute("wrap", factory, typeof(NeOtheWrapper)));
    }
}
  

И я использовал свой существующий web.config, который определяет все конечные точки:

 <system.serviceModel>
    <!-- Clients -->
    <client>
      <endpoint name="MySoftLive" address="https://backof.somewebsitett.com/Cmp.MySoft.bl/MySoft.svc" binding="basicHttpsBinding" bindingConfiguration="soapSecureBindingConfig" contract="Cmp.MySoft.BL.WCF.MySoftInterface" />
      <endpoint name="MySoftTest" address="http://localhost:49957/MySoft.svc"                         binding="basicHttpBinding"  bindingConfiguration="soapBindingConfig"       contract="Cmp.MySoft.BL.WCF.MySoftInterface" />
    </client>
    <!-- Services -->
    <services>
      <service name="Cmp.MySoft.BL.NeOthe.NeOtheWrapper">
        <endpoint name="rest"       address="rest" behaviorConfiguration="restEndpointBehaviour" binding="webHttpBinding"    bindingConfiguration="restBindingConfig"       contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
        <endpoint name="restSecure" address="rest" behaviorConfiguration="restEndpointBehaviour" binding="webHttpBinding"    bindingConfiguration="restSecureBindingConfig" contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
        <endpoint name="mex"        address="mex"  behaviorConfiguration=""                      binding="mexHttpBinding"    bindingConfiguration="mexBindingConfig"        contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
        <endpoint name="mexSecure"  address="mex"  behaviorConfiguration=""                      binding="mexHttpsBinding"   bindingConfiguration="mexSecureBindingConfig"  contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
        <endpoint name="soap"       address="soap" behaviorConfiguration=""                      binding="basicHttpBinding"  bindingConfiguration="soapBindingConfig"       contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
        <endpoint name="soapSecure" address="soap" behaviorConfiguration=""                      binding="basicHttpsBinding" bindingConfiguration="soapSecureBindingConfig" contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
      </service>
    </services>
    <!--  Binding Configurations -->
    <bindings>
      <webHttpBinding>
        <binding name="restBindingConfig">
          <security mode="None"/>
        </binding>
        <binding name="restSecureBindingConfig">
          <security mode="Transport"/>
        </binding>
      </webHttpBinding>
      <mexHttpBinding>
        <binding name="mexBindingConfig"/>
      </mexHttpBinding>
      <mexHttpsBinding>
        <binding name="mexSecureBindingConfig"/>
      </mexHttpsBinding>
      <basicHttpsBinding>
        <binding name="soapSecureBindingConfig">
          <security mode="Transport"/>
        </binding>
      </basicHttpsBinding>
      <basicHttpBinding>
        <binding name="soapBindingConfig">
          <security mode="None"/>
        </binding>
      </basicHttpBinding>
    </bindings>
    <!-- Behaviour Configurations -->
    <behaviors>
      <endpointBehaviors>
        <behavior name="restEndpointBehaviour">
          <webHttp helpEnabled="true" defaultBodyStyle="Bare" defaultOutgoingResponseFormat="Json" automaticFormatSelectionEnabled="true" faultExceptionEnabled="true" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!-- Hosting Environment Settings -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  </system.serviceModel>
  

Он компилируется, запускается, и если я перейду к http://mypc:12345/wrap/rest/help , я получу автоматически сгенерированный ASP.NET Страница справки REST.

Но, если я перейду к http://mypc:12345/wrap/soap/ , я получу 400 неверных запросов.

Я не могу добавить к этому суффикс с?wsdl, чтобы получить wsdl, или передать URL в svcutil (soap xml не ожидается)

Я надеялся, что .Появится страница держателя мыла SVC, такая же, как / help для REST.

Если я перейду к файлу .svc (он находится на том же уровне, что и / wrap), который работает, и служба soap работает, как и публикация метаданных.

Я использую неправильный URL или моя конфигурация неправильная?

Ответ №1:

Если вы используете WCF 4.0 или более поздней версии, вы можете использовать активацию «без файлов». Добавьте что-то вроде следующего для настройки вашего файла:

 <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
  <serviceActivations>
    <add factory="System.ServiceModel.Activation.ServiceHostFactory" 
         relativeAddress="Soap.svc" 
         service="Cmp.MySoft.BL.NeOthe.NeOtheWrapper" />
  </serviceActivations>
</serviceHostingEnvironment>
  

Это позволяет размещать службу WCF без физического файла .svc. relativeAddress относится к базовому адресу сайта, и вам нужно будет создать приложение IIS как обычно.

Смотрите раздел «Активация без файлов» во введении разработчика к Windows Communication Foundation 4 для получения дополнительной информации.

Комментарии:

1. К сожалению, хотя это позволяет активировать без файла, относительный адрес должен заканчиваться на .svc . Оказывается, решение менялось DataServiceHostFactory на ServiceHostFactory . DataServiceHostFactory предназначен для служб OData, для чего и был создан блог, который я читал.