C#对网络流的操作

1.对于按照Stream方式来进行传输的WCF应用,有一个非常重要的限制,那就是调用参数或者返回值只能有一个,并且必须是Stream类型。比如,下面的方法签名都是能支持Stream的:
void StreamIn(Stream input)   //  void StreamIn(Stream input, int additional)则不行
Stream StreamOut()  // Stream StreamOut(out string additional)则不行
Stream StreamInAndOut(Stream input)
void StreamInAndOut(Stream input, out Stream result)
如果不满足这个限制,整个处理模型会自动转回成Buffered的模式。

2.自己尝试在WCF中用Streamed的方式来读取文件,涉及到对流的操作问题,在网上找到一篇不错的文章(http://hi.baidu.com/czyblues/blog/item/8b5c3b0e268413c87bcbe19c.html),摘录一小段如下:

你平时是怎么读取文件的?使用流读取。是的没错,C#给我们提供了非常强大的类库(又一次吹捧了.NET一番),里面封装了几乎所有我们可以想到的和我们没有想到的类,流是读取文件的一般手段,那么你真的会用它读取文件中的数据了么?真的能读完全么?通常我们读取一个文件使用如下的步骤: 1、声明并使用File的OpenRead实例化一个文件流对象,就像下面这样 
FileStream fs = File.OpenRead(filename); 
或者 FileStream fs = FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read); 
2、准备一个存放文件内容的字节数组,fs.Length将得到文件的实际大小,就像下面这样 byte[] data = new byte[fs.Length]; 
3、哇!开始读了,调用一个文件流的一个方法读取数据到data数组中 fs.Read (data, 0, data.Length); 呵呵!我们只写了3句就可以把文件里面的内容原封不动的读出来,真是太简洁了!可以这段代码真的能像你预期的那样工作么?答案是:几乎可以!在大部分情况下上面的代码工作的很好,但是我们应该注意Read方法是有返回值的,既然有返回值那么一定有其道理,如果按照上面的写法完全可以是一个没有返回值的函数。我想返回值的目的是,为了给我们一个机会判断实际读取文件的大小,从而来判断文件是否已经完全读完。所以上面的代码不能保证我们一定读完了文件里面的所有字节(虽然在很多情况下是读完了)。
 

特别当我们要处理的流是网络流的时候,我们根本得不到它的Length属性,所以我们要使用下面这样的方法,先开辟一个初始缓存区,然后不停的用流向缓冲区写入。当缓冲区用完了而流还没到结束的时候,加大缓冲区的长度,直到流的结尾。代码如下:


//对于网络流,我们无法获取其长度。

// 故而从网上找了这个方法,以一种使用指定缓存长度的方式读取流。
public   static   byte [] Read2Buffer(Stream stream,  int  BufferLen)
{
    
// 如果指定的无效长度的缓冲区,则指定一个默认的长度作为缓存大小
    if (BufferLen < 1)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值