在 wcf rest 服务 C# 中使用 Stream 作为输入时缺少第一个元素
Posted
技术标签:
【中文标题】在 wcf rest 服务 C# 中使用 Stream 作为输入时缺少第一个元素【英文标题】:The first element is missing when using Stream as input in wcf rest service C# 【发布时间】:2020-04-27 04:20:53 【问题描述】:我有一个以 Stream 作为输入参数的 wcf 休息服务:
[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
void ImportStream(Stream data);
我的代码:
public void ImportStream(Stream data)
if (data.ReadByte() != -1)
using (var reader = new StreamReader(data))
string textRead = reader.ReadToEnd();
这是我在 POSTMAN 中输入的文本:
D_CA,P_AMOUNT,D_AN,D_PE,D_RU,D_ORU,D_AC,,D_GO,D_LE,D_NU,D_CO,D_MU,D_PMU,D_DP,P_COMMENT
A,100,,2019.12,S000,S000,XA1810,F00,PACK01,,S002,EUR,ORIG07-01,0000.PACKAGE,,,,,,2019.12,
A,100,,2019.12,S000,S000,XA1810,F00,PACK01,,S004,EUR,ORIG07-01,0000.PACKAGE,,,,,,2019.12,
结果,我有 textRead:
"_CA,P_AMOUNT,D_AN,D_PE,D_RU,D_ORU,D_AC,,D_GO,D_LE,D_NU,D_CO,D_MU,D_PMU,D_DP,P_COMMENT ....... "
如您所见,第一个字符“D”不见了!?
我该如何解决?谢谢
【问题讨论】:
好吧,您正在从Stream
读取第一个字节,然后然后将Stream
传递给StreamReader
。答案肯定是......在将Stream
传递给StreamReader
之前不要读取第一个字节?
ReadByte 方法会提升文件指针的位置,向前移动一个字节。 StreamReader 将在一个字节位置后读取流。结果,输出字符串将丢失一个字节。在 ASCII 中,一个字节(8 位)通常代表 256 个字符之一。即,缺少一个字母。您可以使用以下方法来确定指针的位置。 if (data.Position!= -1)
【参考方案1】:
如果查看文档,ReadBytes
的问题
FileStream.ReadByte 方法
从文件中读取一个字节并将读取位置前进一个字节。
将流位置设置为文件的开头。
public void ImportStream(Stream data)
if (data.ReadByte() != -1)
data.Seek(0, SeekOrigin.Begin);
using (var reader = new StreamReader(data))
string textRead = reader.ReadToEnd();
【讨论】:
请注意Length
并不总是可用
并非所有流都可搜索
感谢您的回复,我尝试了您的代码,但“data.Seek(0, SeekOrigin.Begin);”行出现错误:不支持指定的方法。以上是关于在 wcf rest 服务 C# 中使用 Stream 作为输入时缺少第一个元素的主要内容,如果未能解决你的问题,请参考以下文章
C# Restful WCF 服务。无法在帖子正文中反序列化 XML
当 BodyStyle = WebMessageBodyStyle.Wrapped 时从 C# 调用 Rest WCF 服务操作