C#:求教,利用webservice 打开服务器上的文件,上传文件和下载文件

淡忘cs 2014-05-20 10:50:42
求教,利用webservice 打开服务器上的文件,上传文件和下载文件 。
在服务端的代码完全没有头绪,在网上找了好久,不知道用什么方法?
求大神指点。
...全文
2031 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
淡忘cs 2014-05-22
  • 打赏
  • 举报
回复
引用 12 楼 libinguest 的回复:
我最近用的是一种最简单的方法,就是脱离数据库,把需要下载的文件在ws端用XML配置好,ws公布一个检测是否有文件下载,一个下载文件的接口,再进行下载。 楼主看是否可以采纳,下个回复给你方法。
好的
风之影子 2014-05-22
  • 打赏
  • 举报
回复
服务器三个方法:一个是获取文件的最新版本,一个是最新版本所要更新文件的清单,一个是文件下载,如下:

[WebMethod(Description = "取得更新版本")]
        //public verdata GetVer()
            public verdata GetVer(verdata ver)
        {
            verdata vdata = ver;
            if (vdata.程序名称 == "") { vdata.Code = "500"; vdata.Msg = "程序名称为空!"; return vdata; }
            XmlDocument doc = new XmlDocument();
            try
            {
                doc.Load(Server.MapPath("update.xml"));
            }
            catch (Exception ex)
            {
                vdata.Code = "500"; vdata.Msg = ex.ToString(); return vdata;
            }
            XmlElement root = doc.DocumentElement;
            XmlNode updateNode = root.SelectSingleNode("filetype");

            XmlNodeList items = updateNode.SelectNodes("item");
            foreach (XmlNode item in items)
            {
                
                if (vdata.程序名称 == item.Attributes["name"].Value)
                {
                    vdata.版本信息 = item.Attributes["version"].Value;
                    vdata.大小 = item.Attributes["size"].Value;
                    vdata.更新说明 = item.Attributes["explain"].Value;
                    vdata.更新时间 = item.Attributes["time"].Value;
                    return vdata;
                }
            }

            //int count = int.Parse(updateNode.Attributes["count"].Value);
            bool temp = false;
            //for (int i = 0; i < count; i++)
            //{
            //    XmlNode itemNode = updateNode.ChildNodes[i];
            //    if (vdata.程序名称 == itemNode.Attributes["name"].Value)
            //    {
            //        vdata.版本信息 = itemNode.Attributes["version"].Value;
            //        vdata.大小 = itemNode.Attributes["size"].Value;
            //        vdata.更新说明 = itemNode.Attributes["explain"].Value;
            //        vdata.更新时间 = itemNode.Attributes["time"].Value;
            //        return vdata;
            //    }
            //}
            if (!temp)
            {
                vdata.Code = "500";
                vdata.Msg = "没有找到该文件信息!";
            }
            return vdata;
        }

        [WebMethod(Description = "在线更新软件")]
        public List<verdata> GetUpdateData(string softname)
        {
            List<verdata> verlist = new List<verdata>();
            verdata verobj = new verdata();
            #region 获取该文件的
            XmlDocument doc = new XmlDocument();
            doc.Load(Server.MapPath("update.xml"));
            XmlElement root = doc.DocumentElement;
            XmlNode updateNode = root.SelectSingleNode("filetype");

            XmlNodeList items = updateNode.SelectNodes("item");
            string path = "";
            foreach (XmlNode item in items)
            {

                if (softname == item.Attributes["name"].Value)
                {
                    path = item.Attributes["path"].Value;
                    break;
                }
            }

            //int count = int.Parse(updateNode.Attributes["count"].Value);
            //string path = "";
            //for (int i = 0; i < count; i++)
            //{
            //    XmlNode itemNode = updateNode.ChildNodes[i];
            //    if (softname == itemNode.Attributes["name"].Value)
            //    {
            //        path = itemNode.Attributes["path"].Value;
            //        break;
            //    }
            //}
            #endregion
            #region 读取xml,返回要下载文件的list数组
            XmlDocument doclist = new XmlDocument();
            if (path == "") { verobj.Code = "500"; verobj.Msg = "没有该地址信息!"; verlist.Add(verobj); return verlist; }
            try
            {
                doclist.Load(Server.MapPath(path));
            }
            catch (Exception ex)
            { verobj.Code = "500"; verobj.Msg = ex.ToString(); verlist.Add(verobj); return verlist; }
            XmlElement rootlist = doclist.DocumentElement;
            XmlNode updatalist = rootlist.SelectSingleNode("filelist");
            int countlist = int.Parse(updatalist.Attributes["count"].Value);
            for (int i = 0; i < countlist; i++)
            {
                XmlNode itemNode = updatalist.ChildNodes[i];
                verobj = new verdata();
                verobj.Code = "200";
                verobj.程序名称 = itemNode.Attributes["name"].Value;
                verobj.版本信息 = itemNode.Attributes["version"].Value;
                verobj.大小 = itemNode.Attributes["size"].Value;
                verobj.更新时间 = itemNode.Attributes["time"].Value;
                verobj.更新说明 = itemNode.Attributes["explain"].Value;
                verobj.物理路径 = itemNode.Attributes["path"].Value;
                verlist.Add(verobj);
            }
            return verlist;
            #endregion
        }

        /// <summary>
        /// Webservice中的下载文件处理函数
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <returns>返回文件流</returns>
        [WebMethod(Description = "下载服务器站点文件,传递文件相对路径")]
        public byte[] DownloadFile(string strFilePath)
        {
            FileStream fs = null;
            //string CurrentUploadFolderPath = Server.MapPath(ConfigurationManager.AppSettings["UploadFileFolder"]);
            //string CurrentUploadFilePath = CurrentUploadFolderPath + strFilePath;
            //if (File.Exists(CurrentUploadFilePath))
            if (File.Exists(strFilePath))
            {
                try
                {
                    ///打开现有文件以进行读取。
                    fs = File.OpenRead(strFilePath);
                    int b1;
                    System.IO.MemoryStream tempStream = new System.IO.MemoryStream();
                    while ((b1 = fs.ReadByte()) != -1)
                    {
                        tempStream.WriteByte(((byte)b1));
                    }
                    return tempStream.ToArray();
                }
                catch (Exception ex)
                {
                    return new byte[0];
                }
                finally
                {
                    fs.Close();
                }
            }
            else
            {
                return new byte[0];
            }
        }
        #endregion

风之影子 2014-05-22
  • 打赏
  • 举报
回复
我最近用的是一种最简单的方法,就是脱离数据库,把需要下载的文件在ws端用XML配置好,ws公布一个检测是否有文件下载,一个下载文件的接口,再进行下载。 楼主看是否可以采纳,下个回复给你方法。
淡忘cs 2014-05-21
  • 打赏
  • 举报
回复
问题解决不了
PSSonyXbox 2014-05-20
  • 打赏
  • 举报
回复
请问是否考虑使用WCF,如果wcf就非常简单了
一生一事 2014-05-20
  • 打赏
  • 举报
回复
淡忘cs 2014-05-20
  • 打赏
  • 举报
回复
由于本人wpf和webservice上是新手,有些原理不太懂,总是遇到各种报错。 还有 在客户端只接收DataTable类型的方法
引用 8 楼 wmg494005678 的回复:
传字节呗,这有啥,底层都是Socket协议
引用 6 楼 u012854298 的回复:
[quote=引用 1 楼 zuorxk_wl 的回复:] http://blog.csdn.net/beyondqd/article/details/6938244 楼主可以去看看这个
对我有用,正在尝试。[/quote]
引用 1 楼 zuorxk_wl 的回复:
http://blog.csdn.net/beyondqd/article/details/6938244 楼主可以去看看这个
引用 2 楼 server126 的回复:
请问是否考虑使用WCF,如果wcf就非常简单了
引用 3 楼 Isstefan 的回复:
二进制文件啊
淡忘cs 2014-05-20
  • 打赏
  • 举报
回复
 public byte[] ConvertStreamToByteBuffer(Stream s)
    {
        MemoryStream ms = new MemoryStream();
        int b;
        while ((b = s.ReadByte()) != -1)
        {
            ms.WriteByte((byte)b);
        }
        return ms.ToArray();
    }

          [WebMethod]
    public DataTable Down(string filepath)
    {
        BinaryFormatter b = new BinaryFormatter();            
        DataTable dt = new DataTable();
        dt.TableName = "m";
        dt.Columns.Add("a");
        if (File.Exists(filepath))
        {
            try
            {
                FileStream s = File.OpenRead(filepath);             
                MemoryStream m = new MemoryStream(ConvertStreamToByteBuffer(s));                
                dt=(DataTable)b.Deserialize(m);
                s.Close();
                return dt;
            }
            catch(Exception ex)
            {
                dt.Rows.Add(ex.Message); //添加一条测试数据 
                return dt;
            }
        }
        else
        {
            dt.Rows.Add("b"); //添加一条测试数据 b 
            return dt;
        }
    }
在转datatable的时候报错:在分析完成之前就遇到流结尾。
wmg494005678 2014-05-20
  • 打赏
  • 举报
回复
传字节呗,这有啥,底层都是Socket协议
宝_爸 2014-05-20
  • 打赏
  • 举报
回复
传byte[]就可以了。
淡忘cs 2014-05-20
  • 打赏
  • 举报
回复
引用 1 楼 zuorxk_wl 的回复:
http://blog.csdn.net/beyondqd/article/details/6938244 楼主可以去看看这个
对我有用,正在尝试。
淡忘cs 2014-05-20
  • 打赏
  • 举报
回复
引用 3 楼 Isstefan 的回复:
二进制文件啊
datatable可以传二进制文件吗
淡忘cs 2014-05-20
  • 打赏
  • 举报
回复
引用 2 楼 server126 的回复:
请问是否考虑使用WCF,如果wcf就非常简单了
WPF项目
Is-stefan 2014-05-20
  • 打赏
  • 举报
回复
二进制文件啊

12,166

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧