IIS7如何重写ASP.NET MVC WebAPI?

3
我遇到了与引用帖子(Rewrite rule for WebAPI fails because of ExtensionlessUrlHandler)中相同的问题,并尝试了几种解决方法,有些成功。现在我卡在了以下问题上:
背景:
- IIS7,重写模块和 ARR(我是重写和 ARR 的新手) - Site1 使用 ASP.Net MVC4 托管我的 Web 前端(www.foo.com) - Site2 使用 ASP.Net MVC4 托管我的 WebAPI(svc.foo.com) - 我完全控制两个站点的代码和站点配置
目标:
- 重写 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>

提前致谢!


你找到解决方案了吗?我也想做同样的事情。 - Morgan T.
这是因为/0.s被视为扩展名,而?0.s不是扩展名吗?因此它会通过extensionlessUrlHandler并像引用帖子中一样失败。 - Morgan T.
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接