在 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 服务操作

Restful风格wcf调用4——权限认证

如何在 WCF Rest Service 中传递多个参数:C# 中的字符串和流

WCF Rest 服务中的日期序列化

以编程方式创建 WCF REST 客户端代理(在 C# 中)