Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 区分web api路由和mvc路由_C#_Asp.net_Asp.net Mvc_Asp.net Web Api2 - Fatal编程技术网

C# 区分web api路由和mvc路由

C# 区分web api路由和mvc路由,c#,asp.net,asp.net-mvc,asp.net-web-api2,C#,Asp.net,Asp.net Mvc,Asp.net Web Api2,我开始开发Web API 2支持的应用程序,因为我只想以RESTful方式检索数据 然后我需要向站点添加一些HTML,以便管理员能够管理提供的信息,因此我创建了一些MVC5控制器来返回HTML。现在我想区分WebAPI路由和MVC路由,如果可能的话,不影响生产中的WebAPI路由 Web API路由:我在这里犯的错误是在我第一次开发时删除了“API”前缀,这本来可以解决现在的冲突 public static void Register(HttpConfiguration config) {

我开始开发Web API 2支持的应用程序,因为我只想以RESTful方式检索数据

然后我需要向站点添加一些HTML,以便管理员能够管理提供的信息,因此我创建了一些MVC5控制器来返回HTML。现在我想区分WebAPI路由和MVC路由,如果可能的话,不影响生产中的WebAPI路由

Web API路由:我在这里犯的错误是在我第一次开发时删除了“API”前缀,这本来可以解决现在的冲突

public static void Register(HttpConfiguration config)
{
    // Web API routes
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "{controller}/{action}/{id}",
        defaults:
            new {
                 controller = "Parking",
                 action = "Get",
                 id = RouteParameter.Optional
                 }
        );
}
MVC路由:默认路由。MVC控制器名称为管理,即MVC路由仅用于管理站点

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

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Parking", action = "Get", id = UrlParameter.Optional }
    );
}
问题是MVC路由没有匹配的机会,因为WebAPI路由首先匹配。MVC路线需要如何改变其实并不重要,只要它们能正常工作,因为它们还没有投入生产;我最好保持Web API路由的现状

我试过:

  • 在Global.asax.cs中切换web api路由和mvc路由的注册顺序
  • 使用“web”作为MVC控制器的前缀,但路由机制认为“web”是一个控制器,并且没有找到它(WebAPI路由再次获胜)
  • 我想不出一个合适的约束来避免这次碰撞
  • 硬编码“管理”替换MVC路由模式中的“{controller}”

这里有解决冲突的技巧吗?

MVC控制器的web前缀将起作用。在这种情况下,首先为MVC配置路由(在为API配置路由之前)

向API添加以下约束

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}/{action}/{id}",
    defaults:
        new {
             controller = "Parking",
             action = "Get",
             id = RouteParameter.Optional
             },
    constraints: new { controller = @"^web" },
  );

MVC控制器的web前缀将起作用。在这种情况下,首先为MVC配置路由(在为API配置路由之前)

向API添加以下约束

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}/{action}/{id}",
    defaults:
        new {
             controller = "Parking",
             action = "Get",
             id = RouteParameter.Optional
             },
    constraints: new { controller = @"^web" },
  );

正如您所知(因为您刚刚开始开发此Web API),MVC控制器和Web API控制器现在在MVC 6.0(ASP.NET Core 1.0)中合并/统一。因此,对于您从哪个控制器继承,不再有任何混淆。除此之外,如果使用.NET Core framework,还有很大的性能优势。

正如您所知(因为您刚刚开始开发此Web API),MVC控制器和Web API控制器现在在MVC 6.0(ASP.NET Core 1.0)中合并/统一。因此,对于您从哪个控制器继承,不再有任何混淆。除此之外,如果使用.NET Core framework,还可以获得巨大的性能优势。

最终在WebApiConfig中通过以下约束实现:

constraints: new { controller = @"(?!web).*" }
public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{action}/{id}",
                defaults:
                    new
                    {
                        controller = "Parking",
                        action = "Get",
                        id = RouteParameter.Optional
                    },
                constraints: new { controller = @"(?!web).*" }
            );
        }
    }
这是我的WebApiConfig:

constraints: new { controller = @"(?!web).*" }
public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{action}/{id}",
                defaults:
                    new
                    {
                        controller = "Parking",
                        action = "Get",
                        id = RouteParameter.Optional
                    },
                constraints: new { controller = @"(?!web).*" }
            );
        }
    }
我的路线图:

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

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

最后,在WebApiConfig中使用以下约束实现:

constraints: new { controller = @"(?!web).*" }
public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{action}/{id}",
                defaults:
                    new
                    {
                        controller = "Parking",
                        action = "Get",
                        id = RouteParameter.Optional
                    },
                constraints: new { controller = @"(?!web).*" }
            );
        }
    }
这是我的WebApiConfig:

constraints: new { controller = @"(?!web).*" }
public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{action}/{id}",
                defaults:
                    new
                    {
                        controller = "Parking",
                        action = "Get",
                        id = RouteParameter.Optional
                    },
                constraints: new { controller = @"(?!web).*" }
            );
        }
    }
我的路线图:

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

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

尽管在WebAPI和MVC之间切换了路由注册顺序,我还是尝试了一下,但没有成功。我使用“web”作为MVC的前缀,但在解决路由问题时,它进入了WebAPI路由规则,并期望“web”成为控制器。我尝试了,但没有成功,尽管在WebAPI和MVC之间切换了路由注册顺序。我使用“web”作为MVC的前缀,但在解决路由问题时,它进入了WebAPI路由规则,并期望“web”成为控制器。酷,我会考虑到这一点,也许它值得对此问题进行一些研究!酷,我会考虑到这一点,也许它值得在这个问题上进行一些研究!然后执行与web api通常执行的相反的操作。web api通常会在mvc之前注册
api
前缀和映射,以避免冲突。为mvc注册一个前缀,并在WebAPI路由之前映射它。您甚至可以尝试为mvc使用属性路由并在其中设置前缀。我尝试了,但没有成功(请参阅问题中的尝试列表),然后执行与通常对web api所做的相反的操作。web api通常会在mvc之前注册
api
前缀和映射,以避免冲突。为mvc注册一个前缀,并在WebAPI路由之前映射它。您甚至可以尝试为mvc使用属性路由并在其中设置前缀。我尝试了,但没有成功(请参阅问题中的尝试列表)