MVC属性路由不起作用

Tea*_*n42 38 c# asp.net-mvc asp.net-web-api attributerouting

我对MVC框架比较陌生,但我确实有一个功能正常的Web项目,其API控制器使用了AttributeRouting(NuGet包) - 但是,我正在启动另一个项目,它只是不想遵循我放入的路由地点.

控制器:

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试导航到/ api/q/users时 - 我收到404未找到错误.如果我将路由更改为"/ api/blazr/users" - 我收到有关多个操作的错误,而无法确定要采取的操作.

任何帮助都表示赞赏 - 我真的需要一个小小的推动来找出问题所在,不需要为我完全解决它(我需要学习!)

谢谢

编辑

routes.axd:

api/{controller}/{id}
{resource}.axd/{*pathInfo}          
{controller}/{action}/{id}
Run Code Online (Sandbox Code Playgroud)

Der*_*ean 104

您不仅需要routes.MapMvcAttributeRoutes()App_Start\RouteConfig.cs文件中进行调用,还必须在定义默认路由之前显示!我在此之前和忽略后添加它{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 }
        );

    }
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用..谢谢!不知道为什么微软的假人无法记录这个简单的事情. (3认同)

Dav*_*ney 34

在App_Start/RoutesConfig.cs中

确保调用以下代码行:

  routes.MapMvcAttributeRoutes();
Run Code Online (Sandbox Code Playgroud)

  • 对于像我这样盲目复制粘贴代码的其他人,在尝试此操作之前,请参阅@Derreck_Dean中的以下答案.这个答案是不完整的. (16认同)

小智 7

在nuGet包管理器中安装到您的项目Web API Web Host包

将此类添加到文件夹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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

PS

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

干杯


4rc*_*hie 2

确保您已为 AttributeRouting 安装 NuGet 包“WebApp API”。