C# 由于编码和转义字符问题,Http请求以错误请求结束
注意:代码在F#中,但在C#中进行标记,因为从对象转换为json时,这是整个.net中的一个通用编码和转义字符问题,请查看页面底部的输出C# 由于编码和转义字符问题,Http请求以错误请求结束,c#,.net,encoding,f#,C#,.net,Encoding,F#,注意:代码在F#中,但在C#中进行标记,因为从对象转换为json时,这是整个.net中的一个通用编码和转义字符问题,请查看页面底部的输出 以下请求以错误请求结尾,请查看任何差异,尤其是在编码.Default.GetString中,然后重新编码到系统.Text.Encoding.ASCII.GetBytes中 上下文:一个对象被序列化并写入PUT请求的主体,并最终成为坏请求400。JSON被正确序列化,我可以通过Console.WriteLine 我从中获取了JSON编码示例 预期输出:它们应该
以下请求以错误请求结尾,请查看任何差异,尤其是在
编码.Default.GetString
中,然后重新编码到系统.Text.Encoding.ASCII.GetBytes
中
上下文:一个对象被序列化并写入PUT请求的主体,并最终成为坏请求400。JSON被正确序列化,我可以通过Console.WriteLine
我从中获取了JSON编码示例
预期输出:它们应该只有正斜杠,不能转义字符
/出版物/d40a4e4c-d6a3-45ae-98b3-924b31d8712a
我猜是什么原因导致字符在编码过程中被转义,有没有办法修复它
编辑
我还注意到memoryStream.ToArray()
返回一个字节[]
,因此我没有进行编码,而是尝试了以下方法,但没有任何区别
let data:byte[]=memoryStream.ToArray()
requestStream.Write(数据,0,数据.长度)
在Charles proxy中,我看到了管道破裂的消息。
添加对Newtonsoft.Json NuGet包的引用,并将其添加到F#文件的顶部: 然后尝试将其作为更新方法的主体(它显式使用UTF-8编码,而不是ASCII或平台默认值):
let url=”http://example.com"
让serialized=JsonConvert.SerializedObject(架构)
let数据:byte[]=Encoding.UTF8.GetBytes(序列化)
让request=WebRequest.Create(url):?>HttpWebRequest
请求。方法问题出了什么问题?
let update (schema: Article) : Article =
let url = "http://example.com"
use memoryStream = new MemoryStream()
(new DataContractJsonSerializer(typeof<Article>)).WriteObject(memoryStream, schema)
let d = Encoding.Default.GetString(memoryStream.ToArray()) // I suspect problem may be here
let data : byte[] = System.Text.Encoding.ASCII.GetBytes(d); // or here
let request = WebRequest.Create(url) :?> HttpWebRequest
request.Method <- "PUT"
request.ContentType <- "application/json;charset=UTF-8"
request.Accept <- "application/json;charset=UTF-8"
request.ContentLength <- (int64)data.Length
use requestStream = request.GetRequestStream()
requestStream.Write(data, 0, data.Length)
requestStream.Flush()
requestStream.Close()
let response = request.GetResponse() :?> HttpWebResponse
use reader = new StreamReader(response.GetResponseStream())
use memoryStream = new MemoryStream(ASCIIEncoding.Default.GetBytes(reader.ReadToEnd()))
let result = (new DataContractJsonSerializer(typeof<Article>)).ReadObject(memoryStream) :?> Article
reader.Close()
response.Close()
request.Abort()
result
\/publication\/d40a4e4c-d6a3-45ae-98b3-924b31d8712a\/altasset\/c42d0df7-a563-4bb5-b7fa-313e6a98032f\/
open Newtonsoft.Json
let url = "http://example.com"
let serialized = JsonConvert.SerializeObject(schema)
let data : byte[] = Encoding.UTF8.GetBytes(serialized)
let request = WebRequest.Create(url) :?> HttpWebRequest
request.Method <- "PUT"
request.ContentType <- "application/json;charset=UTF-8"
request.Accept <- "application/json;charset=UTF-8"
request.ContentLength <- (int64)data.Length
use requestStream = request.GetRequestStream()
requestStream.Write(data, 0, data.Length)
requestStream.Flush()
requestStream.Close()
let response = request.GetResponse() :?> HttpWebResponse
use reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)
let result = JsonConvert.DeserializeObject<Article>(reader.ReadToEnd())
reader.Close()
response.Close()
request.Abort()
result