重定位WCF服务端点?

时间:2014-02-28 22:07:29

标签: wcf url url-rewriting routing

我有一个简单的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" />

这些似乎都不起作用。

还有其他办法吗?

1 个答案:

答案 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。