Маршрутизация атрибутов 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}
Ответы
Ответ 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 = "")