在Asp.NET WebApi中路由类似文件的名称

时间:2012-11-12 14:49:37

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

是否可以在ASP.NET Web API路由配置中添加允许处理看起来有点像文件名的URL的路由?

我尝试在WebApiConfig.Register()中添加以下条目,但这不起作用(使用URI api/foo/0de7ebfa-3a55-456a-bfb9-b658165df5f8/bar.group.json):

config.Routes.MapHttpRoute(
  name: "ContextGroupFile",
  routeTemplate: "api/foo/{id}/{filetag}.group.json",
  defaults: new { controller = "foo", action = "getgroup"}
  );

以下确实有效(按预期称为FooController.GetGroup(id,filetag))(使用URI api/foo/0de7ebfa-3a55-456a-bfb9-b658165df5f8/group/bar):

config.Routes.MapHttpRoute(
  name: "ContextGroupFile",
  routeTemplate: "api/foo/{id}/group/{filetag}",
  defaults: new { controller = "foo", action = "getgroup"}
  );

失败的案例会返回一个IIS错误(404 - 找不到文件),看起来它是由我的应用程序之外的东西创建的。错误页面(由IIS Express生成)包含以下错误详细信息:

Module = IIS Web Core
Notification = MapRequestHandler
Handler = StaticFile
Error Code = 0x80070002

我想这意味着一个名为“StaticFile Handler”的东西在它到达我的代码之前就已经得到了请求。最大的问题是:有没有办法防止这种情况发生?

2 个答案:

答案 0 :(得分:6)

您可以在完成以下设置后尝试:

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

答案 1 :(得分:1)

替换处理程序路径过滤器。 Usualy看起来像这样:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

尝试'path =“*”'

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />