首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebDav 409错误

WebDav 409错误
EN

Stack Overflow用户
提问于 2011-10-16 03:50:51
回答 1查看 5.7K关注 0票数 3

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

我循环遍历这些文件并发送这些文件。

1使用HTTP Put将doc1.txt添加到WebDav服务器--总是成功,即使文件已经在那里。

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

无论我处理的是什么文件或顺序,它总是在第二个文件上失败。有谁有想法吗?

下面是我使用的方法:

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2011-10-16 23:20:36

这是我犯的一个愚蠢的错误。WebDave文档说,“如果PUT会导致创建一个没有适当作用域的父集合的资源,那么它肯定会失败,并返回409 (冲突)。”

我循环遍历我的文件,并连接文件名,而不是简单地替换文件名。

这就是我调用UploadFile的方式:

代码语言:javascript
复制
string url = "http://someurl"

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

当我把它改成这样的时候,它就起作用了:

代码语言:javascript
复制
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++;
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7780264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档