.NET Core中如何返回含整数的HttpResponseMessage?
解决.NET Core中返回整数响应适配遗留API的问题
首先,你的问题核心出在写入流后没有重置流的位置,而且其实有更简洁的实现方式,完全不用手动操作MemoryStream和StreamWriter。让我一步步给你拆解分析:
为什么你的原有代码不起作用?
你用StreamWriter把100写入MemoryStream后,流的当前读取位置已经跳到了末尾。当StreamContent去读取这个流时,会从当前位置开始读取,自然拿不到任何内容——接收端的reader.ReadToEnd()得到的是空字符串,Int32.TryParse当然会直接失败。
另外,虽然StreamWriter的using块会自动flush内容到流,但它不会帮你重置流的位置,这是导致问题的关键。
修复方案1:调整你的现有代码
只需要在返回HttpResponseMessage之前,把MemoryStream的位置重置到开头,同时注意让StreamWriter不要关闭流:
using (MemoryStream ms = new MemoryStream()) { using (StreamWriter sw = new StreamWriter(ms, leaveOpen: true)) // 设置leaveOpen避免StreamWriter关闭ms { sw.Write(100); sw.Flush(); // 确保内容完全写入流 ms.Seek(0, SeekOrigin.Begin); // 把流的位置重置到开头 return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StreamContent(ms) }; } }
修复方案2:用更简洁的StringContent(推荐)
既然你要返回的是字符串形式的整数,直接用StringContent会更简单,完全规避手动操作流的麻烦,行为也和ASP.NET的Request.CreateResponse完全一致:
return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("100", System.Text.Encoding.UTF8, "text/plain") };
这个方式返回的是纯文本格式的"100",接收端的reader.ReadToEnd()会拿到完整的字符串,Int32.TryParse就能成功解析出整数100。
关于接收端的说明
你的接收端代码逻辑是没问题的,只要发送端返回的是纯文本形式的"100",reader.ReadToEnd()就能拿到正确的内容,Int32.TryParse自然会成功。
内容的提问来源于stack exchange,提问作者SBFrancies
相关产品推荐
相关产品推荐

