.NET的优秀之处就是简化了解决方案的开发方法。你不用在模块内部具体细节上劳神,而仅仅利用几行代码,就可以建立一个强大的解决方案。
标准化保证了模块的协调工作,框架(Framework)为组件相互之间进行良好的通讯提供了保证,.NET Web服务器就是可以实现这种转化。在这篇文章中,我们将开发一个像操作二进制数据一样来接收和生成文件的Web服务器。
通过网络传送数据有它的不利之处,例如,不同的操作系统对二进制的处理是不同的。为了避免数据冲突,应采用64位的译码方案来处理二进制数据,这样无论本地机采用什么样的操作系统都可以把数据转化为本地机可以识别的语法。
如果想利用网络来发送文件,首先要打开文件,把内容读到缓冲区,对缓冲区数据进行译码;然后再把译码后的数据发送出去。在传统的ASP程序中,必须要用 ADODB.Stream对象打开文件,然后再利用CAPICOM.Utilities的功能对其数据流进行译码,最后把函数的返回值设为String或者把译码后的字符串写入到Response缓冲器,这听起来似乎有些难度。
利用.NET,在System.IO名称空间中使用File类来打开一个文件,它返回一个Stream对象,你可以将它映射为BinaryReader或 BinaryWriter对象,使用BinaryReader对象的ReadBytes函数,用字节型的数组存放Web函数的返回值。
下面就是程序代码:
〈%@ WebService language="C#" class="FileRW" Debug="true" %>
using System;
using System.Web.Services;
using System.Xml.Serialization;
using System.IO;
[WebService(Namespace="http://someplace.com/FileIO/")]
public class FileRW : WebService {
[WebMethod]
public byte[] GetFile(string filename) {
BinaryReader binReader = new
BinaryReader(File.Open(Server.MapPath(filename), FileMode.Open,
FileAccess.Read));
binReader.BaseStream.Position = 0;
byte[] binFile =
binReader.ReadBytes(Convert.ToInt32(binReader.BaseStream.Length));
binReader.Close();
return binFile;
}
[WebMethod]
public void PutFile(byte[] buffer, string filename) {
BinaryWriter binWriter = new
BinaryWriter(File.Open(Server.MapPath(filename), FileMode.CreateNew,
FileAccess.ReadWrite));
binWriter.Write(buffer);
binWriter.Close();
}
}
函数GetFile()接收一个字符串参数filename,利用文件的当前目录和文件名来找到文件,文件以BinaryReader方式打开并得到读的权限,所有文件的字节存放在本地变量type 中,byte[]是一个字节数组,关闭文件流然后Web函数返回byte数组。
PutFile()函数接收字节型数组buffer和一个字符串filename,同时创建一个名为filename的 BinaryWriter类型的文件,利用ReadWrite进行读写。字节型数组被写入到文件流然后关闭文件流。
