【问题标题】:WebApi Attribute Routing for URLs with *.js带有 *.js 的 URL 的 WebApi 属性路由
【发布时间】:2015-04-09 19:19:35
【问题描述】:

好吧,这不是 有趣的结局......

我正在尝试在 .Net WebAPI 中模拟基于 RoR 的服务。该服务的 Ruby 实现应该从以下 url 返回一个 JSON 文档:

http://myserver/api/assessments/{id}.js

注意最后的.js

我在我的 api 控制器上做了一个RouteAttribute 装饰,如下所示:

[Route("~/api/assessments/{id}.js")]
public async Task<HttpResponseMessage> GetAssessment(int id)
{
    . . .
}

...但是我收到 404 错误。我怀疑这可能是因为请求以“js”结尾,所以经过一番研究,我发现我应该将我的RouteCollection.RouteExistingFiles 设置为true...这似乎没有任何效果。我仍然得到 404。

我说的对吗? .js 是结束导致 404 的原因吗?我怎样才能解决这个问题?这是一个纯粹的 WebApi 项目,所以无论如何我都不会在其中使用 JavaScript。

【问题讨论】:

  • 这可能对你有帮助stackoverflow.com/questions/11494200/…阅读约束部分。
  • 你有什么理由必须在你的服务端点上保留这个“扩展”吗?这在 Web API 中永远不是必需的,因为您可以通过内容协商返回 JSON。
  • [Route("~/api/assessments/{id:int}.js")] 并且您的配置应该将 runAllManagedModulesForAllRequests 设置为 true。
  • 好吧,就像我说的,我正在尝试模拟 RoR 的服务......这就是服务所期望的。
  • 路由调试器真的很有帮助:haacked.com/archive/2008/03/13/url-routing-debugger.aspx我建议发布这些结果

标签: c# asp.net-web-api asp.net-mvc-routing attributerouting


【解决方案1】:

您的 Web.config 中有以下内容吗?我最近刚刚为一个工作项目设置了路由,这条线给我带来了各种各样的地狱,因为它不存在:

<configuration>
  ...
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
    ...
    </modules>
  </system.webServer>
</configuration>

.js 扩展名可能不会被执行路由的托管模块拾取。

附录: 该配置部分中的其他数据以及使其工作所需的其他数据:

<configuration>
  ...
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule"
         type="System.Web.Routing.UrlRoutingModule, 
               System.Web.Routing, Version=3.5.0.0, 
               Culture=neutral, 
               PublicKeyToken=31BF3856AD364E35" />
    </modules>
    <handlers>
      <add name="UrlRoutingHandler"
        preCondition="integratedMode"
        verb="*" path="UrlRouting.axd"
        type="System.Web.HttpForbiddenHandler, 
              System.Web, Version=2.0.0.0, Culture=neutral, 
              PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>
    ...
  </system.webServer>
</configuration>

【讨论】:

  • 值得注意的是,runAllManagedModulesForAllRequests 可能会对您的应用程序产生性能影响。
  • 嗯...这似乎没有什么不同。
  • 确实如此,它可能是一个相当大的替代方案,而不是在 IIS 中映射 .js 文件以通过 ASP.NET 模块运行。
  • 您是否替换了现有的 行? (或将 runAllManagedModulesForAllRequests="true" 属性添加到标签中?)我在原始答案中省略了结束标签,但它不是单行标签。
  • 不,我已经有了模块标签,所以我只是添加了属性。
猜你喜欢
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2014-09-26
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
相关资源
最近更新 更多