我正在尝试在Ionic4应用程序中做一些非常基本的事情-将数据发布到Asp.Net Web API 2接口。请求成功,但是服务器上没有收到数据。
import { HttpClient } from '@angular/common/http';
someAction(assetId: number) {
let asset = new FormData();
asset.append("assetId", assetId.toString());
asset.append("UserId", "1");
return this.httpClient.post(this.url + "SomeAction", asset, { headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } }).toPromise();
}
在服务器上(C#):
[HttpPost]
[Route("Service/SomeAction")]
public HttpResponseMessage SomeAction(AccessData asset)
{
return new HttpResponseMessage(_service.LogAsset(asset));
}
实例化服务器上的asset
对象,但不包含客户端发送的值。
此外,删除/更改发送的标头会导致请求完全失败。
编辑: 删除标头会导致错误404,并且在控制台中也有此错误:
从来源“ http://server”访问“ http://localhost”处的XMLHttpRequest 已被CORS政策阻止:未响应预检请求 通过访问控制检查:它没有HTTP正常状态。
将标题更改为“ multipart / form-data”会导致错误415-不支持的媒体类型
编辑#2: 这适用于Postman和HTTPBot(iPhone),但不适用于我的Ionic应用程序
答案 0 :(得分:0)
您有一些代码异味
首先,您需要将Content-Type
更改为
“内容类型”:“多部分/表单数据”
所以您的代码将是这样
headers: new HttpHeaders({
"Content-Type": "multipart/form-data"
})
};
return this.http
.post(this.url + "SomeAction", asset , httpOptions)
和您的控制器中
public HttpResponseMessage SomeAction([FromForm]AccessData asset)
让我知道您是否仍然有问题
答案 1 :(得分:0)
正如您删除Content-Type
标头时在错误中所说的那样:
CORS策略已阻止从来源“ http://server”访问“ http://localhost”处的XMLHttpRequest
答案 2 :(得分:0)
我改用Ionic native http plugin作为解决方案。不过,这还不是我的问题的结局。有关更多信息,请参见此question。
答案 3 :(得分:0)
更新:我最终通过启用CORS解决了该问题。我已经在web.config
中启用了CORS,并希望它能满足要求,但事实证明,我实际上确实需要安装Microsoft.AspNet.WebApi.Cors
软件包并将[EnableCors]
属性添加到我的post方法中。