WSE 2.0中使用Stream作为附件

开始想直接写dimeStream没有成功
改用MemoryStream再用dimeAttach的Stream构造函数
必须要将Stream Seek 到SeekOrigin.Begin才能成功

 1        /// <summary>
 2        /// 分块下载附件
 3        /// </summary>
 4        /// <param name="sFileName">文件名</param>
 5        /// <param name="offset">文件起始偏移量</param>
 6        /// <param name="size">一次读取大小</param>
 7        /// <returns>返回附件文件大小</returns>

 8        [WebMethod]
 9        public int GetPartitionAttachment( string sFileName,int offset, int size)
10        {
11            string[] names = sFileName.Split("\\".ToCharArray());
12            string filename=Server.MapPath(names[names.Length - 1]);
13
14            byte[] buffer = new byte[size];            
15            FileStream fs = new FileStream(filename, FileMode.Open,FileAccess.Read,FileShare.Read);
16            fs.Seek(offset,SeekOrigin.Begin);
17            int numBytes;            
18            if((numBytes = fs.Read(buffer,0,size)) > 0)
19            {
20                try
21                {                    
22                    MemoryStream ms = new MemoryStream(buffer,0,size);                    
23                    ms.Seek(0,SeekOrigin.Begin);
24
25                    ResponseSoapContext.Current.Attachments.Add(new dime.DimeAttachment("File","image/jpeg",dime.TypeFormat.MediaType,ms));
26                    return numBytes;
27                }

28                finally
29                {
30                    fs.Close();    
31                }

32            }

33            else
34            {
35                return 0;
36            }

37            
38        }


客户端代码示例:

 1  private void button2_Click(object sender, System.EventArgs e)
 2  {
 3   int offset = 0;
 4   int buffersize = 3* 1024*1024;
 5   bool bComplete = false;
 6   FileStream fs = null;
 7   string sFileName = textBox1.Text;
 8   Adb.AdvWse adv = new TestWebSrv.Adb.AdvWse();
 9   byte[] buffer = new byte[buffersize];
10   int size = 0;
11   int result = 0;
12   System.DateTime time = DateTime.Now;
13
14   while!bComplete )
15   {
16    Application.DoEvents();
17    try
18    {
19     result = adv.GetPartitionAttachment(sFileName,offset,buffersize);
20     if (result == 0
21     {
22      bComplete = true;
23      break;
24     }

25     if (adv.ResponseSoapContext.Attachments.Count != 0)
26     {
27      fs = new System.IO.FileStream(sFileName,FileMode.OpenOrCreate,FileAccess.Write);
28      fs.Seek(0,SeekOrigin.End);
29      size = adv.ResponseSoapContext.Attachments[0].Stream.Read(buffer,0,buffersize);      
30      fs.Write(buffer,0,result);
31      offset += result;
32      textBox2.Text = offset.ToString()+"Bytes Received\r\n" + textBox2.Text;
33      Application.DoEvents();
34     }

35     else
36     {
37      bComplete = true;
38      break;
39     }

40    }

41    finally
42    {
43     fs.Close();
44    }

45
46    System.TimeSpan time1 = DateTime.Now - time;
47    this.Text = time1.ToString();
48   }

49
50   
51  }

52
原文地址:https://www.cnblogs.com/calmzeal/p/311422.html