C# 如何防止ReadAsStringAsync返回双转义字符串?

C# 如何防止ReadAsStringAsync返回双转义字符串?,c#,asp.net-web-api,C#,Asp.net Web Api,我有一个Web API方法,看起来有点像这样: [HttpPost] public ResponseMessageResult Post(Thing thing) { var content = "\r"; var httpResponseMessage = Request.CreateResponse(HttpStatusCode.Accepted, content); return ResponseMessage(htt

我有一个Web API方法,看起来有点像这样:

    [HttpPost]
    public ResponseMessageResult Post(Thing thing)
    {
        var content = "\r";
        var httpResponseMessage = Request.CreateResponse(HttpStatusCode.Accepted, content);
        return ResponseMessage(httpResponseMessage);
    }
在其他一些客户端代码中,当我调用:

    var content = httpResponseMessage.Content.ReadAsStringAsync().Result;
内容
是:

    "\\r"
但我希望它保持原样:

    "\r"

为什么客户端接收到双重转义字符串?如何防止这种情况发生?

您没有收到返回的值
@“\\r”
,您收到的是
“\\r”
-响应中不会出现逐字字符,因为逐字字符只是以特定方式转义字符串的指令-逐字修改器本身不会作为字符串的一部分存储。结果是您应用逐字修改器的内容的适当转义版本

i、 e.
@“\r”
为您提供字符串
“\\r”
,当应用于文本框时,该字符串显示为
\r
——一个转义反斜杠和一个“r”

你只需要去掉初始作业中的逐字修改器


这与
ReadAsStringAsync
无关-您只是在一开始就分配了错误的字符串文字。

如果您得到的是两个字符的文字
\r
序列(
“\\r”
以C形式),那么这几乎肯定就是您要输入的。您说您的Web API方法“看起来有点像这样”。我强烈怀疑问题在于您在问题中发布的内容与实际实现中的内容之间的差异

您需要验证您的响应消息是否包含实际的回车,而不是文本
“\r”
。文本读取API不会寻找文本C#escape序列并专门处理它们,因为C#string escape序列在纯文本中没有任何意义。如果您的文本文件包含文本
c:\name.txt
,那么您不会期望文本读取API将其读取为
c:ame.txt

如果你想找到并转换C风格的转义序列,你必须自己去做。您可以使用如下方法(根据需要添加其他转义序列):

私有静态字符串Unescape(字符串值){
如果(值==null)
返回null;
变量长度=value.length;
var结果=新的StringBuilder(长度);
对于(变量i=0;i
它正在做它正在做的事情,因为你正在用大锤敲打鸡蛋

调用
Request.CreateResponse(HttpStatusCode statusCode,T value)
时,您正在告诉web API您希望使用一个媒体类型格式化程序序列化您的值。因此,Web API将您的
填充到ObjectContent的实例中,并执行大量conneg代码,并确定它可以使用Formatter X序列化您的“对象”

很可能是JSONSerializer正在尽最大努力尝试返回它认为需要的字符串,而不是CR字符

无论如何,您可以直接使用HttpContent对象来避免执行70行代码,该对象设计用于通过线路发送简单字符串

[HttpPost]
public ResponseMessageResult Post(Thing thing)
{
    var content = "\r";
    var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.Accepted) {
      RequestMessage = Request,
      Content = new StringContent(content)
    };
    return ResponseMessage(httpResponseMessage);
}

我知道这样做可能会导致70亿行代码被执行(抱歉,Darrel Miller),但我发现使用这种方法同样有效,对我选择的开发模式的破坏性更小:

response.Content.ReadAsAsync<string>().Result;
注意:
ReadAsAsync
System.Net.Http.HttpContentExtensions
程序集
System.Net.Http.Formatting
中的扩展方法。如果在您的项目中不可用,您可以添加NuGet包。

[HttpPost]
公共异步任务发布(Thing)
{
var content=“\r”;
var httpResponseMessage=Request.CreateResponse(HttpStatusCode.Accepted,content);
var escapedString=await-httpResponseMessage.Content.ReadAsStringAsync();
返回内容(转义字符串,“应用程序/json”);
}  

在我的特定场景中,面对同样的问题&希望它能帮助其他人,这是由于不必要地添加了行造成的

httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

我的代码。在my Azure函数中删除这一行可以消除双转义。

返回的字符串是
“\\r”
,因为
@“\r”
相当于
“\\r”
。如果要传递返回字符而不是转义版本,请删除逐字修改器。如果需要“``.@Ant P,不,我正在接收逐字“@”\\r”@AntP,则JSON需要将其设置为字符串中的
\\r
。文本框显示\r(字面意思)它没有歧义,我设置了值@“\r”,接收了值@“\\r”,但需要值@问题中所述的客户端代码中的“\r”。请您回到我的第一条评论。
\r
文本框中是字符串
“\\r”
,它等于
@\r“
。删除逐字字符。抱歉,您是对的。我的问题中的逐字字符串是由于看了太长时间并试图调整我的代码以适应该问题而产生的混乱。我已经更新了这个问题。谢谢你,你大大改善了我的一天@达雷尔,我喜欢这个。。浪费了大约3个小时来寻找魅力:)这个答案对我更有效。上述扩展方法可在Microsoft.AspNet.WebA中找到
await response.Content.ReadAsAsync<string>();
response.Content.ReadAsStringAsync().Result;
     [HttpPost]
     public async Task<string> Post(Thing thing)
     {
         var content = "\r";
         var httpResponseMessage = Request.CreateResponse(HttpStatusCode.Accepted, content);
         var escapedString = await httpResponseMessage.Content.ReadAsStringAsync();
         return Content(escapedString, "application/json");            
     }  
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));