4

我必须调用一个 asmx webservice,它接受 AttachmentData 作为参数。这有一个类型为 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 服务请求的大小。

4

1 回答 1

3

Base 64 编码在输入中每 3 个字节需要 4 个字节在输出中,因此会有一些开销,但并没有那么多。

Base 64 编码的好处是它只使用可打印的字符,因此很容易嵌入到 HTTP 协议中,该协议是为处理人类可读的文本字符而构建的。

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

于 2013-03-14T14:26:37.253 回答