1

我正在为 ASP.NET MVC4 开发一个自定义路由扩展,它使用反射根据应用于控制器的属性生成路由。它是Brandon Byars 的 RestMvc 项目的一个分支,我正在为 .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 项目模板生成的默认值。

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

4

0 回答 0