C# 由于编码和转义字符问题,Http请求以错误请求结束

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编码示例 预期输出:它们应该

注意:代码在F#中,但在C#中进行标记,因为从对象转换为json时,这是整个.net中的一个通用编码和转义字符问题,请查看页面底部的输出


以下请求以错误请求结尾,请查看任何差异,尤其是在
编码.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