IIS7 URL 重写对于 WCF 请求返回 404(反向代理)

问题描述 投票:0回答:3

我使用的是IIS7.5,.net 4.0。我在本地工作。

我已经安装了应用程序请求路由、Web Farm Framework、WebDeploy 和 UrlRewrite 来设置反向代理。这在大多数情况下都可以正常工作。

我有两个网站:

  • DefaultWebSite(端口 80,应用程序池:默认应用程序池 (.net 4))和
  • 目标(端口 8085,应用程序池:TargetAppPool(我的身份,.net 4))。

我在 DefaultWebSite 上有一个重写规则(按照 IIS.net 上的指示创建),它将所有本地主机(端口 80)流量重定向到 localhost:8085,正如上面链接中详细说明的那样。这对于大多数文档类型(.aspx、.xap、.htm、.ico)都适用,但对 MyService.svc 的请求失败。它返回 404。

需要明确的是:

当我将 localhost:8085/MyService.svc 粘贴到浏览器中时,我得到了请求的 WCF 页面。

当我将 localhost/MyService.svc 粘贴到浏览器中时,我收到 404。

当我将 localhost:8085/MyIcon.ico 粘贴到浏览器中时,我得到了请求的资源。

当我将 localhost/MyIcon.ico 粘贴到浏览器中时,我得到了请求的资源。

.svc 是我发现的唯一返回 404 的文档类型。

我有两条可能相关的信息。

  1. 应用程序池。当我将 DefaultWebSite 的应用程序池更改为 TargetAppPool 时,404 变为 500(“无法映射路径 '/'”)。进行此更改后,所有其他请求都会成功。不确定这是否相关。

  2. FREB(失败请求跟踪)日志。我找到了一个页面(http://blogs.msdn.com/b/asiatech/archive/2011/08/25/return-404-4-not-found-when-url-rewrite.aspx),其中详细介绍了当 URL 重写比我的更成功时(稍后会失败),FREB 日志中的步骤。我无法找到如何生成成功重写的 FREB 日志(如果可能的话),因此我只能将我的 FREB 日志与该博客上的日志进行比较。我可以在我的 FREB 日志中看到他们的步骤 21 (URL_CHANGED),但看不到 22 (URL_REWRITE_END)。我对这些日志没有足够的经验,无法注意到比这更重要的事情(欢迎提出建议)。

我的主要问题是:有谁知道为什么只请求 .svc 资源的 URL 没有被重写?

第二个问题是:有谁知道如何为成功的请求生成 FREB 日志(如果可能的话)?

谢谢

更新:

我更改了架构以尝试获取更多信息。

我已将 Target 网站移至另一台 PC,并在该 PC 上安装了 Microsoft 网络监视器以捕获传入流量。

在我更改 url 重写规则以指向这个新网站之前,当我在新 PC 上向 MyService.svc 发出请求时,我得到了正确的响应。很好。

一旦我更改了重写规则以将请求路由到新的 Target 网站,它就会像以前一样响应 (404)。我已经发出了 POST 和 GET 请求。网络监视器日志中没有任何请求的迹象(所有其他调用 -200、404 或其他 - 都出现在此日志中)。

这让我认为有一些与 url 重写和 *.svc 请求不兼容的东西。我尝试向 MyService.asmx 发出请求(已创建此文件),它正确返回了一个页面,因此它仅限于 *.svc。有什么想法吗?

c# wcf iis iis-7 url-rewriting
3个回答
7
投票

此问题的解决方案位于 Target 网站的配置文件中。

在 web.config(在目标应用程序中)中有一个部分内容如下:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
.

我将其更改为:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
.

信用必须转到http://forums.iis.net/post/1956671.aspx(虽然他/她声称这是需要更改的代理配置,但我发现它是目标应用程序,不是代理服务器)。


6
投票

如果仍然无法运行,请确保网站上没有充当反向代理的 WCF 处理程序。 我通过添加反向代理的 web.config 禁用了此功能:

<system. Webserver>    
  ...
  <handlers>
    <remove name="svc-ISAPI-4.0_64bit" />
    <remove name="svc-ISAPI-4.0_32bit" />
    <remove name="svc-Integrated-4.0" />
  </handlers>
</system.Webserver>

0
投票

因为重写似乎适用于所有资源除了当扩展名是.svc我想说这将是需要关注的领域。

我认为重写规则与您的其他资源匹配,但与您的服务不匹配,并且因为这些通常是正则表达式(通常很复杂),我想说值得测试您使用您的资源找到的任何规则网址。有关如何查找 UrlRewrite 的正则表达式的详细信息,请参阅此处

以同样的心态考虑任何出站规则可能也值得。

© www.soinside.com 2019 - 2024. All rights reserved.