在C#开发中,通过WebDAV协议实现文件的上传和管理是很多场景下的需求,比如企业内部的文件共享系统、远程文件存储功能等。WebDAV是基于HTTP协议的扩展协议,支持文件的创建、删除、移动、复制等操作,相比传统的FTP协议更易于和现有Web服务集成。

WebDAV协议基础说明
WebDAV全称为Web-based Distributed Authoring and Versioning,它在HTTP协议的基础上新增了多个方法,常用的包括MKCOL(创建目录)、PUT(上传文件)、DELETE(删除资源)、MOVE(移动资源)、PROPFIND(获取资源属性)等。在C#中我们可以通过HttpWebRequest或者HttpClient来发送这些自定义方法的请求,完成文件管理操作。
基础配置与身份认证
大部分WebDAV服务都需要身份认证,常见的有Basic认证和Digest认证,下面以Basic认证为例,说明请求的通用配置方式:
using System;
using System.Net;
public class WebDAVHelper
{
// WebDAV服务地址
private string _baseUrl;
// 认证用户名
private string _userName;
// 认证密码
private string _password;
public WebDAVHelper(string baseUrl, string userName, string password)
{
_baseUrl = baseUrl.TrimEnd('/');
_userName = userName;
_password = password;
}
/// <summary>
/// 创建通用的HttpWebRequest对象,配置基础属性和认证信息
/// </summary>
private HttpWebRequest CreateRequest(string url, string method)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = method;
request.Credentials = new NetworkCredential(_userName, _password);
// 如果是Basic认证,也可以手动添加Authorization头
// string authInfo = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{_userName}:{_password}"));
// request.Headers["Authorization"] = $"Basic {authInfo}";
return request;
}
}
文件上传实现
上传文件使用PUT方法,将文件的二进制内容作为请求体发送到目标路径即可,下面是完整的上传方法示例:
using System.IO;
/// <summary>
/// 上传文件到WebDAV指定路径
/// </summary>
/// <param name="remotePath">远程文件路径,如/test/demo.txt</param>
/// <param name="localFilePath">本地文件路径</param>
public void UploadFile(string remotePath, string localFilePath)
{
string url = $"{_baseUrl}{remotePath}";
HttpWebRequest request = CreateRequest(url, "PUT");
// 读取本地文件内容
using (FileStream fs = new FileStream(localFilePath, FileMode.Open, FileAccess.Read))
{
request.ContentLength = fs.Length;
using (Stream requestStream = request.GetRequestStream())
{
fs.CopyTo(requestStream);
}
}
// 获取响应,确认上传结果
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.Created || response.StatusCode == HttpStatusCode.OK)
{
Console.WriteLine("文件上传成功");
}
else
{
Console.WriteLine($"文件上传失败,状态码:{response.StatusCode}");
}
}
}
其他常用管理操作
创建目录
创建目录使用MKCOL方法,只需要发送一个MKCOL请求到目标目录路径即可,不需要请求体:
/// <summary>
/// 在WebDAV上创建目录
/// </summary>
/// <param name="remoteDirPath">远程目录路径,如/test/newdir</param>
public void CreateDirectory(string remoteDirPath)
{
string url = $"{_baseUrl}{remoteDirPath}";
HttpWebRequest request = CreateRequest(url, "MKCOL");
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.Created)
{
Console.WriteLine("目录创建成功");
}
else
{
Console.WriteLine($"目录创建失败,状态码:{response.StatusCode}");
}
}
}
删除文件或目录
删除操作使用DELETE方法,目标路径可以是文件路径也可以是目录路径:
/// <summary>
/// 删除WebDAV上的文件或目录
/// </summary>
/// <param name="remotePath">远程路径</param>
public void DeleteResource(string remotePath)
{
string url = $"{_baseUrl}{remotePath}";
HttpWebRequest request = CreateRequest(url, "DELETE");
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.NoContent)
{
Console.WriteLine("资源删除成功");
}
else
{
Console.WriteLine($"资源删除失败,状态码:{response.StatusCode}");
}
}
}
移动或重命名文件
移动文件使用MOVE方法,需要设置Destination请求头指定目标路径:
/// <summary>
/// 移动或重命名WebDAV上的资源
/// </summary>
/// <param name="sourcePath">源路径</param>
/// <param name="targetPath">目标路径</param>
public void MoveResource(string sourcePath, string targetPath)
{
string sourceUrl = $"{_baseUrl}{sourcePath}";
string targetUrl = $"{_baseUrl}{targetPath}";
HttpWebRequest request = CreateRequest(sourceUrl, "MOVE");
request.Headers["Destination"] = targetUrl;
// 是否覆盖已存在的目标资源,true表示覆盖
request.Headers["Overwrite"] = "T";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.Created || response.StatusCode == HttpStatusCode.OK)
{
Console.WriteLine("资源移动成功");
}
else
{
Console.WriteLine($"资源移动失败,状态码:{response.StatusCode}");
}
}
}
注意事项
- 如果WebDAV服务使用的是HTTPS协议,需要确保客户端信任服务端的证书,否则可能需要额外处理证书验证逻辑。
- 部分WebDAV服务对请求的大小有限制,上传大文件时需要注意分块或者调整服务端的配置。
- 操作完成后及时释放
HttpWebResponse和Stream等资源,避免内存泄漏。 - 如果遇到401未认证的错误,需要检查用户名密码是否正确,以及认证方式是否和服务端匹配。