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

时间:2013-10-03 11:29:25

标签: c# wcf iis iis-7 url-rewriting

我正在使用IIS7.5,.net 4.0。我在当地工作。

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

我有两个网站:

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

我在DefaultWebSite上有一个重写规则(按照IIS.net上的指示创建),它将所有localhost(端口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)。我没有足够的经验使用这些日志来注意比这更重要的事情(欢迎提出建议)。

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

    第二个问题是:有没有人知道如何为成功请求生成FREB日志(如果它甚至可能)?

    由于

    更新

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

    我已将目标网站移至另一台安装了Microsoft网络监视器的PC,以捕获传入流量。

    在我将url-rewrite规则更改为指向这个新网站之前,当我在新PC上向MyService.svc发出请求时,我得到了正确的响应。细

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

    这让我觉得有一些与url-rewrites和* .svc请求不兼容的东西。我尝试向MyService.asmx发出请求(创建了这个文件),并且它正确地返回了一个页面,所以它仅限于* .svc。有什么想法吗?

3 个答案:

答案 0 :(得分:7)

解决方法是在Target网站的配置文件中。

在web.config中(在Target应用程序中),有一节显示为:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

我改为阅读:

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

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

答案 1 :(得分:3)

如果仍无法使其运行,请确保您在网站上没有充当反向代理的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>

答案 2 :(得分:0)

因为当扩展名为 .svc 时,重写似乎适用于除之外的所有资源,我会说这将是专注的领域。

我认为rewrite rules与您的其他资源匹配,但不匹配您的服务,因为这些通常是regular expressions(通常很复杂)我会说它值得测试任何规则你找到你的网址。有关如何查找UrlRewrite can be found here的正则表达式的详细信息。

使用相同的心态也可能值得查看任何出站规则。