2016-03-15 40 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)'並試一試。 –