休息服务获取(400)即使在使用Newtonsoft.Json.JsonConvert进行序列化后,仍然需要特殊字符

时间:2017-09-27 10:00:29

标签: c# json rest

我在C#中有一个安静的Web服务,它使用JSON POST进行HttpWebRequest。在客户端,输入数据将使用Newtonsoft.Json.JsonConvert.SerializeObject方法转换为JSON格式。对于发送数据,使用具有utf-8编码的IO.Stream。即使使用正常的特定字符,我也没有任何问题。但对于一些奇怪的输入文本,如“专业”,我得到(400)错误请求错误,似乎这个特定情况Newtonsoft.Json无法序列化。

任何帮助将不胜感激。相关代码分享如下:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(restServiceUrl);
            request.Timeout = int.Parse((cmbTimeout.SelectedItem as ComboBoxItem).Value.ToString()) * 1000;
request.Method = "POST";
request.ContentType = "application/json;charset=utf-8";
var readTextParams = new RESTReadTextParameters();
readTextParams.Text = "professional";
readTextParams.Speaker = "M";
var data = Newtonsoft.Json.JsonConvert.SerializeObject(readTextParams);

System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();

byte[] bytes = encoding.GetBytes(data);
request.ContentLength = bytes.Length;
using (Stream requestStream = request.GetRequestStream())
{
      requestStream.Write(bytes, 0, bytes.Length);
}

1 个答案:

答案 0 :(得分:0)

此问题的一种可能解决方案是使用Base64编码。用于编码输入文本的代码示例如下所示:

System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
readTextParams.Text = Convert.ToBase64String(encoding.GetBytes(readTextParams.Text.ToCharArray()));
data = Newtonsoft.Json.JsonConvert.SerializeObject(readTextParams);
byte[] bytes = encoding.GetBytes(data);
request.ContentLength = bytes.Length;
using (Stream requestStream = request.GetRequestStream())
{
      requestStream.Write(bytes, 0, bytes.Length);
}

在服务器端,我们必须解码Base64字符串。