web-dev-qa-db-fra.com

Enregistrement de données de formulaire ET d'un fichier dans une API Web ASP.NET

J'ai cette méthode API Web ASP.NET et je souhaite publier un objet et, dans le même temps, un fichier!

    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));
    }

Et je veux l'appeler, alors j'envoie cette requête http avec fiddler:

Entête: 

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

Corps:

---------------------------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--

Je reçois un code d'erreur 415 avec le texte de la réponse:

{"message": "Le type de média de l'entité de demande 'multipart/form-data' n'est pas pris en charge pour cette ressource.", "exceptionMessage": "Aucun MediaTypeFormatter n'est disponible pour lire un objet de type" Facility "à partir d'un contenu avec un type de média. 'multipart/form-data'. "," exceptionType ":" System.Net.Http.UnsupportedMediaTypeException "," stackTrace ":" sur System.Net.Http.HttpContentExtensions.ReadAsAscync [T] (contenu HttpContent, contenu Type, IEnumerable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable1 formateurs, IFormatterLogger formatterLogger, CancellationToken cancelToken)\r\n à System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync (demande HttpRequestMessage, Type, IEnumerable`1, format.

J'ai beaucoup cherché avant de demander mais je n'ai trouvé aucune solution. Thnaks pour aider.

MODIFIER:

Remarque: si je supprime le paramètre "facility" et laisse la méthode uniquement pour le téléchargement du fichier, cela fonctionne parfaitement, mais je souhaite publier JSON et un fichier ensemble.

15
Hashem

"mulitpart/form-data" donc on enregistre le UploadMultipartMediaTypeFormatter

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

* inscrivez-vous dans global.asax ou (voir code sandbox)

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

WebApi va maintenant appeler MediaTypeFormatter.ReadFromStreamAsync et nous pouvons appeler l'extension HttpContent.ReadAsMultipartAsync à partir de là.