【问题标题】:asp.net routing when using MVC & Web-API使用 MVC 和 Web-API 时的 asp.net 路由
【发布时间】:2016-09-16 14:41:47
【问题描述】:

我有一个将 ASP.NET MVC 和 Web API 合二为一的项目。

我必须重定向来自 /assets/x/y/z.ext 的请求 到 /content/assets/x/y/z.ext

这是我写的代码:

public class AssetsController : Controller
{
    // GET: Assets
    public ActionResult Redirect()
    {
        var url = HttpContext.Request.FilePath;
        return base.Redirect("~/Content" + url);
    }
}

这就是 App_Start/RouteConfig.cs 的内容

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute("Assets", "assets/{*url}", new { controller = "Assets", action = "Redirect" });

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

现在由于某种原因这不起作用。 欢迎任何帮助解决此问题。

仅供参考:

  • 代码是从另一个可以运行的项目复制而来的。
  • 另一个项目是纯 MVC
  • 我在 Assets 控制器中放置了一个断点,但它从未被调用过。

【问题讨论】:

    标签: asp.net asp.net-mvc redirect asp.net-web-api routing


    【解决方案1】:

    我找到了解决办法:

    显然路由不适用于“已知”文件类型。 所以我请求的资源是“http://localhost:8080/assets/images/logo.png”,这并没有触发资产控制器。但是“http://localhost:8080/assets/images/logo.png/”做到了。

    所以我必须指定要路由资产文件夹中的所有文件。 这是通过在 web.config 文件中添加额外的配置来完成的:

      <system.webServer>
        <modules>
          <remove name="FormsAuthentication" />
        </modules>
        <handlers>
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <remove name="OPTIONSVerbHandler" />
          <remove name="TRACEVerbHandler" />
    
          <add name="AssetsPathContainsFiles" path="/assets/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
      </system.webServer>
    

    备注:使用path="/assets/*" 而不是path="assets/*" 很重要,因为第二个也会尝试处理像"/content/assets/images/logo.png" 这样的路径,而这应该由标准静态文件处理程序处理......(我假设前导斜杠导致路径被植根)

    (当我使用path="assets/*" 时,它导致了一个循环,浏览器给了我“to many redirect”错误。)

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 2016-12-06
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多