web-dev-qa-db-de.com

Buchen von Formulardaten UND einer Datei an die ASP.NET-Web-API

Ich habe diese ASP.NET-Web-API-Methode, und ich möchte ein Objekt und gleichzeitig eine Datei posten!

    public async Task<IHttpActionResult> Post(Facility facility)
    {
        if (!ModelState.IsValid)
            return BadRequest();

        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        string root = HttpContext.Current.Server.MapPath("~/App_Data");
        var provider = new MultipartFormDataStreamProvider(root);

            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the file names.
            foreach (MultipartFileData file in provider.FileData)
            {
                Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                Trace.WriteLine("Server file path: " + file.LocalFileName);
            }
            // Logic
            // Login

        return Ok(facilityManager.Insert(facility));
    }

Und ich möchte es anrufen, also sende ich diese http-Anfrage mit Fiddler:

Header: 

Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468
User-Agent: Fiddler
Host: localhost:44301
Content-Length: 3279

Karosserie:

---------------------------acebdf13572468
Content-Disposition: form-data; name="fieldNameHere"; filename="credits.txt"
Content-Type: text/plain

<@INCLUDE *C:\Program Files (x86)\Fiddler2\credits.txt*@>
---------------------------acebdf13572468
Content-Disposition: form-data; name="facility"
Content-Type: application/json
{
    "FacilityTypeId":"1"
}
---------------------------acebdf13572468--

Ich erhalte einen 415-Fehlercode mit Antworttext:

{"message": "Der Medientyp" multipart/form-data "der Anforderungsentität wird für diese Ressource nicht unterstützt.", "exceptionMessage": "Es ist kein MediaTypeFormatter verfügbar, um ein Objekt des Typs" Facility "aus Inhalt mit Medientyp zu lesen 'multipart/form-data'. "," exceptionType ":" System.Net.Http.UnsupportedMediaTypeException "," stackTrace ":" at System.Net.Http.HttpContentExtensions.ReadAsAsync [T] (HttpContent-Inhalt, Typnuableable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable1) formatters, IFormatterLogger formatterLogger, StornoToken-Annullierungs-Token)\r\n bei System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync (Anforderung vom Typ HttpRequestMess-Typ, IEnumerable`1-Formatters, IFormatterLogager-Format.

Ich habe viel gesucht, bevor ich gefragt habe, aber ich konnte keine Lösung finden. Thnaks für die Hilfe.

BEARBEITEN:

Ein Hinweis: Wenn ich den Parameter "facility" entferne und die Methode nur zum Hochladen der Datei zulasse, funktioniert sie perfekt, aber ich möchte JSON und eine Datei zusammen posten.

15
Hashem

"mulitpart/form-data", damit wir den UploadMultipartMediaTypeFormatter registrieren

public class UploadMultipartMediaTypeFormatter : MediaTypeFormatter
{
    UploadMultipartMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));
    }
}

* Registrieren Sie sich in global.asax oder (siehe Sandbox-Code)

config.Formatters.Add(new UploadMultipartMediaTypeFormatter());

Die WebApi ruft jetzt MediaTypeFormatter.ReadFromStreamAsync auf, und wir können die Erweiterung HttpContent.ReadAsMultipartAsync von dort aus aufrufen.

Ich hatte das gleiche Problem. Gelöst von MultipartDataMediaFormatter für ASP.NET WebApi. Wie benutzt man:

  1. Suchen und Installieren von Nuget-Paketen MultipartDataMediaFormatter .
  2. Aktuelles Formatierungsprogramm zur WebApi-Formatierungssammlung hinzufügen:

    • wenn WebApi auf IIS gehostet wurde (beim Anwendungsstart). :
      • GlobalConfiguration.Configuration.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());
    • wenn WebApi selbst gehostet wird:

      • new HttpSelfHostConfiguration(<url>).Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());

Danach können Sie objec mit Datei zusammen in einem Modell buchen.

Hinweis: In Nuget-Paketen ist Version 1.1.0 nicht die letzte. Sie sind noch nicht aktualisiert. Möglicherweise ist es möglich, die neueste Version manuell zu installieren.

1
Yerkon