调用WebAPI时传递UTF8字符遇到DecoderFallbackException

在调用Web API的时候使用POST,传递的Parameter包含了UTF8字符。有时候发现在Web API Service端的代码中无法对传递过来的值进行反序列化,获得的只是一个null。这个值,在客户端进行反序列化并没有问题,问题只发生在服务器端反序列化的时候。进行了问题排查之后,发现是客户端在调用Web API的时候,没有指定字符集,使得服务器端在反序列化的时候使用了Unicode进行反序列化,导致服务器端反序列化没有成功。

问题描述

在调用Web API的时候使用POST,传递的Parameter包含了UTF8字符。有时候发现在Web API Service端的代码中无法对传递过来的值进行反序列化,获得的只是一个null。这个值,在客户端进行反序列化并没有问题,问题只发生在服务器端反序列化的时候。问题发生的时候,与传入的字符内容有关。如果包含了中文字符,那么问题将会发生.

img

问题排除

在问题排查的过程中,首先通过发送比较简单的参数,确认了Web API和Client端配置和Coding都没有问题。

在发送更多的内容,并且包含了中文字符的时候,能够稳定重现问题。在Visual Studio中,把断点设定在了被调用的API上。通过检查this.ModelState里面的内容判断接收的参数是否存在问题。

img

在里面发现其中包含了一个错误 - System.Exception.DecoderFallbackException. 问题排查到此后发现了问题的根源所在。 “Unable to translate bytes [B3] at index 52 from specifed code page to Unicode”.

img

问题解决

检查过客户端的代码后发现没有指定Encoding的类型。 在指定 client.Encoding = System.Text.Encoding.UTF8 后问题得到了解决。

1
2
3
4
5
6
7
8
using (WebClient client = new WebClient())
{
client.Headers[HttpRequestHeader.ContentType] = "application/json";
client.Encoding = System.Text.Encoding.UTF8;

Uri uri = new Uri(new Uri(SvcHOSTNAME), WebAPIName);
client.UploadString(uri, json);
}

Sonic Guo