Результаты 404/405 с использованием HttpClient в С# для загрузки/переименования/удаления файлов на веб-сервереC#

Место общения программистов C#
Ответить
Anonymous
 Результаты 404/405 с использованием HttpClient в С# для загрузки/переименования/удаления файлов на веб-сервере

Сообщение Anonymous »

Я переношу старое настольное приложение для Windows с .NET Framework 4.8 на .NET 9/MAUI. В какой-то момент есть некоторые приблизительные планы сделать проект мультиплатформенным (Android и Windows), но сейчас то, что я делаю, является скорее подтверждением концепции перехода на .NET 9.
Приложение выполняет некоторые функции управления файлами на веб-сервере IIS 10. В частности, он должен выполнить 5 задач над парой файлов, находящихся на веб-сервере, который является всего лишь хостом простого веб-сайта:
  • проверить существование файла на веб-сервере
  • загрузить файл с веб-сервера
  • загрузить файл на веб-сервер
  • переименовать файл на веб-сервере
  • удалить файл на веб-сервере веб-сервер
Исходное приложение использует WebClient, WebRequest и FtpWebRequest для выполнения этих 5 задач. Но .NET 9 требует использования HttpClient. Хорошо, сразу скажу, что я динозавр и ничего не знаю о HttpClient. Поэтому я собрал небольшое тестовое приложение .NET 9 для реализации этих простых функций. Мне удалось реализовать проверку существования через HttpClient.GetAsync(uri) и загрузку файла через HttpClient.GetStreamAsync(uri) [и Stream.CopyToAsync(localFile)]. Но я дергаю на себе волосы, пытаясь достичь других функций. Я перепробовал много, МНОГО предложений, найденных через Google и Stack Overflow, но безрезультатно.
Файлы на веб-сервере находятся в папке, для доступа к которой требуется имя пользователя и пароль. Я создал экземпляр HttpClient с обработчиком для установки безопасности, и мне нужно думать, что это правильно, иначе проверка существования и загрузка завершится неудачно.

Код: Выделить всё

public partial class MainPage : ContentPage
{
private HttpClient _client;

public MainPage()
{
InitializeComponent();
var handler = new HttpClientHandler()
{
Credentials = new NetworkCredential(WebUser.Text, WebPwd.Text)
};

_client = new HttpClient(handler, true)
{
BaseAddress = new Uri(WebFolder.Text),
};
}
}
Вот моя последняя попытка загрузить файл:

Код: Выделить всё

private async Task UploadFile3(string localFile, string remoteFolder)
{
bool ret = false;

try
{
using (var multipartFormContent = new MultipartFormDataContent())
{
var fileStreamContent = new StreamContent(File.OpenRead(localFile));
fileStreamContent.Headers.ContentType = new MediaTypeHeaderValue("text/xml");
multipartFormContent.Add(fileStreamContent, "file", Path.GetFileName(localFile));

var response = await _client.PostAsync(remoteFolder, multipartFormContent);
ret = response.IsSuccessStatusCode;
Debug.Print("Upload " + (ret ? "SUCCESS" : "FAIL " + response.ReasonPhrase) +
"\nUpload of file " + localFile + " to " + remoteFolder + " = " + ret);
}
}
catch (Exception ex)
{
Debug.Print("UploadFile3 failed: " + ex.Message);
}

return ret;
}
Параметры: localFile = полная спецификация файла, RemoteFolder = папка назначения, которая совпадает с _client.BaseAddress. Результат: 405 Метод не разрешен. Я также попробовал RemoteFolder = "" в надежде, что файл будет просто загружен на BaseAddress.
Чтобы переименовать веб-файл, я:

Код: Выделить всё

private async Task RenameWebFile(string origName, string newName)
{
bool ret = false;

// Set the API endpoint
string apiUrl = origName + "/rename";

// Create the request body
var requestBody = new
{
newName = newName
};

// Serialize the request body to JSON
var json = Newtonsoft.Json.JsonConvert.SerializeObject(requestBody);
var content = new StringContent(json, Encoding.UTF8, "application/json");

// Send the request
HttpResponseMessage response = await _client.PostAsync(apiUrl, content);

// Check the response
if (response.IsSuccessStatusCode)
{
Debug.Print("File renamed successfully.");
ret = true;
}
else
{
Debug.Print($"Error renaming file: {response.StatusCode}");
}
return ret;
}
Ответ: 404 не найден. Результат один и тот же, независимо от того, являются ли параметры просто именами файлов или
полными путями (http://www ...)
Наконец, для удаления у меня есть:

Код: Выделить всё

private async Task DeleteWebFile(string fileToDelete)
{
var msg = await _client.DeleteAsync(fileToDelete);
return = msg.IsSuccessStatusCode;
}
Это также возвращает 405 Method Not Allowed, независимо от того, является ли файл просто именем или полным путем.
Может быть, на сервере что-то требуется? Для старого WebClient в этом не было необходимости, но...?
Я опытный (более 35 лет) инженер C/C#, но мой опыт далек от веб-технологий (очевидно!)... как я уже сказал, я динозавр, хотя и пытаюсь учиться.
Я был бы очень признателен за любую помощь - даже если это просто ссылка на полезный материал.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... les-on-a-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»