Загрузка файла 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.