我有一个简单的Web应用程序,它在根文件夹中有一个WCF服务:
+AppRoot
---MyService.svc
正在对此进行修改以包含许多新功能,我将这些功能拆分为不同文件夹中的两个独立服务来表示其版本:
+AppRoot
---v1
-----MyService.svc
---v2
-----MyService.svc
但是,仍然使用v1的此服务的现有消费者需要能够访问旧URL的v1服务 - 例如。 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" />
这些似乎都不起作用。
还有其他办法吗?
答案 0 :(得分:1)
试图避免URL重写,因为我希望有一种更简单的方法可以使用内置功能来实现这一点,但事实证明这是解决问题的最简单方法。
首先,我必须安装IIS加载项以进行URL重写。这可以通过从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/MyService.svc
访问v2。