[c#]与 Web API 控制器中的同一参数的多个 HttpPost 行动。

发布时间: 2017/2/24 23:25:19
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我开发一个 web 应用程序使用 ASP.NET Web Api 和 angularJs。 我有这样一个 web api 控制器︰

[ActionName("AddNewState")]
public object PostAddNewState(RegionInformation newStateParam)
{
    RegionOperations regionOperation = new RegionOperations(newStateParam.StateName);
    RegionInformation newStateInformation = regionOperation.NewStateInformation;
    var text = new
    {
        newStateInformation
    };
    return JsonConvert.SerializeObject(text);
}

[ActionName("AddNewCity")]
public object PostAddNewCity(RegionInformation newCityParam)
{
    var text = new
    {
        message="Hello"
    };
    return JsonConvert.SerializeObject(text);
}

和我在客户端发送POST请求这些函数︰

$scope.AddNewState = function () {
    $http({
        method: "POST",
        url: "api/RegionManagement/AddNewState",
        data: {
            StateName: $scope.state
        }
    }).then(function (response) {
        var obj = JSON.parse(response.data);
        $scope.States.push({ text: obj.newStateInformation.StateName, value: obj.newStateInformation.ID });
    });
};

$scope.AddNewCity = function () {
    $http({
        method: "POST",
        url: "api/RegionManagement/AddNewCity",
        data: {
            ParentID: $scope.RegionInptes.ParentID,
            CityName: $scope.city
        }
    }).then(function (response) {
        var obj = JSON.parse(response.data);
        alert(obj.message);
    });
};

当我执行$scope。AddNewCity$scope。AddNewState我面对500 内部服务器错误吧我评论AddNewCity行动中 web api 控制器,然后我可以执行$scope。AddNewState成功。

我在 web api 控制器中使用多个 HTTPPost 搜索和尝试这种解决方案︰多个 HttpPost 方法在 Web API 控制器,但是没有什么发生,仍该错误。

更新

这是我的配置文件︰

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "ControllerOnly",
        routeTemplate: "api/{controller}"
    );

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

解决方法 1:

在你注册你的路由的顺序非常重要。先注册更具体路线和更一般路线后。

public static void Register(HttpConfiguration config) {
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

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

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

}

你还应该更新控制器要更具体一点,它可以处理。

public class RegionManagementController : ApiController {
    [HttpPost]
    [ActionName("AddNewState")]
    public object PostAddNewState(RegionInformation newStateParam) { ... }

    [HttpPost]
    [ActionName("AddNewCity")]
    public object PostAddNewCity(RegionInformation newCityParam) { ... }
}
赞助商