Относительный URI службы WCF без .svc

У меня есть решение с 3 проектами:

  • MEProject.WCF.ServiceLayer (услуга-реализация)
  • MEProject.WCF.HostConsole (консольное приложение, в котором может размещаться служба)
  • MEProject.WCF.HostIIS (приложение службы WCF)

Моя цель состоит в том, чтобы я мог переключаться между двумя проектами, не меняя uri (конфигурации конечной точки) в клиентском проекте. Что ж, проблема в том, что если я запускаю консольное приложение, конечные точки

http://localhost:8080/MultipleEndpointService/FirstEndpoint
http://localhost:8080/MultipleEndpointService/SecondEndpoint  

Но если я запустил приложение-службу WCF, конечные точки будут

http://localhost:8080/MultipleEndpointService.svc/FirstEndpoint
http://localhost:8080/MultipleEndpointService.svc/SecondEndpoint

Как видите, разница в «.svc». Теперь мой вопрос: как я могу сказать приложению службы WCF действовать как консольное приложение и не иметь ".svc" в uri?

Вот код, который я использую для получения нескольких конечных точек в консольном приложении:

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
    serviceHostBase.ChannelDispatchers.ToList().ForEach(channelDispatcher =>
    {
        ChannelDispatcher dispatcher = channelDispatcher as ChannelDispatcher;
        if (dispatcher != null)
        {
            dispatcher.Endpoints.ToList().ForEach(endpoint =>
            {
                endpoint.DispatchRuntime.InstanceProvider = new CallBackInstanceProvider(serviceDescription.ServiceType, InstanceCreator);
            });
        }
    });
}

А вот и приложение-служба WCF web.config:

<system.serviceModel>
<services>
  <service name="MEProject.Service.WCF.HostIIS.MultipleEndpointService">
    <endpoint name="FirstEndpoint" address="FirstEndpoint" binding="basicHttpBinding" contract="MEProject.Service.WCF.ServiceLayer.IFirstEndpoint"/>
    <endpoint name="SecondEndpoint" address="SecondEndpoint" binding="basicHttpBinding" contract="MEProject.Service.WCF.ServiceLayer.ISecondEndpoint"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8080/MultipleEndpointService" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>

Заранее благодарим за ответ!


person Davatar    schedule 13.02.2014    source источник


Ответы (2)


для запуска WCF без расширения SVC вам нужно будет использовать маршрутизацию

например, у меня есть служба с именем MultipleEndpointService.svc, и я хочу получить такую ​​услугу, как следующая: ... / MultipleEndpointService / FirstEndpoint

мы можем сделать это так: Global.asax:

public class Global : System.Web.HttpApplication
{

    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.Add(new ServiceRoute("MultipleEndpointService/FirstEndpoint", new ServiceHostFactory(), typeof(MultipleEndpointService)));            

    }
}

MultipleEndpointService.svc.cs:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MultipleEndpointService : IMultipleEndpointService
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }

    public CompositeType GetDataUsingDataContract(CompositeType composite)
    {
        if (composite == null)
        {
            throw new ArgumentNullException("composite");
        }
        if (composite.BoolValue)
        {
            composite.StringValue += "Suffix";
        }
        return composite;
    }
}

Web.config (для IIS7):

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>

    <handlers>
        <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd"/>
    </handlers>             

    <directoryBrowse enabled="true"/>
</system.webServer>

источник

person ahaliav fox    schedule 13.02.2014

Попробуйте перезапись URL:

<system.webServer>
    <!-- Other stuff here -->
    <rewrite>
        <rules>
            <!-- Rewrite requests to /MultipleEndpointService.svc to /MultipleEndpointService -->
            <rule name="MultipleEndpointService" stopProcessing="true">
                <match url="MultipleEndpointService.svc(.*)" />
                <conditions logicalGrouping="MatchAll">
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                </conditions>
                <action type="Rewrite" url="/MultipleEndpointService{R:1}" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>
person Aarifmohammad Mansuri    schedule 03.07.2015