Das Problem: Ist es möglich, Web Client zu verwenden, um eine HttpPostedFileBase (nur im Speicher verfügbar, nicht auf der Festplatte.) Zu einem anderen Endpunkt?Post multipart/Formulardatei aus Stream mit Web Client
Was ich versucht habe:
Ich habe die folgenden Controller, wir sind in einer Datei aus unserem Frontend veröffentlichen und es bindet an den Dateiparameter.
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;
}
}
}
Ich brauche diese Anfrage weitergeben zu einer anderen Anwendung, die nicht öffentlich zugänglich ist (so können wir nicht direkt vom Client post) Das Controller sieht wie folgt aus:
[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
ist immer null, so sind files
. Was fehlt mir? Wenn ich Postman verwende und direkt auf den API-Endpunkt poste, funktioniert es. Also rate ich, dass ich etwas falsch mache in meinem HomeController
?
Also ist dies ein einfacher Proxy auf einen anderen Server? Was ist der erste Controller? MVC/WebAPI? Könnte es WebAPI sein? – spender
Ja genau, der erste Controller ist ein MVC-Controller und der zweite ist ein WebAPI-Controller. Ich kann den Typ auf beiden ändern, wenn das Problem leichter zu lösen wäre. Idealerweise möchte ich die erste Anfrage direkt an meinen api-Controller weitergeben. – JOSEFtw