Если вы используете ядро ASP.NET, я бы порекомендовал сделать следующее:
Создать DTO (объект передачи данных) и позволить инфраструктуре привязка модели обрабатывать сериализацию / десериализациюдля тебя.
public class FileDto
{
public string Name { get; set; }
public string Path { get; set; }
public string Body { get; set; }
}
В Asp.Net Core нет эквивалента Server.MapPath
.Чтобы получить корневой веб-путь, вы можете реализовать IHostingEnvironment
как подробно здесь .
Однако в приведенном ниже примере просто используется жестко закодированное значение.Я бы рекомендовал вернуть IActionResult
за ваш RESTful сервис.HttpPost
должен возвращать ответ Created 201 в случае успеха.Приведенный ниже код вернет статус 201 Создано и файл DTO в теле ответа.
[HttpPost]
public IActionResult Post([FromBody] FileDto model)
{
string directory = System.IO.Path.Combine(@"C:\temp\myfiles", model.Path);
// TODO verify directory exists, Name is not null, Path is not null, Body is not null
string fileName = model.Name + ".txt";
string fullPath = System.IO.Path.Combine(directory, fileName);
// simplest way to write to file
System.IO.File.WriteAllText(fullPath, model.Body);
return Created("http://url/to/your/new/file", model);
}
Если вы хотите добавить текст в существующий файл, вы можете использовать File.AppendAllText(path, text)
.
Путь, полученный API, может не существовать, вам нужно будет обработать случай, когда он не существует, и решить, что делать.Например, вы можете создать каталог или вернуть 404 NotFound
или 500 ServerError
.
Если вы не знаете, откуда поступают данные, разрешить клиентам / пользователям API выбирать / создавать путь к файлу, вероятно, не очень хорошая идея (что если пользователь / клиент отправил "path": "../.."
для путинапример).