2014-02-28 48 views
1

我已经得到了其在根文件夹一个WCF服务的简单的Web应用程序:重新定位WCF服务端点?

+AppRoot 
---MyService.svc 

这已被修改为包括了很多新的功能,而且我这分成两个独立的服务在不同的文件夹来表示他们的版本:

+AppRoot 
---v1 
-----MyService.svc 
---v2 
-----MyService.svc 

然而,这种服务的现有消费者仍然使用V1需要能够访问V1服务旧的URL - 例如。 http://services.example.com/MyService.svc

我想保持这些服务在它们各自的v1和v2文件夹中保持物理隔离,同时透明地将试图访问旧URL的客户端路由到v1服务(而不是在根目录中有v1,在它自己的文件夹中有v2 )。

我试过在Global.asax中设定的路线:

RouteTable.Routes.MapPageRoute("MyServiceV1", "MyService.svc", "~/v1/MyService.svc"); 

还试图设置服务端点:

<endpoint address="/MyService.svc" 
      binding="webHttpBinding" 
      contract="MyApp.V1.IMyService" 
      behaviorConfiguration="web" /> 

这些都不似乎工作。

有没有其他方法可以做到这一点?

回答

1

正试图避免URL重写,因为我希望有一种更简单的方式来使用内置功能来实现这一点,但事实证明这是解决问题的最简单方法。

首先,我必须安装用于URL重写的IIS加载项。这可以通过从Microsoft网站下载URL Rewrite或通过Web Platform Installer进行安装。

完成之后,我在我的WCF服务Web应用程序的web.config中添加了以下内容。

<system.webServer> 
    <!-- Other stuff here --> 
    <rewrite> 
     <rules> 
      <!-- Rewrite requests to /MyService.svc to /v1/MyService.svc --> 
      <rule name="MyService v1" stopProcessing="true"> 
       <match url="MyService.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="/v1/MyService.svc{R:1}" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

这使得通过两个/MyService.svc/v1/MyService.svc访问的V1服务,V2可以通过/v2/MyService.svc访问。