2016-03-15 72 views
2

让我给我的问题的一个例子, 我已经注册了我的路线如下(RouteConfig.cs):多种途径使400:错误的请求

routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

如果你看一下我的控制器,它具有以下功能;

[Route("all")] 
public HttpResponseMessage Get(HttpRequestMessage request) 
{ 
    return CreateHttpResponse(request,() => 
    { 
     HttpResponseMessage response = null; 
     var HolidayCalendars = _holidayCalendarsRepository.GetAll().ToList(); 
     IEnumerable<HolidayCalendarViewModel> holiVm = Mapper.Map<IEnumerable<HolidayCalendar>, IEnumerable<HolidayCalendarViewModel>>(HolidayCalendars); 
     response = request.CreateResponse<IEnumerable<HolidayCalendarViewModel>>(HttpStatusCode.OK, holiVm); 

     return response; 
    }); 
} 

到目前为止,一切都很顺利。我的页面加载了请求的数据。现在,当我去添加另一个函数时,例如;

[Route("allHolidays/{id:int}")] 
public HttpResponseMessage GetHolidays(HttpRequestMessage request, int id) 
{ 
    return CreateHttpResponse(request,() => 
    { 
     HttpResponseMessage response = null; 
     HolidayCalendar Calendar = _holidayCalendarsRepository.GetSingle(id); 
     var Holidays = Calendar.Holidays.OrderBy(s => s.HolidayDate).ToList(); 
     IEnumerable<HolidayViewModel> holidayVm = Mapper.Map<IEnumerable<Holiday>, IEnumerable<HolidayViewModel>>(Holidays); 

     response = request.CreateResponse<IEnumerable<HolidayViewModel>>(HttpStatusCode.OK, holidayVm); 

     return response; 
    }); 
} 

我会在我的网页中得到以下错误;

无法加载资源:服务器400(错误请求)的状态

奇怪的是反应了,我的要求并没有改变,只有在我的API一个新的控制器。

这不应该发生,因为我的代码请求不同的路线,例如;

function loadData() { 
    apiService.get('/api/HolidayCalendars/all', null, 
       HolidayCalendarLoadCompleted, 
       HolidayCalendarLoadFailed); 
} 

function loadData() { 
    apiService.get('/api/HolidayCalendars/allHolidays?id=' + $routeParams.id, null, 
       HolidaysLoadCompleted, 
       HolidaysLoadFailed); 
} 

任何想法?

构造类WebApiConfig:

public static void Register(HttpConfiguration config) 
{ 
    config.MapHttpAttributeRoutes(); 
    config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new {id = RouteParameter.Optional } 
    ); 
} 
+0

你使用。网络mvc? – Zamboney

+0

@Zamboney,是WebApi,Mvc,AngularJS – Brian

+0

@Brian的组合,请添加'asp.net-mvc'标签。 – mrahhal

回答

0

我终于找到了解决办法!

在我的代码的顶部,我有一个对System.Web.Mvc的引用。这样,路由和RESTful功能就不会像web Api那样被解释。这在我的应用程序中导致一些奇怪的功能

解决方案:

变化

using System.Web.Mvc; 

using System.Web.Http; 

这回避了我三天,直到我沿着以下的答案来了: https://stackoverflow.com/a/21999235/6033193

0

您的allHolidays路线意味着这种格式

/api/HolidayCalendars/allHolidays/123 

根据你的路由属性

[Route("allHolidays/{id:int}")] 

不过您已经通过ID作为查询字符串参数

api/HolidayCalendars/allHolidays?id=123 
+0

这可能是问题的一部分,但加载路由时弹出错误(全部) – Brian

+0

可能值得使用https://dotnetfiddle.net/ – Jamiec

+0

设置[mcve]让我试试,谢谢 – Brian

0

看起来你正在使用的控制器AttributeRouting(http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2):

[Route("all")] 

,但你正在使用的配置标准路由:

routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

尝试激活与AttributeRouting :

configuration.MapHttpAttributeRoutes(); 

where configur ation是HttpConfiguration的实际实例。

+0

我忘了为了包含我的WebApiConfig类,我现在将添加它。在那里我添加了configuration.MapHttpAttributeRoutes(); – Brian

0

该问题出现在您的WebApiConfig中。在routeTemplate中,你没有指定一个动作。

routeTemplate: "api/{controller}/{id}", 

如果我没有记错,这是对的WebAPI的默认配置。它通过动词过滤控制器上的请求。这就是为什么当你调用

apiService.get('/api/HolidayCalendars/all'.....) 

它返回你的HolidayCalendars控制器上的get()方法。

要解决此问题,在{}动作参数添加到您的routeTemplate:

public static void Register(HttpConfiguration config) 
    { 
config.MapHttpAttributeRoutes(); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new {id = RouteParameter.Optional } 
      ); 
} 
+0

感谢您的反馈,但是当我添加{action}语句时,我的所有函数都获得了404。 (无法加载资源:服务器响应状态为404(Not Found))另外,我认为我的RouteConfig指定了这一点。 (请参阅我的第一个代码块)。 – Brian

+0

好吧,其他一些想法......删除路由属性并尝试拨打电话。接下来,尝试添加一个'[HttpGet]'属性。如果其中任何一个都不起作用,则问题可能在于如何将参数传递给方法。将你的方法签名更新为'GetHolidays([FromBody] HttpRequestMessage request,int id)'并试一试。 –