我遇到了与引用的帖子相同的问题( WebAPI 的重写规则因 ExtensionlessUrlHandler 而失败),并尝试了几次尝试以成功解决该问题。我现在遇到的问题如下:
背景:
- IIS7、重写模块和 ARR(我是重写和 ARR 的新手)
- Site1 使用 ASP.Net MVC4 (www.foo.com) 托管我的 Web 前端
- Site2 使用 ASP.Net MVC4 (svc.foo.com) 托管我的 webapi
- 我可以完全控制两个站点的代码和站点配置
目标:
- 将 www.foo.com/svc/* 重写为 svc.foo.com/api/*
在职的:
- www.foo.com/svc/somecontroller/0 成功映射到 svc.foo.com/api/somecontroller/0
不工作:
- www.foo.com/svc/somecontroller?id=0
- 我打开了失败的请求跟踪,似乎重写模块正在重写 url,但由于某种原因,从未向 svc.foo.com 发出请求
细节:
- 为了解决引用帖子中的问题,我在每次调用 webapi 的末尾附加了一个“.s”(我有完全的控制权,所以我可以做到这一点 - 不理想,但我现在需要这个工作正常)
- 没有 QS: www.foo.com/svc/somecontroller/0 变成 www.foo.com/svc/somecontroller.s
- 使用 QS:www.foo.com/svc/somecontroller?id=0 变为 www.foo.com/svc/somecontroller?id=0.s
- 然后我使用重写规则剥离“.s”并真正调用 svc.foo.com/api/somecontroller/0 或 svc.foo.com/api/somecontroller?id=0
我一生都无法弄清楚为什么使用查询字符串格式时这不起作用。
重写规则:
< rule name="Route requests with QS" stopProcessing="true">
< match url="^svc/(.*)" />
< conditions>
< add input="{QUERY_STRING}" pattern="(.*).s" />
< / conditions>
< action type="Rewrite" url="http://svc.foo.com/api/{R:1}?{C:1}" appendQueryString="false" logRewrittenUrl="true" />
< / rule>
< rule name="Route the requests without QS" stopProcessing="true">
< match url="^svc/(.*).s" />
< conditions>
< add input="{CACHE_URL}" pattern="^(https?)://" />
< / conditions>
< action type="Rewrite" url="{C:1}://svc.foo.com/api/{R:1}" logRewrittenUrl="true" />
< / rule>
提前致谢!