Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用WebClient.UploadFile将文件上载到WebDAV服务器将返回401_C#_.net_Winforms_Apache_Webdav - Fatal编程技术网

C# 使用WebClient.UploadFile将文件上载到WebDAV服务器将返回401

C# 使用WebClient.UploadFile将文件上载到WebDAV服务器将返回401,c#,.net,winforms,apache,webdav,C#,.net,Winforms,Apache,Webdav,我试图通过WebDAV将Windows客户端上的C#应用程序中的文件上载到Linux Web服务器。为了实现这一点,我使用了WebClient.UploadFile()。上载始终引发异常: 远程服务器返回错误:(401)未经授权 我尝试了两种不同的授权方法,结果都是一样的 授权: // Method A myWebClient.Credentials = new NetworkCredential("user123", "pass123"); // Method B var bytes = E

我试图通过WebDAV将Windows客户端上的C#应用程序中的文件上载到Linux Web服务器。为了实现这一点,我使用了
WebClient.UploadFile()
。上载始终引发异常:

远程服务器返回错误:(401)未经授权

我尝试了两种不同的授权方法,结果都是一样的

授权:

// Method A
myWebClient.Credentials = new NetworkCredential("user123", "pass123");

// Method B
var bytes = Encoding.UTF8.GetBytes(String.Format("{0}:{1}", "user123", "pass123"));
string auth = Convert.ToBase64String(bytes);
// "Basic aW1hZ2VfdXBsb2FkOkozMkUzYnVGWlB1S0tkQ2tQRkpV"
string authString = String.Format("Basic {0}", auth); 
myWebClient.Headers.Add("Authorization", authString);
try
{
    string address = "http://123.124.125.126/webdav/1";
    string fileName = "F:\\articleimages\\isotope\\1\\1dmgo.jpg";
    byte[] response = myWebClient.UploadFile(address, fileName);
}
catch (WebException wexc)
{
    // wexc.Message == The remote server returned an error: (401) Unauthorized
}
为了确保WebDAV正常工作,我使用
WinSCP
(Windows GUI)和
cadaver
(Linux终端)连接并上传了文件 两者都取得了成功


文件上传代码:

// Method A
myWebClient.Credentials = new NetworkCredential("user123", "pass123");

// Method B
var bytes = Encoding.UTF8.GetBytes(String.Format("{0}:{1}", "user123", "pass123"));
string auth = Convert.ToBase64String(bytes);
// "Basic aW1hZ2VfdXBsb2FkOkozMkUzYnVGWlB1S0tkQ2tQRkpV"
string authString = String.Format("Basic {0}", auth); 
myWebClient.Headers.Add("Authorization", authString);
try
{
    string address = "http://123.124.125.126/webdav/1";
    string fileName = "F:\\articleimages\\isotope\\1\\1dmgo.jpg";
    byte[] response = myWebClient.UploadFile(address, fileName);
}
catch (WebException wexc)
{
    // wexc.Message == The remote server returned an error: (401) Unauthorized
}

问题

  • 到目前为止我的代码正确吗
  • 我应该使用哪种授权?
    网络凭据
    标题
由于这个概念只是在我的C#应用程序中失败了,所以问题肯定就在那里

  • 我如何进一步排除故障

实际响应(异常详细信息)


401未经授权
未经授权
此服务器无法验证您是否
您有权访问该文档
请求。要么你提供的是错误的
凭据(例如,错误的密码)或您的
浏览器不了解如何提供
所需的凭据


WebClient
是HTTP客户端,而不是WebDAV客户端

如果执行
WebClient.UploadFile
,则默认情况下,它使用HTTP
POST
请求,而不是WebDAV
PUT
请求

身份验证失败可能只是其副作用。即使没有,而且您解决了身份验证问题,它可能也不会帮助您

我不知道它是否有帮助,但请尝试使用和使用
“PUT”



WinSCP为您提供的另一个选项是使用。

您可以查看异常详细信息。必须有更多的细节。检查wexc.Response,它有
GetResponseStream()
,您可以通读到末尾,查看是否有更多详细信息。您还可以使用网络分析器查看响应详细信息。你能补充一下你是如何通过其他方式(WinSCP或cadaver?)成功上传文件的吗?我在问题的末尾补充了答案。例如,在WinSCP中,我只需使用WebDav协议(端口80)和正确的用户名/密码打开一个新会话。然后像在ftp中一样上传文件(拖放)。这是完美的。我假设身份验证错误或未发送。这个wexc.Response看起来像是通过浏览器发出的具有错误凭据的请求。我正在使用apache的htaccess/htpasswd来请求凭据。这可能是问题所在吗?你的要求似乎是正确的。htaccess使用基本身份验证,您正在使用基本身份验证正确地请求站点。请查看apache日志。可能还有更多的细节。另外,为了更简单,只需尝试
client.Headers[HttpRequestHeader.Authorization]=string.Format(“Basic{0}”,等等)。可能是标题。添加会把事情搞砸。