2017-09-20 4 views
0

Je n'arrive pas à obtenir ma méthode web api 2 pour lire correctement mon message multipart/form-data depuis ng-file-upload sur l'interface utilisateur angulaire côté.Comment puis-je recevoir des données multipart/form dans web api 2 sur OWIN pipeline

J'initié l'appel comme ceci:

Upload.upload({ 
       url: config.ApiUrl + 'Orders/CreateOrder', 
       data: request 
      }).then(function (response) { 
       console.log('Success ' + response.config.data.file.name + 'uploaded. Response: ' + response.data); 
      }, function (error) { 
       $scope.errors = "Oops! Something went wrong... " + error.statusText; 
      }); 

Et cela me reçoit une charge utile d'envoyer web api:

-----------------------------9623122368016 
Content-Disposition: form-data; name="somefield" 

Some Value 
-----------------------------9623122368016 
Content-Disposition: form-data; name="errorMessage" 

null 
-----------------------------9623122368016 
Content-Disposition: form-data; name="success" 

false 
-----------------------------9623122368016 
Content-Disposition: form-data; name="file"; filename="imapdf.pdf" 
Content-Type: application/pdf 

%PDF-1.2 
1 0 obj 
<< 
/Producer() 
/Author() 
/Title() 
/Subject() 
/Keywords() 
/CreationDate(D:20040106) 
/ModDate(D:20040106) 
/Creator() 
>> 
endobj 
2 0 obj 
<< 
/Type/XObject 
/Subtype/Image 
/Name/wpt1 
/Width 41 
/Height 15 
/BitsPerComponent 8 
/ColorSpace/DeviceRGB 
/Length 100 
/Filter [/FlateDecode] >> 
stream 
xsqH0s 

Je ne peux pas accéder à HttpContext.Current.Request.Files parce que je suis à l'aide le pipeline OWIN, et je n'ai pas beaucoup de chance avec Request.Content.ReadAsMultipartAsync

Comment puis-je recevoir mon fichier & associé à des données de formulaire dans le web api 2?

de code C# Mise à jour:

public Task<OrderRequest> CreateOrder(OrderRequest orderRequest) 
{ 
    try 
    { 
     var asdf = OwinHttpRequestMessageExtensions.GetOwinContext(Request); 
     if (!Request.Content.IsMimeMultipartContent("multipart/form-data")) 
     { 
      var provider = new MultipartMemoryStreamProvider(); 
      this.Request.Content.ReadAsMultipartAsync(provider); 

      var content = provider.Contents.First(); 
      var buffer = content.ReadAsByteArrayAsync(); 
     } 

     var test = orderRequest; 
     var a = HttpContext.Current.Request.Files; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 

    return Task.FromResult<OrderRequest>(null); 
} 
+0

Il semble que le code AngularJS crée correctement la requête HTTP. S'il vous plaît montrer le code côté serveur qui a un problème. – georgeawg

+0

@georgeawg posté mes tentatives futiles pour obtenir les données – RandomUs1r

+0

Il semble que vous aurez besoin d'utiliser 'Request.Content.ReadAsMultipartAsync'. Pouvez-vous nous montrer le code que vous avez pour cela? –

Répondre

1

Comme son nom l'indique, est une ReadAsMultipartAsyncfonction asynchrone. Parce que vous n'attendez pas l'appel, vous vous retrouvez probablement dans une situation où vous essayez d'accéder à Contents avant qu'il ne soit rempli.

Pour résoudre ce problème, vous pouvez mettre à jour votre action CreateOrder comme suit:

public async Task<OrderRequest> CreateOrder(OrderRequest orderRequest) 
{ 
    ... 
    await this.Request.Content.ReadAsMultipartAsync(provider); 
    ... 
} 

Tout ce qui a changé ici est l'ajout de async avant Task<OrderRequest> et await avant this.Request.Content.ReadAsMultipartAsync(provider);. Vous aurez également besoin d'ajouter await avant content.ReadAsByteArrayAsync(); pour la même raison et alors vous pouvez simplement return null plutôt que d'avoir à utiliser Task.FromResult à la fin.

En fait, voici le code entier avec ces changements:

public async Task<OrderRequest> CreateOrder(OrderRequest orderRequest) 
{ 
    try 
    { 
     var asdf = OwinHttpRequestMessageExtensions.GetOwinContext(Request); 
     if (!Request.Content.IsMimeMultipartContent("multipart/form-data")) 
     { 
      var provider = new MultipartMemoryStreamProvider(); 
      await this.Request.Content.ReadAsMultipartAsync(provider); 

      var content = provider.Contents.First(); 
      var buffer = await content.ReadAsByteArrayAsync(); 
     } 

     var test = orderRequest; 
     var a = HttpContext.Current.Request.Files; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 

    return null; 
} 

De toute évidence, ce n'est pas une solution complète, mais je crois qu'il répondra à vos problèmes spécifiques et vous permettre de continuer votre exploration.

+0

Cela a du sens, merci pour votre aide! – RandomUs1r