Demande.Contenu.ReadAsMultipartAsync ne retourne jamais
J'ai une API pour un système écrite à l'aide de la ASP.NET l'Api Web et suis en train de l'étendre à des images permettent d'être téléchargé. J'ai fait quelques recherches sur google et trouvé comment la méthode recommandée pour accepter les fichiers à l'aide de MultpartMemoryStreamProvider et certaines méthodes asynchrones mais mon attendent sur le ReadAsMultipartAsync ne retourne jamais.
Voici le code:
[HttpPost]
public async Task<HttpResponseMessage> LowResImage(int id)
{
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
var provider = new MultipartMemoryStreamProvider();
try
{
await Request.Content.ReadAsMultipartAsync(provider);
foreach (var item in provider.Contents)
{
if (item.Headers.ContentDisposition.FileName != null)
{
}
}
return Request.CreateResponse(HttpStatusCode.OK);
}
catch (System.Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}
Je peux étape à travers tout le chemin à l':
await Request.Content.ReadAsMultipartAsync(provider);
à quel point il ne sera jamais complète.
Quelle est la raison de mon attendent ne revient jamais?
Mise à jour
J'essaie de POSTER à cette action à l'aide de curl, la commande est la suivante:
C:\cURL>curl -i -F filedata=@C:\LowResExample.jpg http://localhost:8000/Api/Photos/89/LowResImage
J'ai aussi essayé d'utiliser le code html suivant à la POSTE à l'action et la même chose se produit:
<form method="POST" action="http://localhost:8000/Api/Photos/89/LowResImage" enctype="multipart/form-data">
<input type="file" name="fileupload"/>
<input type="submit" name="submit"/>
</form>
- Comment est-ce que votre code client ressembler?
- Pourriez-vous partager comment votre comment demander brute ressemble?
- Placer un point d'arrêt dans le code après le
await
ainsi. Parfois, il ne rompt pas/étape à la ligne suivante lorsque vous utilisez async/await (de mon expérience) - hmm...j'ai essayé avec le même code et le code html ci-dessus, mais je ne vois pas le problème que vous êtes en mentionnant...
- Je suis de la asp.net l'api web de l'équipe. Je serais intéressé pour déboguer plus si vous pouvez m'envoyer votre repro projet. Mon e-mail: [email protected]
Vous devez vous connecter pour publier un commentaire.
Je suis tombé sur quelque chose de semblable dans .NET 4.0 (pas async/await). À l'aide du débogueur de pile de Thread, je pourrais dire que ReadAsMultipartAsync a été le lancement de la tâche sur le même fil, de sorte qu'il serait impasse. J'ai fait quelque chose comme ceci:
La TaskCreationOptions.LongRunning paramètre a été la clé pour moi, car sans elle, l'appel serait de continuer le lancement de la tâche sur le même thread. Vous pouvez essayer d'utiliser quelque chose comme le pseudo-code suivant pour voir si cela fonctionne pour vous dans C# 5.0:
StartNew
Action à lire quelque chose commeprovider = Request.Content.ReadAsMultipartAsync(provider).Result;
. Vous pouvez ensuite accéder au fournisseur une fois que la fonction d'Attente.await Task.FromResult(Request.Content.ReadAsMultipartAsync(provider));
Je suis tombé sur le même problème avec tous les 4.5.2 cadre.
Mon API méthode accepte un ou plusieurs fichiers téléchargés à l'aide d'une requête POST avec plusieurs parties de contenu. Il a bien fonctionné avec les petits fichiers, mais avec de plus gros, ma méthode pendu à jamais, parce que la
ReadAsMultipartAsync()
la fonction n'a jamais été terminée.Ce qui m'a aidé: à l'aide d'un
async
méthode de contrôleur etawait
pour laReadAsMultipartAsync()
pour terminer, au lieu d'obtenir le résultat de la tâche en mode synchrone méthode de contrôleur.Donc, , cela ne fonctionne pas:
Et cela a fonctionné:
où
SomeLogic
est juste une fonction synchrone de prendre le contenu binaire et la production d'une chaîne de caractères (peut être n'importe quel type de traitement).Mise à JOUR Et enfin j'ai trouvé l'explication dans cet article: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx
Donc, en gros, le “Async tout le chemin” de directive a une raison derrière elle, et c'est un bon exemple.
Avec l'aide de une autre réponse sur stackoverflow et un billet de blog sur targetFramework, j'ai trouvé que la mise à jour à 4,5 et ajouter/mise à jour de la suite de votre site web.config résout ce problème:
J'ai un travail .Net MVC WebAPi projet avec le Post suivant, la méthode qui semble bien fonctionner. C'est très similaire à ce que vous avez déjà ce qui devrait être utile.
J'ai eu le même. Ma solution
et de l'invocation de