我将Angular客户端的data
发布到ASP.NET Core Web API。如果data
有拉丁欧洲字符,如ć,č,š,则返回500内部错误,否则返回201.
这是data
类:
export class FinalFormData {
name: string;
url: string;
dateCreated: Date;
tags: any[];
}
处理POST功能数据的功能:
this.data.postData(this.finalData)
.subscribe(data => {
this.finalData = data;
this.router.navigate(["/"]);
}, err => console.log(err));
发布数据的功能:
public postData(data: FinalFormData): Observable<FinalFormData> {
return this.http.post<FinalFormData>("/api/links", data, {
headers: new HttpHeaders({
'Content-Type' : 'application/json; charset=utf-8'
})
});
}
Web API
[HttpPost("")]
public async Task<IActionResult> Post([FromBody]FinalFormViewModel theLink)
{
if (ModelState.IsValid)
{
var newLink = new Links
{
UserName = User.Identity.Name,
Url = theLink.Url,
Name = theLink.Name,
DateCreated = DateTime.UtcNow
};
//newLink.Name = _repository.GetTitle(newLink.Url);
_repository.AddLink(newLink);
_context.SaveChanges();
Links link = _repository.GetLinkByName(newLink.Name);
foreach (var tag in theLink.Tags)
{
var newTag = new Tags
{
Name = tag
};
_repository.AddTag(link, newTag, newLink.UserName);
}
// Returning data
var data = new FinalFormViewModel()
{
Name = newLink.Name,
Url = newLink.Url,
DateCreated = newLink.DateCreated,
Tags = newLink.Tags.Select(t => t.Name).ToList()
};
if (await _repository.SaveChangesAsync())
{
return Created($"api/links/{theLink.Name}", data);
}
}
return BadRequest("Failed to save the link");
}
在Web API中调试时,每个代码都到达return Created($"api/links/{theLink.Name}", data);
,这意味着它返回201状态。
但是如果那些像č,ć,ž这样的字符是url
字符串的一部分,即使它重新编号为201,在浏览器中我也会在控制台中收到错误消息:
"Http failure response for http://localhost:54105/api/links: 500 Internal Server Error"
此订阅Observable后将无法达到成功阻止。在没有这些特殊字符的其他情况下,它可以正常工作。
网络响应:
修改
我实际上现在发现了服务器错误:
InvalidOperationException: Invalid non-ASCII or control character in header: 0x0161
Microsoft.AspNetCore.Server.Kestrel.Internal.Http.FrameHeaders.ThrowInvalidHeaderCharacter(char ch)
答案 0 :(得分:0)
Angular一次只能支持一种语言,所以如果你想从英语切换到拉丁语,你需要重新加载应用程序上下文..
答案 1 :(得分:0)
如上所述:https://stackoverflow.com/a/43164489/4770754
发送请求时包含RequestOptionsArgs。
在里面指定字段responseType:ResponseContentType RequestOptionsArgs。 (ResponseContentType.ArrayBuffer或 ResponseContentType.Blob)
使用TextDecoder或类似的东西来解码结果。
参见文档:
https://angular.io/api/http/Http
更新:
或者你可以按照你的说法去做,而不是theLink.Name
使用theLink.Url
,它不会包含非ASCII字符。