Multipart POST de formulaire à l'aide de ASP.Net Web API

J'ai un POST ASP.Net Web Api méthode adaptée de Un guide pour les uploads de fichier asynchrone dans ASP.NET l'API Web RTM.

Je suis en cours d'exécution dans reproché Tâche de problème avec toutes les demandes déclenché après la première demande est tiré et complète.

Voici le scénario: j'ai une page qui affiche un fichier avec d'autres paramètres de l'API Web de la méthode Post. Il fonctionne très bien la première fois et le fichier est téléchargé. Mais, toutes les demandes ultérieures a la fin de la tâche dans un reproché à l'etat. J'ai “la fin Inattendue de MIME multipart flux. Message MIME multipart n'est pas complète.” Des idées pourquoi?

Collé ci-dessous est le code source de ma méthode Post, exemple de formulaire html et le total Exception.

    public Task<HttpResponseMessage> Post([FromUri]string memberNumber)
    {
        //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 and return an async task.
        var task = Request.Content.ReadAsMultipartAsync(provider).
            ContinueWith(t =>
            {
                if (t.IsFaulted || t.IsCanceled)
                {
                    throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception));
                }

                return Request.CreateResponse(HttpStatusCode.OK, new MyModel());
            });

        return task;
    }

Je suis de tir de cette api web à l'aide d'un exemple de formulaire comme ceci:

<form name="form1" method="post" enctype="multipart/form-data" action="api/claims/asd123" style="margin:auto;width:500px;">
    <div>
        <label for="HCPracticeNumber">HC Pratice Number:</label>
        <input type="text" name="HCPracticeNumber" id="HCPracticeNumber"/>
    </div>
    <div>
        <label for="ServiceDate">Service/Treatment date:</label>
        <input type="text" name="ServiceDate" id="ServiceDate"/>
    </div>
    <div>
        <label for="AmountClaimed">Amount Claimed:</label>
        <input type="text" name="AmountClaimed" id="AmountClaimed"/>
    </div>
    <div>
        <label for="Image">Image Attachment:</label>
        <input name="Image" type="file" />
    </div>
    <div>
        <input type="submit" value="Submit" />
    </div>
</form>

La AggregateException qui est renvoyée est comme suit:

<Error>
<Message>An error has occurred.</Message>
    <ExceptionMessage>One or more errors occurred.</ExceptionMessage>
    <ExceptionType>System.AggregateException</ExceptionType>
    <StackTrace/>
    <InnerException>
        <Message>An error has occurred.</Message>
        <ExceptionMessage>
            Unexpected end of MIME multipart stream. MIME multipart message is not complete.
        </ExceptionMessage>
        <ExceptionType>System.IO.IOException</ExceptionType>
        <StackTrace>
            at System.Net.Http.Formatting.Parsers.MimeMultipartBodyPartParser.<ParseBuffer>d__0.MoveNext() at System.Net.Http.HttpContentMultipartExtensions.MoveNextPart(MultipartAsyncContext context)
        </StackTrace>
    </InnerException>
</Error>

Mise à jour:

Après Filip de la suggestion, sur son blog, site, j'ai modifié la méthode post pour réinitialiser la position du pointeur à 0, comme ceci:

        Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
        if (reqStream.CanSeek)
        {
            reqStream.Position = 0;
        }
        var task = Request.Content.ReadAsMultipartAsync(provider).
            ContinueWith(t =>
            {
                if (t.IsFaulted || t.IsCanceled)
                {
                    throw new HttpResponseException(
                    Request.CreateErrorResponse(HttpStatusCode.InternalServerError,
                    t.Exception));
                }

                return Request.CreateResponse(HttpStatusCode.OK, new MyModel());

            });

Mais, c'est très capricieux code. Cela fonctionne parfois, il n'a pas d'autres moments. En d'autres termes, il ne résout pas le problème entièrement.

avez-vous lu le corps de la demande d'ailleurs? c'est à dire messagehandler? que faites-vous avec les autres variables de la forme? Normalement, cette erreur signifie que le corps de la demande a été lu une fois déjà, et le flux de contenu est la position à la fin.
aussi, êtes-vous à l'aide de l'API Web RTM?
oui, je suis à l'aide de l'API Web RTM. oui, j'ai un gestionnaire de messages pour vérifier HTTP-Method-Remplacer l'en-Tête et j'ai votre WebApiUsage Gestionnaire et un autre gestionnaire d'Authentification. Je ne le fais pas tout de suite avec les autres paramètres, mais je vais les lire aussi. Je tiens tout d'abord à obtenir ce genre de choses à travailler avant de me répondre. N'a d'autres paramètres qui ne sont pas en cours de lecture, qui ont une incidence sur ce problème?
que l'utilisation de l'api du gestionnaire lit le corps empêche de le lire ailleurs. commentaire de la partie de la fonction qui lit le corps et vérifier de nouveau
vous avez été tout à fait correcte. J'ai commenté la demande.Contenu.ReadAsStringAsync() et cela fonctionne parfaitement maintenant. Mais la question devient maintenant, comment puis je faire WebApiUsageHandler également vous connecter à la demande?

OriginalL'auteur badikumar | 2012-09-12