0

J'essaye actuellement de soumettre un formulaire contenant plusieurs fichiers à son serveur de destination mais je ne sais pas comment envoyer ces données de formulaire en utilisant HttpWebRequest. Le formulaire est de type MultipartFormDataContent. J'ai jusqu'ici vu des façons de soumettre un formulaire en utilisant HttpWebRequest mais ceci est fait en construisant le formulaire comme une chaîne et en le convertissant ensuite en un tableau d'octets. Donc, quelque chose comme ça,Comment utiliser MultipartFormDataContent dans un HttpWebRequest?

string postData = ""; 

     foreach (string key in postParameters.Keys) 
     { 
      postData += HttpUtility.UrlEncode(key) + "=" 
        + HttpUtility.UrlEncode(postParameters[key]) + "&"; 
     } 

     HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url); 
     myHttpWebRequest.Method = "POST"; 

     byte[] data = Encoding.ASCII.GetBytes(postData); 
Stream requestStream = myHttpWebRequest.GetRequestStream(); 
     requestStream.Write(data, 0, data.Length); 
     requestStream.Close(); 

Cependant, ma forme est pas une chaîne mais de type MultipartFormDataContent et donc je ne suis pas sûr de ce qu'il faut faire.

Répondre

1

Donc cette première chose que j'ai faite ici était de convertir l'objet MultipartFormDataContent en un tableau Byte. Octet [] byteArray = await form.ReadAsByteArrayAsync(); J'ai ensuite passé cela à une fonction, ce qui rend le HttpWebRequest().

private string HttpPostRequest(string url, MultipartFormDataContent formData, Byte[] form) 
    { 
     HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url); 
     myHttpWebRequest.Method = "POST"; 

     myHttpWebRequest.ContentType = formData.Headers.ContentType.ToString(); 
     myHttpWebRequest.ContentLength = formData.Headers.ContentLength.Value; 
     myHttpWebRequest.ProtocolVersion = HttpVersion.Version10; 
     myHttpWebRequest.ServicePoint.ConnectionLimit = 24; 
     myHttpWebRequest.KeepAlive = false; 
     myHttpWebRequest.Timeout = System.Threading.Timeout.Infinite; 
     myHttpWebRequest.AllowWriteStreamBuffering = false; 
     System.Net.ServicePointManager.Expect100Continue = false; 


     Stream requestStream = myHttpWebRequest.GetRequestStream(); 
     int i = 0; 
     attachAttempt: 
     try 
     { 
      requestStream.Write(form, 0, form.Length); 
     } 
     catch (IOException e) 
     { 
      if (i < 5) 
      { 
       i++; 
       goto attachAttempt; 
      } 

      DialogResult attachFail; 
      string attachFailMessage = e.Message.ToString() + " Please check your network and try again."; 
      string attachFailCaption = "Network error."; 
      MessageBoxButtons emailFailButtons = MessageBoxButtons.OK; 
      attachFail = MessageBox.Show(attachFailMessage, attachFailCaption, emailFailButtons, MessageBoxIcon.Error); 

      return ""; 
     } 
     requestStream.Close(); 

     HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 

     Stream responseStream = myHttpWebResponse.GetResponseStream(); 

     StreamReader myStreamReader = new StreamReader(responseStream, Encoding.Default); 

     string pageContent = myStreamReader.ReadToEnd(); 

     myStreamReader.Close(); 
     responseStream.Close(); 

     myHttpWebResponse.Close(); 

     return pageContent; 
    } 

J'ai compilé ceci après avoir recherché plusieurs suggestions liées à ce domaine. Vous constaterez peut-être que vous n'avez pas besoin de définir certains des indicateurs sur l'objet myHttpWebRequest, mais c'est ce qui a fonctionné pour moi. J'ai également constaté que les problèmes sur votre réseau auront un impact sévère car la connexion entre votre machine hôte et la machine de destination peut être annulée et c'est pour cette raison que j'ai mis Write() dans un bloc try and catch au cas où je devrais renvoie une erreur