有时候我们通常需要把上传的图片或其他文件放在其他服务器上,以便和网站服务器分开,这时候ASP.NET的WebService就派上大用场 了。我们可以在文件服务器上运行一个WebService,提供上传和下载文件的方法,然后在网站服务器上的网站中引用这个WebService,调用上 传或下载的方法,实现对远程服务器上的文件上传和下载的功能。以下操作在VS2005环境中完成。


      先新建一个WebService项目UpDownFile,里面自动建了一个叫Service1的asmx和cs文件,看不顺眼这个名字的就把它重命名吧,我就把它 重命名为了UpDownFile.asmx,把里面的class也重命名为UpDownFile了,这样看起来顺眼多了 利用WebService实现远程服务器文件的上传和下载_重命名


UpDownFile.asmx.cs的代码如下:


利用WebService实现远程服务器文件的上传和下载_上传文件_02

利用WebService实现远程服务器文件的上传和下载_服务器_03using System;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Data;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Collections;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.Services;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.Services.Protocols;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.ComponentModel;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.IO;

利用WebService实现远程服务器文件的上传和下载_服务器_03

利用WebService实现远程服务器文件的上传和下载_服务器_03namespace UpDownFile

利用WebService实现远程服务器文件的上传和下载_上传文件_13{

利用WebService实现远程服务器文件的上传和下载_重命名_14    /// <summary>

利用WebService实现远程服务器文件的上传和下载_服务器_15    /// UpDownFile 的摘要说明

利用WebService实现远程服务器文件的上传和下载_服务器_16    /// </summary>

利用WebService实现远程服务器文件的上传和下载_服务器_15    [WebService(Namespace = "http://tempuri.org/")]

利用WebService实现远程服务器文件的上传和下载_服务器_15    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

利用WebService实现远程服务器文件的上传和下载_服务器_15    [ToolboxItem(false)]

利用WebService实现远程服务器文件的上传和下载_服务器_15    public class UpDownFile : System.Web.Services.WebService

利用WebService实现远程服务器文件的上传和下载_重命名_14    {

利用WebService实现远程服务器文件的上传和下载_服务器_15        //将Stream流转换为byte数组的方法。

利用WebService实现远程服务器文件的上传和下载_服务器_15        //PS:原本想把这个方法也当做WebMethod的,因为客户端在上传文件时也要调用该方法,后来发现Stream类型的不能通过WebService传输。。。:(

利用WebService实现远程服务器文件的上传和下载_服务器_15        public byte[] ConvertStreamToByteBuffer(Stream s)

利用WebService实现远程服务器文件的上传和下载_重命名_14        {

利用WebService实现远程服务器文件的上传和下载_服务器_15            MemoryStream ms = new MemoryStream();

利用WebService实现远程服务器文件的上传和下载_服务器_15            int b;

利用WebService实现远程服务器文件的上传和下载_服务器_15            while ((b = s.ReadByte()) != -1)

利用WebService实现远程服务器文件的上传和下载_重命名_14            {

利用WebService实现远程服务器文件的上传和下载_服务器_15                ms.WriteByte((byte)b);

利用WebService实现远程服务器文件的上传和下载_服务器_16            }

利用WebService实现远程服务器文件的上传和下载_服务器_15            return ms.ToArray();

利用WebService实现远程服务器文件的上传和下载_服务器_16        }

利用WebService实现远程服务器文件的上传和下载_服务器_15

利用WebService实现远程服务器文件的上传和下载_服务器_15        //上传文件至WebService所在服务器的方法,这里为了操作方法,文件都保存在UpDownFile服务所在文件夹下的File目录中

利用WebService实现远程服务器文件的上传和下载_服务器_15        [WebMethod]

利用WebService实现远程服务器文件的上传和下载_服务器_15        public bool Up(byte[] data, string filename)

利用WebService实现远程服务器文件的上传和下载_重命名_14        {

利用WebService实现远程服务器文件的上传和下载_服务器_15            try

利用WebService实现远程服务器文件的上传和下载_重命名_14            {

利用WebService实现远程服务器文件的上传和下载_服务器_15                FileStream fs = File.Create(Server.MapPath("File/") + filename);

利用WebService实现远程服务器文件的上传和下载_服务器_15                fs.Write(data, 0, data.Length);

利用WebService实现远程服务器文件的上传和下载_服务器_15                fs.Close();

利用WebService实现远程服务器文件的上传和下载_服务器_15                return true;

利用WebService实现远程服务器文件的上传和下载_服务器_16            }

利用WebService实现远程服务器文件的上传和下载_服务器_15            catch

利用WebService实现远程服务器文件的上传和下载_重命名_14            {

利用WebService实现远程服务器文件的上传和下载_服务器_15                return false;

利用WebService实现远程服务器文件的上传和下载_服务器_16            }

利用WebService实现远程服务器文件的上传和下载_服务器_16        }

利用WebService实现远程服务器文件的上传和下载_服务器_15

利用WebService实现远程服务器文件的上传和下载_服务器_15        //下载WebService所在服务器上的文件的方法

利用WebService实现远程服务器文件的上传和下载_服务器_15        [WebMethod]

利用WebService实现远程服务器文件的上传和下载_服务器_15        public byte[] Down(string filename)

利用WebService实现远程服务器文件的上传和下载_重命名_14        {

利用WebService实现远程服务器文件的上传和下载_服务器_15            string filepath = Server.MapPath("File/") + filename;

利用WebService实现远程服务器文件的上传和下载_服务器_15            if (File.Exists(filepath))

利用WebService实现远程服务器文件的上传和下载_重命名_14            {

利用WebService实现远程服务器文件的上传和下载_服务器_15                try

利用WebService实现远程服务器文件的上传和下载_重命名_14                {

利用WebService实现远程服务器文件的上传和下载_服务器_15                    FileStream s = File.OpenRead(filepath);

利用WebService实现远程服务器文件的上传和下载_服务器_15                    return ConvertStreamToByteBuffer(s);

利用WebService实现远程服务器文件的上传和下载_服务器_16                }

利用WebService实现远程服务器文件的上传和下载_服务器_15                catch

利用WebService实现远程服务器文件的上传和下载_重命名_14                {

利用WebService实现远程服务器文件的上传和下载_服务器_15                    return new byte[0];

利用WebService实现远程服务器文件的上传和下载_服务器_16                }

利用WebService实现远程服务器文件的上传和下载_服务器_16            }

利用WebService实现远程服务器文件的上传和下载_服务器_15            else

利用WebService实现远程服务器文件的上传和下载_重命名_14            {

利用WebService实现远程服务器文件的上传和下载_服务器_15                return new byte[0];

利用WebService实现远程服务器文件的上传和下载_服务器_16            }

利用WebService实现远程服务器文件的上传和下载_服务器_16        }

利用WebService实现远程服务器文件的上传和下载_服务器_16    }

利用WebService实现远程服务器文件的上传和下载_上传文件_75}

利用WebService实现远程服务器文件的上传和下载_服务器_03

利用WebService实现远程服务器文件的上传和下载_上传文件_02


接下来就是在客户端网站中调用了,先添加Web引用,干脆引用名也用UpDownFile算了利用WebService实现远程服务器文件的上传和下载_重命名,首先是DownFile.aspx


利用WebService实现远程服务器文件的上传和下载_上传文件_02

利用WebService实现远程服务器文件的上传和下载_服务器_03using System;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Data;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Configuration;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Collections;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.Security;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.UI;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.UI.WebControls;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.UI.WebControls.WebParts;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.UI.HtmlControls;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.IO;

利用WebService实现远程服务器文件的上传和下载_服务器_03

利用WebService实现远程服务器文件的上传和下载_服务器_03namespace HelloWorld

利用WebService实现远程服务器文件的上传和下载_上传文件_13{

利用WebService实现远程服务器文件的上传和下载_服务器_15    public partial class DownFile : System.Web.UI.Page

利用WebService实现远程服务器文件的上传和下载_重命名_14    {

利用WebService实现远程服务器文件的上传和下载_服务器_15        protected void Page_Load(object sender, EventArgs e)

利用WebService实现远程服务器文件的上传和下载_重命名_14        {

利用WebService实现远程服务器文件的上传和下载_服务器_15            UpDownFile.UpDownFile down = new UpDownFile.UpDownFile();

利用WebService实现远程服务器文件的上传和下载_服务器_15            byte[] file = down.Down(Request.QueryString["filename"].ToString());

利用WebService实现远程服务器文件的上传和下载_服务器_15            Response.BinaryWrite(file);

利用WebService实现远程服务器文件的上传和下载_服务器_16        }

利用WebService实现远程服务器文件的上传和下载_服务器_16    }

利用WebService实现远程服务器文件的上传和下载_上传文件_75}

利用WebService实现远程服务器文件的上传和下载_服务器_03

利用WebService实现远程服务器文件的上传和下载_上传文件_02


接下来是上传的演示文件UpFile.aspx


利用WebService实现远程服务器文件的上传和下载_上传文件_02

利用WebService实现远程服务器文件的上传和下载_服务器_03using System;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Data;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Configuration;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Collections;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.Security;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.UI;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.UI.WebControls;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.UI.WebControls.WebParts;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.Web.UI.HtmlControls;

利用WebService实现远程服务器文件的上传和下载_服务器_03using System.IO;

利用WebService实现远程服务器文件的上传和下载_服务器_03

利用WebService实现远程服务器文件的上传和下载_服务器_03namespace HelloWorld

利用WebService实现远程服务器文件的上传和下载_上传文件_13{

利用WebService实现远程服务器文件的上传和下载_服务器_15    public partial class UpFile : System.Web.UI.Page

利用WebService实现远程服务器文件的上传和下载_重命名_14    {

利用WebService实现远程服务器文件的上传和下载_服务器_15        protected void Page_Load(object sender, EventArgs e)

利用WebService实现远程服务器文件的上传和下载_重命名_14        {

利用WebService实现远程服务器文件的上传和下载_服务器_15            

利用WebService实现远程服务器文件的上传和下载_服务器_16        }

利用WebService实现远程服务器文件的上传和下载_服务器_15

利用WebService实现远程服务器文件的上传和下载_服务器_15        protected void Button1_Click(object sender, EventArgs e)

利用WebService实现远程服务器文件的上传和下载_重命名_14        {

利用WebService实现远程服务器文件的上传和下载_服务器_15            //保存到远程File文件夹

利用WebService实现远程服务器文件的上传和下载_服务器_15            //FileUpload1是aspx页面的一个FileUpload控件

利用WebService实现远程服务器文件的上传和下载_服务器_15            UpDownFile.UpDownFile up = new UpDownFile.UpDownFile();

利用WebService实现远程服务器文件的上传和下载_服务器_15            up.Up(ConvertStreamToByteBuffer(FileUpload1.PostedFile.InputStream), FileUpload1.PostedFile.FileName.Substring(FileUpload1.PostedFile.FileName.LastIndexOf("\\") + 1));

利用WebService实现远程服务器文件的上传和下载_服务器_16        }

利用WebService实现远程服务器文件的上传和下载_服务器_15

利用WebService实现远程服务器文件的上传和下载_服务器_15        protected byte[] ConvertStreamToByteBuffer(Stream s)

利用WebService实现远程服务器文件的上传和下载_重命名_14        {

利用WebService实现远程服务器文件的上传和下载_服务器_15            MemoryStream ms = new MemoryStream();

利用WebService实现远程服务器文件的上传和下载_服务器_15            int b;

利用WebService实现远程服务器文件的上传和下载_服务器_15            while ((b = s.ReadByte()) != -1)

利用WebService实现远程服务器文件的上传和下载_重命名_14            {

利用WebService实现远程服务器文件的上传和下载_服务器_15                ms.WriteByte((byte)b);

利用WebService实现远程服务器文件的上传和下载_服务器_16            }

利用WebService实现远程服务器文件的上传和下载_服务器_15            return ms.ToArray();

利用WebService实现远程服务器文件的上传和下载_服务器_16        }

利用WebService实现远程服务器文件的上传和下载_服务器_16    }

利用WebService实现远程服务器文件的上传和下载_上传文件_75}

利用WebService实现远程服务器文件的上传和下载_服务器_03

利用WebService实现远程服务器文件的上传和下载_上传文件_02


其实主要是UpDownFile.asmx.cs这个Web服务文件,客户端怎么调用就随便了。大家看到了,Up和Down方法中传输的都是byte[]数组,因为WebService不支持Stream传输,那就把文件转换为二进制数组来传递。


      此外也可以制作利用WebService远程存储数据库的东西,因为有时候远程服务器的1433端口不能开放,只能开放80,那WebService就派上 用场了。要注意的是,DataTable不能通过WebService传输,只能附在DataSet上来传输,此外很多类型也不可以通过 WebService传,具体可以通过其传输的类型请参考书籍 利用WebService实现远程服务器文件的上传和下载_重命名。我想远程上下传文件和远程存取数据库是WebService最主要的应用吧?