繁体   English   中英

即使使用Newtonsoft.Json.JsonConvert进行序列化,REST服务也会收到(400)错误的特殊字符请求

[英]Rest service getting (400) Bad Request for special characters even after serializing with Newtonsoft.Json.JsonConvert

我在C#中拥有一个宁静的Web服务,该服务将JSON POST用于HttpWebRequest。 在客户端,输入数据将使用Newtonsoft.Json.JsonConvert.SerializeObject方法转换为JSON格式。 为了发送数据,使用utf-8编码的IO.Stream。 即使使用普通的特定字符,我在发送数据时也没有任何问题。 但是对于一些奇怪的输入文本,例如“ profes?sional”,我遇到了(400)Bad Request错误,在这种情况下,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 = "profes￾sional";
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);
}

解决此问题的一种可能方法是使用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字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM