2016-07-08 1 views
0

Проблема: Возможно ли использование веб-клиента для публикации HttpPostedFileBase (доступно только в памяти, а не на диске.) На другую конечную точку?Опубликовать файл multipart/form-data из потока с веб-клиентом

Что я пробовал:

Я следующий контроллер, мы вывешиваем в файл с нашего веба-интерфейса и он связывается с параметром файла.

public class HomeController : Controller 
{ 
    [System.Web.Http.HttpPost] 
    public async Task<string> Index(HttpPostedFileBase file) 
    { 
     //file is not null here, everything works as it should. 

     //Here im preparing a multipart/form-data request to my api endpoint 
     var fileStreamContent = new StreamContent(file.InputStream); 
     using (var client = new HttpClient()) 
     using (var formData = new MultipartFormDataContent()) 
     { 
      formData.Add(fileStreamContent); 
      var response = await client.PostAsync("http://restapi.dev/api/files/add", formData); 
      var result = await response.Content.ReadAsStringAsync(); 
      return result; 
     } 
    } 
} 

Мне нужно передать этот запрос к другому приложению, не является общедоступными (поэтому мы не можем размещать непосредственно от клиента) Этого контроллер выглядит следующим образом:

[RoutePrefix("api/files")] 
public class FilesController : ApiController 
{ 
    [HttpPost] 
    [Route("add")] 
    public async Task<HttpResponseMessage> Add(HttpPostedFileBase file) 
    { 
     //This is the problem, file is always null when I post from my backend. 
     var files = HttpContext.Current.Request.Files.Count > 0 ? HttpContext.Current.Request.Files[0] : null; 
     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
} 

file всегда null, также files. Что мне не хватает? Когда я использую postman и отправляю сообщение непосредственно в конечную точку API, он работает. Так что я предполагаю, что я делаю что-то не так в моем HomeController?

+0

Итак, это простой прокси-сервер на другом сервере? Что такое первый контроллер? MVC/WebAPI? Может ли это быть WebAPI? – spender

+0

Да, точно, первый контроллер является контроллером MVC, а второй - контроллером WebAPI. Я могу изменить тип на обоих из них, если это облегчит решение проблемы. В идеале я просто хотел бы перейти к первому запросу прямо к моему контроллеру api. – JOSEFtw

ответ

1

Вы можете улучшить это с помощью новых технологий.

В WebAPI, вы можете написать метод контроллера, как это:

//[Route("api/Foo")] //maybe? 
[HttpPost] 
public async Task<HttpResponseMessage> MyResourceProxy(HttpRequestMessage request) 

теперь вы можете принять эту просьбу и переписать его RequestUri свойство:

request.RequestUri = new Uri(blah); 

новый вверх по HttpClient и направить запрос :

HttpClient client = new HttpClient(); 
//make sure that this fails if it's hung for more than 30 seconds 
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30)); 
try 
{ 
    response = await client.SendAsync(request, 
             HttpCompletionOption.ResponseHeadersRead, 
             cts.Token); 
} 
catch (TaskCanceledException) 
{ 
    response = new HttpResponseMessage(HttpStatusCode.GatewayTimeout); 
} 

удостоверьтесь, что все получилось ы расположены:

request.RegisterForDispose(new IDisposable[] {request, client, cts, response}); 

, а затем вернуть response

return response; 

Я добавил механизм тайм-аут в том, что не может быть подходящим для вас необходимо.

+0

Это выглядит очень хорошо, он работает, как бы то ни было. Im получает следующую ошибку (из моего api) '' '{ « Сообщение »:« HTTP-ресурс не найден, который соответствует URI запроса «http://restproxy.dev/api/files/add»., «MessageDetail»: «Тип не найден, который соответствует контроллеру с именем« файлы ». } '' ' Это странно, потому что, если я попытаюсь получить доступ к этому URL прямо в браузере, он работает. Похоже, что запрос, который я делаю в моем контроллере, выглядит неправильно, как-то ... будет исследовать дальше! – JOSEFtw

+0

@JOSEFtw Похоже, вам может понадобиться изменить свойство 'request.Headers.Host'. – spender

+1

yep! Вот и все. Спасибо за ваше решение, это действительно чисто. Хорошего дня! – JOSEFtw

Смежные вопросы