Загрузка файла REST с помощью HttpRequestMessage или Stream?
Каков лучший способ загрузить файл для клиента REST?
Из документации WCF Web API
[WebInvoke(UriTemplate = "thumbnail", Method = "POST")]
public HttpResponseMessage UploadFile(HttpRequestMessage request)
{
Из нескольких сообщений на форуме:
Загрузка файла WCF с дополнительными параметрами
[WebGet(UriTemplate="", Method ="POST"]
public string UploadFile(Stream fileContents)
Я понимаю, что первый метод позволяет напрямую публиковать файл из обычной HTML-формы. Второй подход кажется более распространенным во всех сообщениях форума, которые я нахожу.
Что бы вы порекомендовали и почему? REST api должен быть доступен из всех языков и платформ.
Для подхода HttpRequestMessage, как бы сделать загрузку файла предпочтительнее с помощью WCF HttpClient? С FormUrlEncodedMediaTypeFormatter)
Ответы
Ответ 1
Первый метод "ближе к металлу" и будет более гибким, поскольку вы будете обрабатывать HTTP-запросы и сами создавать ответы. Если все, что вам нужно сделать, это принять поток от клиента, второй вариант намного проще с точки зрения реализации (под капотом он выполняет ту же работу, что и первый метод)
У меня нет ответа на ваш последний вопрос.
Ответ 2
Чтобы проверить подход HttpRequestMessage, я выполнил следующее с помощью MVC:
public class TestingController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Upload()
{
var file = Request.Files[0];
var filename = Request.Form["filename"];
var uri = string.Format("http://yoururl/serviceRoute/{0}", filename);
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("image/pjpeg"));
var content = new StreamContent(file.InputStream);
var response = client.PostAsync(uri, content);
ViewBag.ServerUri = uri;
ViewBag.StatusCode = response.Result.StatusCode.ToString();
return View();
}
}
В представлении "Индекс" должна быть указанная форма, которая отправляется обратно в метод "Загрузить". Затем вы можете использовать HttpClient для подключения к службе REST.