Загрузка файла на сервер WebDAV с использованием WebClient.UploadFile возвращает 401 - PullRequest
2 голосов
/ 06 мая 2020

Я пытаюсь загрузить файлы из моего приложения C# на клиенте Windows на веб-сервер Linux через WebDAV. Для этого я использую 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);

Чтобы убедиться, что WebDAV работает должным образом, я подключил и загрузил файлы, используя WinSCP (Windows GUI) и cadaver (Linux терминал) оба успешно .


Код загрузки файла:

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
}

Вопросы

  • Правильный ли мой код?
  • Какую авторизацию я должен использовать? NetworkCredentials или Header?

Поскольку концепция не работает только в моем C# приложении, проблема должна быть ie там.

  • Как бы я устранить неполадки дальше подробнее?

Фактический ответ (подробности исключения)

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>

1 Ответ

1 голос
/ 06 мая 2020

WebClient - это HTTP-клиент, а не WebDAV-клиент.

Если вы используете WebClient.UploadFile, он по умолчанию использует HTTP POST запрос, а не WebDAV PUT запрос.

Ошибка аутентификации может быть лишь побочным эффектом этого. И даже если нет, и вы решите проблему аутентификации, это, вероятно, вам не поможет.

Я не знаю, может ли это помочь, но попробуйте использовать перегрузку , которая принимает method аргумент и используйте "PUT".


Другой вариант, поскольку WinSCP работает для вас, использует WinSCP. NET сборку .

...