MVC属性路由不起作用

本文关键字:不起作用 路由 属性 MVC | 更新日期: 2023-09-27 18:16:58

我对MVC框架相对较新,但我确实有一个功能正常的Web项目,该项目带有一个使用AttributeRouting(NuGet包(的API控制器-然而,我正在启动另一个项目,它只是不想遵循我制定的路线。

控制器:

public class BlazrController : ApiController
{
    private readonly BlazrDBContext dbContext = null;
    private readonly IAuthProvider authProvider = null;
    public const String HEADER_APIKEY = "apikey";
    public const String HEADER_USERNAME = "username";
    private Boolean CheckSession()
    {
        IEnumerable<String> tmp = null;
        List<String> apiKey = null;
        List<String> userName = null;
        if (!Request.Headers.TryGetValues(HEADER_APIKEY, out tmp)) return false;
        apiKey = tmp.ToList();
        if (!Request.Headers.TryGetValues(HEADER_USERNAME, out tmp)) return false;
        userName = tmp.ToList();
        for (int i = 0; i < Math.Min(apiKey.Count(), userName.Count()); i++)
            if (!authProvider.IsValidKey(userName[i], apiKey[i])) return false;
        return true;
    }
    public BlazrController(BlazrDBContext db, IAuthProvider auth)
    {
        dbContext = db;
        authProvider = auth;
    }
    [GET("/api/q/users")]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
    [GET("api/q/usersauth")]
    public string GetAuth()
    {
        if (!CheckSession()) return "You are not authorized";
        return "You are authorized";
    }
}

AttributeRoutingConfig.cs

public static class AttributeRoutingConfig
{
    public static void RegisterRoutes(RouteCollection routes) 
    {    
        // See http://github.com/mccalltd/AttributeRouting/wiki for more options.
        // To debug routes locally using the built in ASP.NET development server, go to /routes.axd
        routes.MapAttributeRoutes();
    }
    public static void Start() 
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

Global.asax.cs:

//注意:有关启用IIS6或IIS7经典模式的说明,//访问http://go.microsoft.com/?LinkId=9394801

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

当我尝试导航到/api/q/users时,我会得到一个404未找到的错误。如果我将路由更改为"/api/blazr/users",我会收到一个关于多个操作的错误,并且无法确定要采取哪个操作。

感谢任何帮助-我真的只需要一个小小的推动来弄清楚问题在哪里,不需要为我完全解决它(我需要学习!(

感谢

编辑

routes.axd:

api/{controller}/{id}
{resource}.axd/{*pathInfo}          
{controller}/{action}/{id}

MVC属性路由不起作用

您不仅必须在App_Start'RouteConfig.cs文件中调用routes.MapMvcAttributeRoutes(),而且它必须出现在定义默认路由之前!在此之前和忽略{resource}.axd{*pathInfo}之后添加它。我刚刚发现,试图让属性路由在我的MVC 5网站上正确工作。

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

在您的应用程序启动/路由配置.cs 中

请确保调用以下代码行:

  routes.MapMvcAttributeRoutes();

In nuGet包管理器安装到您的项目Web API Web主机包

将这个类添加到文件夹app_start->WebApiConfig.cs(如果它没有退出-创建(:

  public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes(); // pay attention to this method
//here you can map any mvc route
            //config.Routes.MapHttpRoute(
            //    name: "DefaultApi",
            //    routeTemplate: "api/{controller}/{id}",
            //    defaults: new { id = RouteParameter.Optional }
            //);
            config.EnableSystemDiagnosticsTracing();
        }
    }

之后尝试将您的Global.asax配置更改为:

public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
    }

p.S.

通读这篇文章,非常有用http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

欢呼

我来这里是为了寻找与RoutePrefix相关的答案。经过一些测试,我发现简单地添加一个

[RoutePrefix("MyPrefix")]

而不使用诸如之类的后续路由属性

[Route("MyRoute")]

表示RoutePrefix被忽略。Haack的routedebugger非常有助于确定这一点:https://haacked.com/archive/2008/03/13/url-routing-debugger.aspx/

只需通过NuGet添加即可,它会在您的应用程序设置中添加一行,然后您的所有路线都会显示在页面底部。强烈建议您解决任何路由问题。

最后,我的最终版本看起来像:

[RoutePrefix("Asset/AssetType")] [Route("{action=index}/{id?}")]

确保为AttributeRouting安装了NuGet包"WebApp API"。

有效的方法是需要包含路线。MapMvcAttributeRoutes((;在你的路线中,确保它在你的默认路线之前

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