WPF中利用WebClient向服务器上传文件

时间:2021-08-20 04:00:07

忽然接到一个任务,在WPF中上传文件至服务器~在网上搜了很多种方法,最终决定利用WebCient实现文件的上传工作,看似很简单的任务,却遇到了很多问题。先说一下我的探索步骤吧~

一、选用WebClient.UploadFile方法 (String,String, String)

public bool UploadFile(string newfilename)
          {
             WebClient myWebClient = new WebClient();
              myWebClient.Credentials = CredentialCache.DefaultCredentials;
              try
              {
                //将D盘名字为hello的文档,上传到服务器中WPF的文件夹中,并以newfilename命名(newfilename含扩展名)
                  myWebClient.UploadFile(new Uri("http://localhost:9935/WPF/" + newfilename) , "PUT", @"D\hello.docx");       
              }
              catch (Exception ex)
              {
                  MessageBox.Show("文件上传失败,请稍后重试!");

              }
              return true;
          } 

这种方法遇到了“远程服务器返回错误: (404) 未找到”问题。在网上找解决办法,把所有可能的设置都进行配置,例如(1)IIS上传目录的权限问题(加入Everyone)角色,使之可写入~(2)添加IIS的处理程序映射。首先打开IIS,左侧选择虚拟目录,右侧选择功能视图——处理程序映射——双击进入,选择ExtensionlessHandler-Integrated-4.0双击后,点击请求限制,谓词面板,下列谓词之一中添加上PUT,DELETE.但依旧走不通,奇怪的是,WebClient的下载方法以这种方式却能实现~现在依旧百思不解...

..二、WebClient UploadFile方法 (Url, String)

选用这个重载方法,第一参数是服务器上的一个网页(aspx或者ashx),第二个参数是文件在本地的地址(也是上文的"D\hello.docx")首先要在服务器端生成一个网页,该网页用来处理上传文件存放服务器请求,网页后台的具体代码如下:

protected void Page_Load(object sender, EventArgs e)
        {
            foreach (string f in Request.Files.AllKeys)
            {    //在客户端传入新的文件
                HttpPostedFile file = Request.Files[f];
                //在客户端传入一个新的文件名             
                string filename = Request.QueryString["n"];
                file.SaveAs(Server.MapPath("../DOC/" + filename + file.FileName.Substring(file.FileName.IndexOf("."))));
            }
        }
   

在客户端需要调用WebClient的UploadFile方法,具体代码如下:

   public bool Upload(string filename)
          {
              WebClient myWebClient = new WebClient();
              myWebClient.Credentials = CredentialCache.DefaultCredentials; //获取或设置发送到主机并用于请求进行身份验证的网络凭据
              myWebClient.UploadFileAsync(new Uri("http://localhost:9935/WPF/UploadFile.aspx?n="+filename),@ "D:\hello.docx");
              myWebClient.UploadFileCompleted += new UploadFileCompletedEventHandler(myWebClient_UploadFileCompleted);

              return true;
          }

          private void myWebClient_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
          {
              if (e.Error != null)
              {
                  MessageBox.Show("上传失败:" + e.Error.Message);
              }
              else {
                  MessageBox.Show("上传成功!");
              }
          }

在此期间也出现了一个错误,耽搁了不少时间,远程服务器返回错误:(500)内部服务器错误。这个问题出现原因一般是在服务器生成的网页中,将运行地址改为本地加断点调试,最后是存放路径出问题了,修改,运行,文件成功上传。~第一次写博客,格式没整好,还望大家多包涵~