【问题标题】:Map api route to mvc route将 api 路由映射到 mvc 路由
【发布时间】:2019-03-29 05:40:55
【问题描述】:

我希望我的 FilesController 可以从 /files/{action} 和 /api/files/{action} 访问。我试过了

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

但它不起作用。我删除了 WebApiConfig,所以在 App_Start 中只有 MVC RouteConfig,但它没有帮助。

更新
控制器代码

public class FilesController : Controller {
    public ActionResult Index() {
        return new HttpStatusCodeResult(System.Net.HttpStatusCode.OK);
    }
}

请求网址:
/files/index -> 好的 (200)
/api/files/index -> 未找到 (404)

更新 #2
完成RouteConfig.cs

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

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

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

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

【问题讨论】:

    标签: c# asp.net asp.net-mvc api routes


    【解决方案1】:

    我认为您可以尝试在原始路线设置前添加一条新路线。

    这个设置会先检查URL是否匹配Files/{action}/{id},如果不匹配则使用api/Files/{action}/{id}

    routes.MapRoute(
        name: "FilesRoute",
        url: "Files/{action}/{id}",
        defaults: new { controller = "Files", id = UrlParameter.Optional }
    );
    
    routes.MapRoute(
        name: "Files",
        url: "api/Files/{action}/{id}",
        defaults: new { controller = "Files", id = UrlParameter.Optional }
    );
    

    编辑

    问题是路由设置顺序,你需要将默认路由设置为最后一个。

    /api/files/index => 否则,设置将找到api 控制器和files 操作。

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapRoute(
                name: "FilesRoute",
                url: "Home/{action}/{id}",
                defaults: new { controller = "Home", id = UrlParameter.Optional }
            );
    
            routes.MapRoute(
                name: "Files",
                url: "api/Home/{action}/{id}",
                defaults: new { controller = "Home", id = UrlParameter.Optional }
            );
    
    
            routes.MapRoute(
                 name: "Default",
                 url: "{controller}/{action}/{id}",
                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
    
        }
    }
    

    【讨论】:

    • 您的请求 URL 是什么,您可以发布您的控制器和操作代码吗?
    • 您确定在配置类中为RouteCollection 添加了thhoes 设置吗?因为如果我创建一个示例项目,它就可以工作。
    • @rsdk 我看到你编辑你的问题我修改了我的答案应该可以工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多