2009-04-01 7 views
5

J'essaie d'appeler un [webmethod] de C#. Je peux appeler webmethod simple qui accepte les paramètres 'string'. Mais j'ai une webmethod qui prend en paramètre 'byte []'. Je cours dans «500 erreur de serveur interne» quand j'essaye de l'appeler. Voici un exemple de ce que je fais.Comment utiliser HttpWebRequest pour appeler une opération de service Web qui prend un paramètre byte []?

Disons que ma méthode est comme ça

[WebMethod] 
public string TestMethod(string a) 
{ 
    return a; 
} 

Je l'appelle comme cela en utilisant HTTPRequête C#

  HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
      req.Credentials = CredentialCache.DefaultCredentials; 
      req.Method = "POST"; 
      // Set the content type of the data being posted. 
      req.ContentType = "application/x-www-form-urlencoded"; 

      string inputData = "sample webservice"; 
      string postData = "a=" + inputData; 
      ASCIIEncoding encoding = new ASCIIEncoding(); 
      byte[] byte1 = encoding.GetBytes(postData); 

      using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) 
      { 
       StreamReader sr = new StreamReader(res.GetResponseStream()); 
       string txtOutput = sr.ReadToEnd(); 
       Console.WriteLine(sr.ReadToEnd()); 
      } 

Cela fonctionne parfaitement bien. Maintenant, j'ai une autre webmethod qui est défini comme celui-ci

[WebMethod] 
public string UploadFile(byte[] data) 

J'ai essayé d'appeler comme ça

  ASCIIEncoding encoding = new ASCIIEncoding(); 
      string postData = "data=abc"; 
      byte[] sendBytes = encoding.GetBytes(postData); 
      req.ContentLength = sendBytes.Length; 
      Stream newStream = req.GetRequestStream(); 
      newStream.Write(sendBytes, 0, sendBytes.Length); 

Mais cela me donne une erreur 500 interne :(

Répondre

0

Vous aurez probablement besoin de base64 encoder les données binaires

Mais l'erreur 500 est un indice à regarder dans le journal des événements de Windows et voir ce qui s'est passé sur le côté serveur

3

Vous utilisez la fonctionnalité HTTP POST/HTTP GET de la plomberie ASP.NET Web Service au lieu d'envoyer un appel de service Web réel. C'est un mécanisme qui vous permet de tester des services Web simples, mais il n'est pas vraiment conçu pour être utilisé dans une application de production. En fait, si vous accédez à l'URL du service Web, vous constaterez qu'il ne peut même pas afficher un formulaire de saisie de test pour ce type de paramètre. Il est peut-être possible de trouver un moyen de le faire fonctionner, mais pour être honnête, vous devriez l'utiliser comme prévu et générer un proxy de service Web.

Dans Visual Studio, cliquez avec le bouton droit de la souris sur le projet contenant le code client et sélectionnez Ajouter un service ou une référence Web. Puis tapez l'URL du service Web et il va générer un proxy. Si vous utilisez WCF, il ressemblera à ceci:

// ServiceNameClient is just a sample name, the actual name of your client will vary. 
string data = "abc"; 
byte[] dataAsBytes = Encoding.UTF8.GetBytes(data); 
ServiceNameClient client = new ServiceNameClient(); 
client.UploadFile(dataAsBytes); 

Espérons que cela aide.

+0

Disons que j'utilisais C++ et HttpOpenRequest .. comment pourrais-je faire alors? – shergill

+0

Je ne suis pas sûr du haut de ma tête :) –

+2

Si le code ci-dessus fonctionne, vous pouvez utiliser Fiddler pour voir comment la requête http est construite et ensuite utiliser cette information pour que votre code personnalisé fonctionne. –

5

il est possible, je l'ai fait moi-même

D'abord les paramètres d'en-tête, cela peut être obtenu si votre webservice peut être exécuté par le web et l'envoi des paramètres. J'utilise les outils Developer de Chrome. Le plus simple est d'examiner la description du webservice (c.-à-http: //myweb.com/WS/MyWS.asmx op = validation)

WebRequest request = WebRequest.Create(http://myweb.com/WS/MyWS.asmx?op=Validation); 
request.Method = "POST"; 
((HttpWebRequest)request).UserAgent = ".NET Framework Example Client"; 
request.ContentType = "text/xml; charset=utf-8"; 
((HttpWebRequest)request).Referer = "http://myweb.com/WS/MyWS.asmx?op=Validation"; 
((HttpWebRequest)request).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
((HttpWebRequest)request).Host= "myweb.com"; 
request.Headers.Add("SOAPAction","http://myweb.com/WS/Validation"); 

Ensuite, la partie de la demande

string message = "a=2"; 
string envelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+ 
     "<soap:Body><Validation xmlns=\"http://myweb.com/WS\"><data>@Data</data></Validation></soap:Body></soap:Envelope>"; 
string SOAPmessage = envelope.Replace("@Data", System.Web.HttpUtility.HtmlEncode(message)); 
// The message must be converted to bytes, so it can be sent by the request 
byte[] data = Encoding.UTF8.GetBytes(SOAPmessage); 
request.ContentLength = data.Length; 
request.Timeout = 20000; 
Stream dataStream = request.GetRequestStream(); 
dataStream.Write(data, 0, data.Length); 
dataStream.Close(); 
WebResponse response = request.GetResponse(); 
Stream inputStream = response.GetResponseStream(); 

maintenant vous pouvez obtenir le flux entrant à partir de la réponse

N'oubliez pas d'adapter l'enveloppe SOAP et les paramètres à envoyer en fonction de la description donnée par les détails de la page depuis le webservice (par exemple http: //myweb.com/WS/MyWS .asmx? op = Validation).