WebDav 409错误

时间:2011-10-15 19:50:51

标签: c# iis webdav

我正在尝试使用WebDav添加多个文件。我尝试上传的目录是空的。

我遍历文件并发送文件。

1使用HTTP Put将doc1.txt添加到WebDav服务器    - 即使文件已存在,也始终成功。

2使用HTTP Put将doc2.txt添加到WebDav服务器   - 总是因409错误而失败。

我处理第二个文件中始终失败的文件的文件或顺序无关紧要。 有人有想法吗?

以下是我使用的方法:

public static bool UploadFile(string url, string filePath)
{
    if (!File.Exists(filePath))
    {
        return false;
    }

    long fileLen = new FileInfo(filePath).Length;

    HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create(url);

    Request.Credentials = mCredentials;
    Request.Method = WebRequestMethods.Http.Put;

    Request.ContentLength = fileLen;
    Request.SendChunked = true;

    // Specify that overwriting the destination is allowed.
    Request.Headers.Add(@"Overwrite", @"T");
    Request.AllowWriteStreamBuffering = true;

    System.IO.Stream stream = Request.GetRequestStream();

    FileStream fileStrem = new FileStream(filePath, FileMode.Open, FileAccess.Read);

    int transferRate = 4096;
    byte[] data = new byte[transferRate];
    int read = 0;
    long totalRead = 0;

    try
    {
        do
        {
            read = fileStrem.Read(data, 0, data.Length);
            if (read > 0)
            {
                totalRead += read;
                stream.Write(data, 0, read);
            }
        } while (read > 0);
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        stream.Close();
        stream.Dispose();
        stream = null;

        fileStrem.Close();
        fileStrem.Dispose();
        fileStrem = null;
    }

    HttpWebResponse Response;
    try
    {
        Response = (HttpWebResponse)Request.GetResponse();
    }
    catch (WebException e)
    {
        if (e.Response == null)
        {
            Debug.WriteLine("Error accessing Url " + url);
            throw;
        }

        HttpWebResponse errorResponse = (HttpWebResponse)e.Response;

        //if the file has not been modified
        if (errorResponse.StatusCode == HttpStatusCode.NotModified)
        {
            e.Response.Close();
            return false;
        }
        else
        {
            e.Response.Close();
            Debug.WriteLine("Error accessing Url " + url);
            throw;
        }
    }
    //This case happens if no lastmodedate was specified, but the specified
    //file does exist on the server. 
    Response.Close();

    if (totalRead == fileLen)
    {
        return true;
    }
    else
    {
        return false;
    }
}

1 个答案:

答案 0 :(得分:3)

这是我的一个愚蠢的错误。 WebDave文档说,“导致创建没有适当范围的父集合的资源的PUT必须以409(冲突)失败。”。

好吧,我正在遍历我的文件并连接文件名而不是仅替换文件名。

这就是我调用UploadFile的方式:

string url = "http://someurl"

foreach (string file in files)
{
    url = url.TrimEnd(new char[] { '/' }) + @"/" + System.IO.Path.GetFileName(file);
    UploadFile(url, file);
    fileCount++;
}

当我改变它时,它起作用:

string url = "http://someurl"
string temp;

foreach (string file in files)
{
    temp = url.TrimEnd(new char[] { '/' }) + @"/" + System.IO.Path.GetFileName(file);
    UploadFile(temp, file);
    fileCount++;
}