Подтвердить что ты не робот

Маршрутизация атрибутов MVC не работает

Я относительно новичок в структуре MVC, но у меня есть действующий веб-проект с контроллером 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";
    }
}

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 classic,   // посещение 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}
4b9b3361

Ответ 1

Не только вы должны иметь вызов 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 }
        );

    }

Ответ 2

В вашем App_Start/RoutesConfig.cs

убедитесь, что вы вызываете следующую строку кода:

  routes.MapMvcAttributeRoutes();

Ответ 3

В диспетчере пакетов nuGet установите в свой проект Веб-хостинг веб-хостинга

добавьте этот класс в папку 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

веселит

Ответ 4

Я пришел сюда для поиска ответов, связанных с 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?}")]

Ответ 5

Убедитесь, что для атрибутаRouting установлен пакет NuGet "API WebApp".

Ответ 6

Я столкнулся с этой проблемой сегодня и обнаружил, что если мне нужно использовать атрибут Route в действии, я должен добавить атрибут RoutePrefix на контроллере.

Контроллер =>

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

Действие =>

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