【问题标题】:Angular $http.post() to C# Web API ControllerAngular $http.post() 到 C# Web API 控制器
【发布时间】:2017-07-10 03:41:54
【问题描述】:

我可以通过调用我的 Web API 控制器函数让 $http.get() 正常工作,但是当我尝试执行 post() 时,它会给出 404。

角度:

// call API to update
$http.post("api/Store/UpdateField", $httpParamSerializer({ ID: rowEntity.ID, columnName: colDef.name, value: newValue}))
     .then(function (response) {

     },
     function (error, status) {
     });

C#:

[RoutePrefix("api/Store")]
public class StoreController : ApiController

    [Route("UpdateField")]
    [HttpPost]
    public async Task<bool> UpdateField(int ID, string columnName, string value)
    { // stuff here }
}


// routes
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

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

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

            // Remove the XML formatter so json is returned instead
            config.Formatters.Remove(config.Formatters.XmlFormatter);
            config.Formatters.Add(config.Formatters.JsonFormatter);
        }

【问题讨论】:

  • 请添加您的global.asax
  • 你想要路线吗?
  • 这可能是服务器接受的动词的问题,请检查您的 web.config 文件。
  • 找到了答案。似乎您必须让 C# 函数采用一个选项而不是多种原始类型。然后在javascript端对数据进行字符串化:stackoverflow.com/questions/39904610/…

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


【解决方案1】:

我所做的并且一直为我工作的是:

    [HttpPost]
    [Route("MyRoute")]
    public HttpResponseMessage SaveEntity(MyModelOrCommand model)
    {
        try
        {
            object objReturned = bus.SendWithReturn(model);
            if (objReturned.GetType() == typeof(Validation))
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest,                  ((Validation)objReturned).Messages);
            }
            return Request.CreateResponse(HttpStatusCode.OK, objReturned);
        }
        catch (Exception ex)
        {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, ex);
        }
    }

   angular.module('MyModule').service('Module', ['envService', '$http', paService])
   function paService(envService, $http) {
   MyMethod: function (data, callback) {
            $http({
                method: 'POST',
                url: envService.read('apiUrl') + '/MyRoute',
                data: data,
            }).then(function (result) {
                callback(result);
            })
            .catch(function (result) {
                callback(result);
            })
        }
    }

为了发送对象,我在请求中使用了一个 javascript 对象

   var obj = new Object();
   obj.MyProperty1 = $scope.data;
   obj.MyProperty2 = $scope.data2;
   myService.MyMethod(JSON.stringfy(obj),function(result){
      if(result.status == 200){
          //do stuff
      }
   }); 

【讨论】:

    【解决方案2】:

    请确保在地址中填写完整的地址http://localhost:56493/api/Store/UpdateField

    我还推荐邮递员来测试你的 api:Postman 您可以安装它或使用 chrome 扩展程序。

    还有一件事,我建议像这样以角度构建自己的 json:

    var json = {
          "Id": $scope.id,
          "columnName": $scope.columnName,
          "value":$scope.value
        };
    

    然后这样称呼它:

    $http.post("http://localhost:YOURPORT/api/Store/UpdateField", json)
         .then(function (response) {
    
         },
         function (error, status) {
         });
    

    希望它有效:D

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 2016-05-29
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      相关资源
      最近更新 更多