2016-09-20 2 views
0

Это мой метод регистрации маршрутов в моем проекте веба-APIMVC Catch-Весь маршрут является единственным заданным маршрутом, но это дает мне 404

config.MapHttpAttributeRoutes(); 
config.Routes.MapHttpRoute(
    name: "AllRoutes", 
    routeTemplate: "{*url}", 
    defaults: new { controller = "IncomingRequest", action = "ProcessRequest" }); 

Я бы ожидать все, чтобы пойти мой метод ProcessRequest на моем IncomingRequest контроллер. Однако все маршруты приводят к 404, например.

http://localhost/CatCatcher/Cat/3

Может кто-нибудь посоветовать, что я мог пропустить?

+0

у вас есть другой маршрут конфигурации? Там мы обычно 'RouteConfig.cs', где настроены обычные маршруты MVC. Web api обычно регистрируется с помощью 'api/{...}', чтобы избежать конфликта с зарегистрированными там маршрутами. (Все они попадают в ту же таблицу маршрутов). Убедитесь, что ваши маршруты MVC не приводят к сбою маршрутов веб-Api. – Nkosi

+0

Других маршрутов в конфигурации нет. Я пытаюсь маршрутизировать API, поэтому, возможно, мне нужно изменить? – NibblyPig

+0

Показать контроллер 'IncomingRequest'. убедитесь, что он наследуется от 'ApiController', а не' Controller'. Вы можете смешивать свою конфигурацию. Также покажите полные файлы для 'WebApiConfig.cs' и' RouteConfig.cs', если они существуют – Nkosi

ответ

0

Попробуйте это:

routes.MapRoute(
"AllRoutes", 
"{*id}", 
    new { controller = "IncomingRequest", action = "ProcessRequest", id = "" } 
); 

К сожалению, я проверил его сейчас ....

+0

Это не сработало – NibblyPig

+0

Я отредактировал ответ. Извините за ошибочность, я пробовал это сейчас, и он должен работать :) –

0

В проекте веб-API вы не можете настроить маршрутизацию по-разному, как:

 config.Routes.MapHttpRoute(
      name: "Routes", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

И для достижения URL-адреса («http://localhost/CatCatcher/Cat/3») вы можете установить префикс маршрута на контроллер и действие. Вот пример:

[RoutePrefix("CatCatcher")] 
public class CatCatcherController : ApiController 
{ 

    [HttpGet] 
    [Route("Cat")] 
    public object Cat(int Id){ 
    //Do something 
    } 

} 

И если вы хотите идти по исполнению до удара Action затем позволяет следовать примеру, в котором я обеспечить API с IP/Domain здесь:

public class AuthorizeIPAddressAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(HttpActionContext filterContext) 
     { 
      //Even you can do here what you want 
      //Get users IP Address 
      string ipAddress = HttpContext.Current.Request.UserHostAddress; 

      if (!IsIpAddressValid(ipAddress.Trim()))//check allow ip 
      { 
       //Send back a HTTP Status code of 403 Forbidden 
       filterContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.NotFound); 
      } 

      base.OnActionExecuting(filterContext); 
     } 

После добавления этого класса в проекте вы просто должны сделать это на контроллере:

[AuthorizeIPAddress] 
[RoutePrefix("CatCatcher")] 
public class CatCatcherController : ApiController 
{ 

    [HttpGet] 
    [Route("Cat")] 
    public object Cat(int Id){ 
    //Do something 
    } 

} 

Надеюсь, это поможет ..

+0

Я хочу, чтобы все маршруты вызывали один и тот же единственный метод, хотя – NibblyPig

+0

Затем сначала удалите маршрут по умолчанию, а затем добавьте свой маршрут. –

Смежные вопросы