1

我正在使用ASP.NET Web Api和angularJs开发Web应用程序。 我有一个Web API控制器是这样的:在Web API控制器中使用相同参数的多个HttpPost操作

[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 I face with 500内部服务器错误 .if我的评论AddNewCity action in web api contro然后我可以执行$ scope.AddNewState成功。

我在一个web api控制器中使用多个HTTPPost进行搜索并尝试这个解决方案:Multiple HttpPost method in Web API controller,但没有发生任何事情,我仍然有这个错误。

UPDATE

这是我的配置文件:

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

显示您的网页api配置。最有可能的是routeTemplate是'{controller}/{id}',如果是这样,那么这就是为什么你会得到错误,因为框架无法确定你试图调用哪个动作。更新模板,以包括行动'{控制器}/{动作}/{编号}',看看是否可行 – Nkosi

+0

@ Nkosi我添加我的配置文件后更新 –

回答

0

订单数量在其中注册您的路线很重要。首先注册更具体的路线,之后注册更一般的路线。

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) { ... } 
} 
+0

使用相同的参数谢谢...它的工作...注册路线的顺序是解决方案 –

0

可能这是因为参数在请求URL

[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) 
{ 

    RegionOperations regionOperation = new RegionOperations(newCityParam.ParentID, newCityParam.CityName); 
    RegionInformation newStateInformation = regionOperation.NewStateInformation; 
    var text = new 
    { 
     newStateInformation 
    }; 
    return JsonConvert.SerializeObject(text); 
} 
+0

Charan樱桃我认为这是因为像你一样的参数,但它应该像我的代码,并在每个行动方法 –

相关问题