【问题标题】:multiple routes in one controller causes 400:bad request一个控制器中的多个路由导致 400:bad request
【发布时间】:2016-07-01 02:10:16
【问题描述】:

让我举一个我的问题的例子, 我已将我的路线注册如下(RouteConfig.cs):

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 中只有一个新的 Controller。

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

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 }
    );
}

【问题讨论】:

  • 你使用.net mvc吗?
  • @Zamboney,是的 WebApi、Mvc、AngularJS 的组合
  • @Brian 请添加asp.net-mvc 标签。
  • @mrahhal 完成了!

标签: javascript c# angularjs asp.net-mvc asp.net-web-api2


【解决方案1】:

allHolidays 的路径暗示了这种格式

/api/HolidayCalendars/allHolidays/123

根据你的路由属性

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

但是您已经将 id 作为查询字符串参数传递了

api/HolidayCalendars/allHolidays?id=123

【讨论】:

  • 这可能是问题的一部分,但是在加载 Route(All) 时会弹出错误
【解决方案2】:

看起来您正在控制器上使用 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();

其中配置是HttpConfiguration 的实际实例。

【讨论】:

  • 我忘了包含我的 WebApiConfig 类,我现在添加它。在那里我添加了 configuration.MapHttpAttributeRoutes();
【解决方案3】:

问题出在您的 WebApiConfig 中。在 routeTemplate 中,您尚未指定操作。

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

如果我没记错的话,这是 WebAPI 的默认配置。它按动词过滤控制器上的请求。这就是为什么当你打电话时

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

它返回您的 HolidayCalendars 控制器上的 Get() 方法。

要解决此问题,请将 {action} 参数添加到您的 routeTemplate:

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

【讨论】:

  • 感谢您的反应,但是当我添加 {action} 语句时,我的所有功能都会收到 404。 (加载资源失败:服务器响应状态为 404(未找到))另外,我认为我的 RouteConfig 指定了这一点。 (参见我的第一个代码块)。
  • 好的,还有一些其他的想法...删除路由属性并尝试拨打电话。接下来,尝试添加[HttpGet] 属性。如果其中任何一个都不起作用,则问题可能是您如何将参数传递给该方法。将您的方法签名更新为 GetHolidays([FromBody]HttpRequestMessage request, int id) 并尝试一下。
【解决方案4】:

我终于找到了解决办法!

在我的代码顶部,我引用了 System.Web.Mvc。这样,路由和 RESTful 功能就不会在 Web Api 中被解释为应有的方式。这导致我的应用出现一些奇怪的功能。

解决方案:

改变

using System.Web.Mvc;

到

using System.Web.Http;

这逃避了我三天,直到我得出以下答案: https://stackoverflow.com/a/21999235/6033193

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2012-04-25
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多