2014-02-13 3 views
4

У меня есть решение с 3-х проектов:службы WCF относительный URI без .svc

  • (Service-реализация)
  • (Console Application MEProject.WCF.ServiceLayer MEProject.WCF.HostConsole, который может разместить службу)
  • MEProject.WCF.HostIIS (WCF Service Application)

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

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> 

Заранее спасибо за ваш ответ!

ответ

1

для запуска 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> 

source

0

Try 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> 
Смежные вопросы