无法将索引35处的字节[FC]从指定代码页转换为Unicode

DVM*_*DVM 8 .net asp.net unicode asp.net-core-mvc asp.net-core

我正在尝试将这样的对象发送到我的REST API(使用asp net core构建)

{
    "firstName":"tersü",
    "lastName":"asda"
}
Run Code Online (Sandbox Code Playgroud)

这就是SoapUI的标题形式:

 Accept-Encoding: gzip,deflate
Content-Type: application/json:charset=UTF-16
Host: localhost:4004
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Run Code Online (Sandbox Code Playgroud)

但是,我actionContext.ModelState总是无效的,因为它不适用于变音符号.例外情况如下:

无法将索引35处的字节[FC]从指定代码页转换为Unicode

如果有任何帮助,方法签名如下所示:

[ValidateUserData]
public async Task<IActionResult> Update(string userId, [FromBody] UpdateUserRequest updateRequest)
Run Code Online (Sandbox Code Playgroud)

基本上代码永远不会过去

if (!actionContext.ModelState.IsValid)
{
    actionContext.Result = new BadRequestObjectResult(actionContext.ModelState);
}
Run Code Online (Sandbox Code Playgroud)

[ValidateUserData]属性内

我在这里错过了什么?

Jcl*_*Jcl 11

您正在发送编码的字符串utf-16,但是(在Content-Type标题的字符集中)告诉它utf-8.

tersüin 的字节utf-8是:

74,65,72,73,C3,BC
Run Code Online (Sandbox Code Playgroud)

但是tersü(in utf-16)包含字节(注意FC那里):

74,0,65,0,72,0,73,0,FC,0
Run Code Online (Sandbox Code Playgroud)

(在这个小提琴中检查)

所以它无法理解它.因此,要么utf-8在发送之前将字符串转换为客户端,要么将Content-Type字符集设置为utf-16.