【问题标题】:MVC Attribute Routing Not WorkingMVC 属性路由不起作用
【发布时间】:2013-06-01 10:47:18
【问题描述】:

我对 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 not found 错误。如果我将路由更改为“/api/blazr/users” - 我会收到有关多个操作的错误,并且无法确定要执行的操作。

感谢您提供任何帮助 - 我真的只需要轻轻一推即可找出问题所在,无需为我完全解决它(我需要学习!)

谢谢

编辑

routes.axd:

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

【问题讨论】:

  • 当您使用来自AttributeRouting 的“路由调试器”(应该在~/routes.axd 可用)时,您是否看到来自属性的预期路由,即/api/q/users?
  • 不,只是 api/{controller}/{id}、{resource}.axd/{*pathInfo} 和 {controller}/{action}/{id}。当我在 MapAttributeRoutes() 上中断应用程序时 - 路由集合返回 0 个路由...
  • 我通过在我的控制器中实现 IController 让路由显示在 routes.axd 中 - 但它仍然不太正确(返回空白页面)
  • 请告诉我们你是如何修复它的。
  • 我更新了问题。问题是我有 MVC AttributeRouting NuGet,但需要 AttributeRouting 的 web api nuget

标签: c# asp.net-mvc asp.net-web-api attributerouting


【解决方案1】:

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

[RoutePrefix("MyPrefix")]

不使用后续的 Route 属性,例如

[Route("MyRoute")]

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

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

最后,我的最终版本是这样的:

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

【讨论】:

    【解决方案2】:

    在 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);
            }
        }
    

    附言

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

    干杯

    【讨论】:

    • 谢谢,这让我意识到我一直在无意识地关注MapMvcAttributeRoutes 而不是MapHttpAttributeRoutes。
    【解决方案3】:

    您不仅必须在您的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 }
            );
    
        }
    

    【讨论】:

    • 这对我有用.. 谢谢!不知道为什么微软的傻瓜不能记录这个简单的事情。
    • 这就是与众不同的地方!
    【解决方案4】:

    在您的 App_Start/RoutesConfig.cs 中

    确保调用以下代码行:

      routes.MapMvcAttributeRoutes();
    

    【讨论】:

    • 对于像我这样盲目复制粘贴代码的人,请在尝试此操作之前查看@Derreck_Dean 的以下答案。这个答案不完整。
    【解决方案5】:

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

    【讨论】:

    • 它是如何工作的?
    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2014-12-27
    • 2016-01-06
    • 1970-01-01
    • 2018-10-09
    相关资源
    最近更新 更多