Angular POST从ASP.NET Core Web API返回500错误

时间:2018-04-24 10:21:00

标签: c# angular typescript http asp.net-core-webapi

我将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后将无法达到成功阻止。在没有这些特殊字符的其他情况下,它可以正常工作。

网络响应:

network response

修改

我实际上现在发现了服务器错误:

InvalidOperationException: Invalid non-ASCII or control character in header: 0x0161

Microsoft.AspNetCore.Server.Kestrel.Internal.Http.FrameHeaders.ThrowInvalidHeaderCharacter(char ch)

2 个答案:

答案 0 :(得分:0)

Angular一次只能支持一种语言,所以如果你想从英语切换到拉丁语,你需要重新加载应用程序上下文..

此处有更多详情Angular 5 internationalization

答案 1 :(得分:0)

jdweng是对的。 UTF-8不包括您提到的字符:http://www.utf8-chartable.de/

另一方面,ISO-8859-2包括:https://www.terena.org/activities/multiling/ml-docs/iso-8859.html

如上所述:https://stackoverflow.com/a/43164489/4770754

  

发送请求时包含RequestOptionsArgs。

     

在里面指定字段responseType:ResponseContentType   RequestOptionsArgs。 (ResponseContentType.ArrayBuffer或   ResponseContentType.Blob)

     

使用TextDecoder或类似的东西来解码结果。

     

参见文档:

     

https://angular.io/api/http/Http

     

https://angular.io/api/http/RequestOptions

     

https://angular.io/api/http/ResponseContentType

更新:

或者你可以按照你的说法去做,而不是theLink.Name使用theLink.Url,它不会包含非ASCII字符。