簡體   English   中英

Angular POST從ASP.NET Core Web API返回500錯誤

[英]Angular POST returns 500 error from ASP.NET Core Web API

我正在將data從Angular客戶端發布到ASP.NET Core Web API。 如果data包含ć,č,š之類的拉丁字符,則返回500 Internal error,否則返回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'
        })
    });
}

網絡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狀態。

但是,即使č,ć,ž之類的字符即使返回201也屬於url字符串,但在瀏覽器中我卻在控制台中看到以下錯誤消息:

"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)

Angular一次只能支持一種語言,因此,如果您想從英語切換到拉丁語,則需要重新加載應用程序上下文。

更多詳細信息請參見Angular 5國際化

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。

在RequestOptionsArgs中指定字段responseType:ResponseContentType。 (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而不是theLink.Url ,它不會包含非ASCII字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM