我正在为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项目模板生成的默认值。
这可能是我问题的根源吗?我该如何解决这个问题?