如何为WCF服务创建重定向?

时间:2012-01-13 06:22:58

标签: asp.net wcf iis url-rewriting

我在我的网站A上托管了一个WCF服务。我还有另一个站点B,它使用IIS URL重写将所有请求重定向到我的站点A.但是,站点B不处理对.svc文件的任何请求,返回404未找到。知道如何让它工作吗?

UPD重定向配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Redirect" stopProcessing="true">
                    <match url=".*" />
                    <action type="Rewrite" url="http://localhost/site_A/{R:0}" logRewrittenUrl="true" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

我发现网站A(!)的IIS日志中没有对.svc文件的任何请求。它不会将这些请求重定向到站点A.但是,当我从站点B请求.htm文件时,它会正确地将它们重定向到站点A.

3 个答案:

答案 0 :(得分:1)

我不确定,但据我记得,如果您在网站B上没有.svc的http处理程序,可能会发生这种情况

答案 1 :(得分:1)

即使您要在IIS中添加.SVC处理程序并以与执行.HTM请求相同的方式重定向它,重定向也不会保留消息正文。因此,对SiteB上的服务方法的请求不一定与SiteA上的服务方法调用相同 - 这取决于您的配置,是否以RESTful方式公开,以及您的绑定是什么。

您可以查看WCF 4.0's Routing功能。这要求您编写某些逻辑来识别呼叫并让它调用另一个端点。

一个'更加'的解决方案是让SiteB托管一个代理服务,它只接受传入的请求并调用SiteA的等效服务,获取结果并将其返回给调用者。

答案 2 :(得分:1)

如果您仍然需要服务器处理包括某些服务在内的其他常规流量,一种选择是创建一个仅用于重定向的应用程序池,而该池没有托管代码。

示例:

IIS With a main site of "Websites" and 2 applications: "WcfServices" and "OtherWebsites"

假设您希望所有内容http://Websites/WcfServices重定向到其他地方。

首先,请确保已安装URL Rewrite和ARR并设置反向代理。 (请注意,您也可以将入站重写规则更改为指向特定路径,而不仅仅是其他服务器)

Action for Inbound Rewrite Rule with Rewrite URL set to http://internalWebServer:8080/internalWcfServices/{R:0}

为WcfServices创建没有托管代码的应用程序池:

Add Application Pool. Name: WcfServiceRedirect; .NET CLR version: No Managed Code

确保WcfServices使用新的应用程序池:

WcfServices app's Basic Settings page with Application Pool set to WcfServiceRedirect

在这一点上,由于无法加载.net模块,因此WCF无法拦截对http://Websites/WcfService/CustomerDetails.svc之类的调用。所有流量都将路由到反向代理中设置的内部服务器。