2013-03-14 91 views
4

我必须调用asmx webservice,它接受AttachmentData作为参数。这有一个类型为base64Binary的成员。如何在调用asmx webservice时发送base64Binary的数据

<s:complexType name="AttachmentData"> 
<s:sequence> 
<s:element minOccurs="0" maxOccurs="1" name="FileName" type="s:string" /> 
<s:element minOccurs="0" maxOccurs="1" name="UploadedUserName" type="s:string" /> 
<s:element minOccurs="0" maxOccurs="1" name="Attachment" type="s:base64Binary" /> 
</s:sequence> 
</s:complexType> 

我送一个文件的内容为附件成员如下:

//read the file contents 
byte[] buffer = null; 
    try { 
     FileInfo attachment = new FileInfo(filepath); 
     using (FileStream stream = attachment.OpenRead()) { 
      if (stream.Length > 0) { 
       buffer = new byte[stream.Length]; 
       stream.Read(buffer, 0, (int)stream.Length); 
      } 
     } 
    } 
    catch { 
     buffer = null; 
    } 

//create AttachmentData object 
WebSrvc.AttachmentData att = new WebSrvc.AttachmentData(); 
att.FileName = fileName; 
att.Attachment = buffer; 

这是送base64Binary的正确方法是什么?我是否需要将文件内容编码为base64或者是否即时完成?我正在尝试通过使用上面的代码来看看是否会不必要地膨胀web服务请求的大小。

+0

你有这个代码的问题吗? – 2013-03-14 13:45:56

+0

不,它工作正常,但我只是在考虑请求的大小。只要检查一下,看看是否有更好的方法可以在请求中以较小的尺寸做同样的事情。此外,我想了解如何将字节数组转换为base64Binary和字节数组和base64Binary之间的区别是什么大小明智。 – 2013-03-14 13:49:56

回答

3

A Base 64 encoding在输入中每输入3个字节需要4个字节,所以存在一定的开销,但并不是那么多。

Base 64编码的好处在于它只使用可打印的字符,因此可以很容易地嵌入到HTTP协议中,该协议可以与人类可读的文本字符一起工作。

在您的代码示例中,byte []缓冲区在被置于线路(即嵌入并以HTTP协议传输)之前会自动转换为Base 64。

+0

感谢您的信息! – 2013-03-14 17:07:08