Estoy desarrollando una aplicación web usando ASP.NET Web Api y angularJs. Tengo un controlador de API web como este:

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

Y en el lado del cliente tengo estas funciones para enviar la solicitud 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);
    });
};

Cuando ejecuto $ scope.AddNewCity o $ scope.AddNewState me encuentro con 500 Internal Server Error .si comento AddNewCity action en el controlador web api, entonces puedo ejecutar $ scope.AddNewState con éxito.

Busqué el uso de múltiples HTTPPost en un controlador de API web y probé esta solución: Multiple HttpPost en el controlador de API web, pero no pasó nada y todavía tengo ese error.

ACTUALIZACIÓN

Este es mi archivo de configuración:

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
Abolfazl Davoodi Shandiz 15 dic. 2016 a las 13:13

2 respuestas

La mejor respuesta

El orden en el que registre sus rutas es importante. registre las rutas más específicas primero y las rutas más generales después.

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

}

También debe actualizar el controlador para que sea un poco más específico en cuanto a lo que puede manejar.

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

    [HttpPost]
    [ActionName("AddNewCity")]
    public object PostAddNewCity(RegionInformation newCityParam) { ... }
}
0
Nkosi 16 dic. 2016 a las 01:09

Puede ser que esto se deba a la cantidad de parámetros en la URL de solicitud

[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
Mr_Perfect 15 dic. 2016 a las 11:20