WebAPI ne peut pas analyser la publication multipart / form-data
Je suis en train d'accepter un poste à partir d'un client (iOS) et mon code met en situation d'échec à la lecture du flux. Dit le message n'est pas complète. J'ai essayé de le faire fonctionner pendant des heures, il semble que quelque chose est faux dans mon format de message ou quelque chose. Tout ce que je suis en train de faire est de lire une chaîne de caractères, mais le développeur que je suis en train de travailler avec l'oms est en train de faire l'iOS partie seulement sait comment envoyer multipart/form-data pas content-type json.
Ici est exact de l'erreur:
La fin inattendue de MIME multipart flux. Message MIME multipart n'est pas complète."
Il échoue ici: await Request.Content.ReadAsMultipartAsync(provider);
En-têtes:
POST http://localhost:8603/api/login HTTP/1.1
Host: localhost:8603
Accept-Encoding: gzip,deflate
Content-Type: multipart/form-data; boundary=------------nx-oauth216807
Content-Length: 364
Accept-Language: en-us
Accept: */*
Connection: keep-alive
Corps:
--------------nx-oauth216807
Content-Disposition: form-data; name="token"
CAAH5su8bZC1IBAC3Qk4aztKzisZCd2Muc3no4BqVUycnZAFSKuleRU7V9uZCbc8DZCedYQTIFKwJbVZCANJCs4ZCZA654PgA22Nei9KiIMLsGbZBaNQugouuLNafNqIOTs9wDvD61ZA6WSTd73AVtFp9tQ1PmFGz601apUGHSimYZCjLfGBo40EBQ5z6eSMNiFeSylym1pK4PCvI17fXCmOcRix4cs96EBl8ZA1opGKVuWizOsS0WZCMiVGvT
--------------nx-oauth216807--
Ici est la WebAPI code:
public async Task<HttpResponseMessage> PostFormData()
{
//Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
try
{
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
//Read the form data and return an async task.
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);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
catch (System.Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}
source d'informationauteur Shaw Levin
Vous devez vous connecter pour publier un commentaire.
Ma demande a été l'expérience de cette erreur périodiquement. La mise à niveau de l'API WEB 2.1 n'a rien fait et le message d'exception est complètement inutile.
Je pense que ce qui se passait vraiment bien, c'est d'étouffement sur des fichiers volumineux. L'augmentation de mon max limite la demande dans le web.config semblait le fixer droit.
(Ce qui fixe le plafond à 30 mégas. Définissez ce que vous avez besoin. Plus d'infos ici)
J'ai rencontré cette erreur trop. Le
InnerException
estCannot access a disposed object.
Cela signifie que quelque chose est la lecture de votre flux avant votre appel àReadAsMultipartAsync
.Quelque part, avant cet appel
Request.Content.ReadAsMultipartAsync(provider)
, vous pouvez appelerRequest.Content.LoadIntoBufferAsync().Wait()
qui va charger ce tream dans une mémoire tampon et vous permettre de lire plus d'une fois.Ce n'est pas une solution optimale, mais il fonctionne.
Je laisse ce ici, car il m'a fallu un certain temps à essayer d'autres solutions de contournement jusqu'à ce que je l'ai croisé sur la suite de répondre de façon utile et certaines personnes ayant ce problème peut retrouver sur ce post.
Un \r\n doit être ajouté à la fin de la demande de flux de contenu.
Au lieu d'utiliser cette ligne pour lire les données:
Vous aurez besoin de:
charge de la demande de flux de la mémoire
ajouter le \r\n chaîne qui est nécessaire
créer un flux de contenu à partir du contenu de la mémoire
ajouter manuellement les en-têtes de requête dans le flux de contenu
Enfin utiliser ce lieu:
Vérifier la réponse de Landuber Kassa ici pour obtenir le code complet: ASP.NET l'API Web, la fin inattendue de MIME multi-flux lors du téléchargement de Flex FileReference
Simplement une modification de Shaw Levin réponse au cas où quelqu'un veut l'utiliser.
boundary = value.Substring(0, value.IndexOf("\r\n"));
se trouve la première occurrence du CRLF, vous devez la modifier pourboundary = value.Substring(0, value.LastIndexOf("\r\n"));
donc, il recherche la dernière occurrence. Sinon, si le contenu comprend un CRLF quelque part dans le milieu, vous perdrez une partie des données dans la demande.Il y avait une erreur semblable postes, pour certains, la solution a fonctionné, c'est: pour ne citer Id="", nom="" attribut de fichier en téléchargement html contrôle, grâce à WebAPI message d'erreur de téléchargement. Fin prévue de MIME multipart flux. MIME multipart message n'est pas complet
Mais dans mon cas, cela n'a pas résolu avec un simple tweak 🙁
Je ne recommanderais pas cette réponse - j'espère qu'il y est une meilleure façon maintenant disponible.
Quelqu'un a demandé, voici donc mon parseur personnalisé qui a été fonctionne bien:
Limite vient d'ici:
Et puis on analyse le contenu de la demande ici: