415错误来自Angular的Web Api POST

问题描述:

花费数小时将简单的POST请求与Web API控制器进行对抗。415错误来自Angular的Web Api POST

Here's the response header from Postman: 
 
Access-Control-Allow-Headers → Content-Type 
 
Access-Control-Allow-Methods → GET, POST, PUT, DELETE, OPTIONS 
 
Access-Control-Allow-Origin → * 
 
Cache-Control → no-cache 
 
Content-Length → 2153 
 
Content-Type → application/json; charset=utf-8 
 
Date → Wed, 04 Nov 2015 23:26:14 GMT 
 
Expires → -1 
 
Pragma → no-cache 
 
Server → Microsoft-IIS/10.0 
 
X-AspNet-Version → 4.0.30319 
 
X-Powered-By → ASP.NET 
 
X-SourceFiles → =?UTF-8?B?QzpcVXNlcnNcSnVsaWFcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxM1xQcm9qZWN0c1xUd2lsZHlcQVBJXGFwaVxUZXN0XHRlc3Rc?=

我尝试这两种方法POST没有成功:

  1.  [Route("api/{Test}/test")] 
     
         [HttpPost] 
     
         public void PostByProducts(Test t) 
     
         { 
     
          Console.Write(t.Name); 
     
         }

  2. 更新:下面将被替换为合作德终于工作了。请注意,我添加了名称=“PostData”,它是控制器的名称。否则,获得“空引用”错误。 “数据数据”本身就是模型中的一个类。

[ResponseType(typeof(Data))] 
 
    [Route("api/{Test}/testpost/", Name="PostData")] 
 
    public IHttpActionResult PostData(Data data) 
 
    { 
 
     int rValue = 0; 
 
     if (!ModelState.IsValid) 
 
     { 
 
      return BadRequest(ModelState); 
 
     } 
 
     else 
 
     { 
 
      if (data != null) 
 
      { 
 
       rValue = repo.PostTestMe(data); 
 
      } 
 
      else 
 
      { 
 
       return BadRequest(); 
 
      } 
 
     } 
 

 
     return CreatedAtRoute("PostData", rValue, data); 
 
    }

在#1我的班 “测试” 总是在为空,而不管请求内容类型。我在Postman中尝试了所有这些,包括json。与发布更新后的代码现在(从角贴的时候,我得到空值旧)的角度作品太阅读一些SO答案,我并添加一个空的构造函数的模型类(“测试”)

在#2这里。当我从Postman发布时工作。

我在我的智慧结束。我想要做的就是从Angular发布一个简单的表单。

更新:现在它在邮差工作。我得到一个非空值到函数,并获得邮差这样的响应:

Access-Control-Allow-Headers → Content-Type 
 
Access-Control-Allow-Methods → GET, POST, PUT, DELETE, OPTIONS 
 
Access-Control-Allow-Origin → * 
 
Cache-Control → no-cache 
 
Content-Length → 1308 
 
Content-Type → application/json; charset=utf-8 
 
Date → Thu, 05 Nov 2015 03:15:26 GMT 
 
Expires → -1 
 
Pragma → no-cache 
 
Server → Microsoft-IIS/10.0 
 
X-AspNet-Version → 4.0.30319 
 
X-Powered-By → ASP.NET 
 
X-SourceFiles → =?UTF-8?B?QzpcVXNlcnNcSnVsaWFcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxM1xQcm9qZWN0c1xUd2lsZHlcQVBJXGFwaVx0ZXN0cG9zdA==?=

这是我在邮差派: enter image description here

角码:(FORMDATA是直接从html表单中引用form.Field1,form.Field2等对应于C#模型类)

 factory.postForm = function(formdata) { 
 
      return $http({ 
 
      url: 'http://domain.com/api/test/testpost', 
 
      data: JSON.stringify(formdata), 
 
      method: 'POST', 
 
      headers: { 
 
       'Content-Type': 'application/json; charset=utf-8' 
 
      } 
 
      }).success(function(response) { 
 
      console.log('posted ' + formdata) 
 
      }); 
 
     }

(旧:仍然在API post函数中为null)一切工作正常。

最后更新:

平心而论,当我上传了我的源代码,其中居住在共享的主机上,并且API是相同的域下托管的直播服务器,只是不同的项目,一切运行良好,我得到了201创建好的响应。

因此,这是一个CORS问题,我想这非常有趣,因为GET请求在本地主机上一切正常,但是POST给我带来了困难。

顺便说一句,我结束了不使用[FromBody] - 它没有它的工作。

更新:结束将名称添加到路线。一切正常。

+0

从这一行删除charset = utf-8 Content-Type→application/json; charset = utf-8 – Shohel

+0

尝试使用和不使用字符集。同样的结果。 API中的空值。 –

+0

请提及您的调用标题 – Shohel

我以前经历过类似的问题,在我的案例中,在课堂参数解决了问题之前添加了[FromBody]。

在你的情况下,测试方法需要如下所示。

[HttpPost] 
public IHttpActionResult PostTest([FromBody]Test test) 
{ 
} 

从FromUri和FromBody的详细说明可以找到here

+0

如果从角度发帖,仍然为空。 Postman邮局工作正常。 –

+0

我想不知何故邮差避免了整个CORS的事情;也许它不会在任何Web服务器下运行,甚至是模拟的,或者它可能会将自身注入到运行api的本地主机中。 –