本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhangjie_xiaoke/archive/2009/12/13/5000326.aspx
使用WebClient传送文件时,有以下要注意的事项,这里包含解决办法。一.“远程服务器返回错误: (501) 未实现”的错误
解决方法:
Web服务扩展中的WebDAV惹得祸,将IIS的"Web服务扩展"中的"WebDAV"设置成"允许"!
PS:iis6的 webdav支持 其实就是个基于http的ftp功能 ,明确iis不能直接上传文件,需要扩展支持的话应该不会饶弯路吧?
二.“远程服务器返回错误 (403) 已禁止”的错误
解决方法:
进入网站的虚拟路径目录,虚拟目录属性给写入权限;
三.“远程服务器返回错误: (401) 未经授权”的错误
解决方法:
1、错误号401.1
症状:HTTP 错误 401.1 - 未经授权:访问由于凭据无效被拒绝。
分析:
由于用户匿名访问使用的账号(默认是IUSR_机器名)被禁用,或者没有权限访问计算机,将造成用户无法访问。
解决方案:
(1)查看IIS管理器中站点安全设置的匿名帐户是否被禁用,如果是,请尝试用以下办法启用:
控制面板->管理工具->计算机管理->本地用户和组,将IUSR_机器名账号启用。如果还没有解决,请继续下一步。
(2)查看本地安全策略中,IIS管理器中站点的默认匿名访问帐号或者其所属的组是否有通过网络访问服务器的权限,如果没有尝试用以下步骤赋予权限:
开始->程序->管理工具->本地安全策略->安全策略->本地策略->用户权限分配,双击“从网络访问此计算机”,添加IIS默认用户或者其所属的组。
注意:一般自定义 IIS默认匿名访问帐号都属于组,为了安全,没有特殊需要,请遵循此规则。
2、错误号401.2
症状:HTTP 错误 401.2 - 未经授权:访问由于服务器配置被拒绝。
原因:关闭了匿名身份验证
解决方案:
运行inetmgr,打开站点属性->目录安全性->身份验证和访问控制->选中“启用匿名访问”,输入用户名,或者点击“浏览”选择合法的用户,并两次输入密码后确定。
3、错误号:401.3
症状:HTTP 错误 401.3 - 未经授权:访问由于 ACL 对所请求资源的设置被拒绝。
原因:IIS匿名用户一般属于Guests组,而我们一般把存放网站的硬盘的权限只分配给administrators组,这时候按照继承原则,网站文件夹也只有administrators组的成员才能访问,导致IIS匿名用户访问该文件的NTFS权限不足,从而导致页面无法访问。
解决方案:
给IIS匿名用户访问网站文件夹的权限,方法:进入该文件夹的安全选项,添加IIS匿名用户,并赋予相应权限,一般是读、写。
文件上传源代码如下:
/// WebClient上传文件至服务器
/// </summary>
/// <param name="fileNamePath">文件名,全路径格式</param>
/// <param name="pathString">服务器文件夹路径</param>
/// <param name="IsAutoRename">是否自动按照时间重命名</param>
public string UpLoadFile(string fileNamePath, string pathString, bool IsAutoRename)
{
string savepath = string.Empty;
string fileName = fileNamePath.Substring(fileNamePath.LastIndexOf("\\") + 1);
string NewFileName = fileName;
if (IsAutoRename)
{
string fileNameExt = fileName.Substring(fileName.LastIndexOf(".") + 1);
NewFileName = DateTime.Now.ToString("yyMMddhhmmss") + DateTime.Now.Millisecond.ToString() + fileNamePath.Substring(fileNamePath.LastIndexOf("."));
}
if (pathString.EndsWith("/") == false) pathString = pathString + "/";
//if (!Directory.Exists(pathString))
//{
// Directory.CreateDirectory(pathString);
//}
//文件存在
if(File.Exists(pathString + NewFileName))
{
return null;
}
pathString = pathString + NewFileName;
// 创建WebClient实例
WebClient myWebClient = new WebClient();
myWebClient.Credentials = CredentialCache.DefaultCredentials;
// 要上传的文件
FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
//FileStream fs = OpenFile();
BinaryReader r = new BinaryReader(fs);
byte[] postArray = r.ReadBytes((int)fs.Length);
Stream postStream = myWebClient.OpenWrite(pathString, "PUT");
savepath = pathString;
Uri uri = new Uri(pathString);
try
{
//使用UploadFile方法可以用下面的格式
//myWebClient.UploadFile(uri, "PUT", fileNamePath);
if (postStream.CanWrite)
{
postStream.Write(postArray, 0, postArray.Length);
postStream.Close();
fs.Dispose();
}
else
{
postStream.Close();
fs.Dispose();
}
}
catch (Exception err)
{
postStream.Close();
fs.Dispose();
savepath = string.Empty;
}
finally
{
//postStream.Close();
//fs.Dispose();
}
return savepath;
}
/// <summary>
/// 下载服务器文件至客户端
/// </summary>
/// <param name="urlString">被下载的文件地址,绝对路径</param>
/// <param name="saveDir">另存放的目录</param>
public bool Download(string urlString, string saveDir)
{
WebClient client = new WebClient();
FileStream fsStr = null;
HttpWebResponse res = null;
try
{
int n = urlString.LastIndexOf("/");
string fileName = urlString.Substring(n + 1, urlString.Length - n - 1);
//直接下载到桌面
//client.DownloadFile(urlString, fileName);
//下载到指定目录
Stream stream = client.OpenRead(urlString);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlString);
res = (HttpWebResponse) req.GetResponse();
long len = res.ContentLength;
BinaryReader r = new BinaryReader(stream);
byte[] byteS = r.ReadBytes((int) len);
fsStr = new FileStream(saveDir, FileMode.OpenOrCreate, FileAccess.Write);
fsStr.Write(byteS, 0, (int) len);
fsStr.Close();
res.Close();
stream.Close();
return true;
}
catch (Exception err)
{
return false;
}
finally
{
if(fsStr!=null)
{
fsStr.Close();
fsStr.Dispose();
}
if(res !=null)
{
res.Close();
}
}
}