如何让ASP.NET MVC 4接受看起来像文件名的路由?

时间:2013-05-17 00:19:36

标签: asp.net-mvc asp.net-mvc-4 routing

我正在为ASP.NET MVC4开发一个自定义路由扩展,它使用反射根据应用于控制器的属性生成路由。它是Brandon Byars' RestMvc project的一个分支,我正在为.NET 4.5更新它。

吸引力在于它允许人们编写描述自己路线的控制器,如下所示:

public class EchoController : RestfulController
{
    [Get("echo/{thingToEcho}.{format}", "echo/{thingToEcho}")]
    public ActionResult Echo(string thingToEcho, string format)
    {
        if (format == "xml")
            return new ContentResult
            {
                Content = string.Format("<echo>{0}</echo>", thingToEcho),
                ContentType = MediaType.Xml
            };

        return new ContentResult
        {
            Content = thingToEcho,
            ContentType = MediaType.PlainText
        };
    }

    public override ActionResult Options(string resourceUri)
    {
        SetAllowHeader(resourceUri);
        return new ContentResult {Content = "Options body goes here..."};
    }
}

我遇到了格式为

的路线问题
[Get("echo/{thingToEcho}.{format}", "echo/{thingToEcho}")]

这里的想法是客户端可以发出GET /echo/test.xml之类的请求,然后控制器可以返回xml格式的响应而不是纯文本,如上面的EchoController所示。

在我的eproject中,正确生成了所有路由,但是“echo / {thingToEcho}。{format}”路由不起作用,我只得到404页面。相同的请求,但没有“.xml”正常工作并回显预期的文本,所以看起来路由处理程序正在完成其工作,至少部分。

我对这些技术缺乏经验,但我认为这可能与web.config文件中注册的处理程序有关。在Brandon针对.NET 3.5和MVC3的原始代码中,他有以下处理程序:

<handlers>
  <remove name="WebServiceHandlerFactory-Integrated"/>
  <remove name="MvcHttpHandler"/>
  <remove name="UrlRoutingHandler"/>
  <add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  <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>

在我的项目中,我想让它在MVC4基本Web应用程序模板之上工作,所以我创建了一个新的MVC4项目并将Brandon的控制器放到它上面。在MVC4 web.config中,注册了以下处理程序:

<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

同样,我没有添加这些处理程序,它们是MVC4项目模板生成的默认值。

这可能是我问题的根源吗?我该如何解决这个问题?

0 个答案:

没有答案