簡體   English   中英

MVC屬性路由不起作用

[英]MVC Attribute Routing Not Working

我是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”,則會收到有關多個操作的錯誤,並且無法確定要采取的操作。

感謝您的幫助-我真的只需要輕輕一點就能找出問題所在,而無需為我徹底解決(我需要學習!)

謝謝

編輯

route.axd:

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

您不僅需要在App_Start\\RouteConfig.cs文件中調用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 }
        );

    }

在您的App_Start / RoutesConfig.cs中

確保您調用以下代碼行:

  routes.MapMvcAttributeRoutes();

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

嘗試后,將您的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

干杯

我來這里尋找與RoutePrefix相關的答案。 經過一些測試,我發現只需添加一個

[RoutePrefix("MyPrefix")]

而不使用后續的Route屬性,例如

[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”。

我今天遇到了這個問題,發現如果必須在操作上使用Route屬性,則還必須在控制器上添加RoutePrefix屬性。

控制器=>

    [RoutePrefix("api/search")]
    public class SearchController : ApiController

行動=>

    [HttpGet]
    [Route("suburbs")]
    public IEnumerable<Model.Suburb> Suburbs([FromUri]string query = "")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM