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