2009-04-01 38 views
5

Estoy tratando de llamar a [webmethod] desde C#. Puedo llamar a webmethod simple que tome los parámetros de 'cadena'. Pero tengo un método web que toma un parámetro 'byte []'. Me estoy quedando sin 'error de servidor interno 500' cuando intento llamarlo. Aquí hay un ejemplo de lo que estoy haciendo.Cómo usar HttpWebRequest para llamar a un servicio web Operación que toma un parámetro byte []?

permite decir mi método es como esto

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

lo llamo como esto utilizando HttpRequest en 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()); 
      } 

Esto funciona perfectamente bien. Ahora tengo otra WebMethod que se define como esto

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

Traté de llamar como este

  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); 

Pero eso me da un error 500 interno :(

Respuesta

0

Es probable que necesite a base 64 codificar los datos binarios

Pero el error 500 es una pista para buscar en el registro de eventos de Windows y ver lo que sucedió en el lado del servidor.

3

Está utilizando la capacidad HTTP POST/HTTP GET de la instalación de servicios web ASP.NET en lugar de enviar una llamada real al servicio web. Este es un mecanismo que le permite probar servicios web simples pero en realidad no está diseñado para su uso en una aplicación de producción. De hecho, si navega hacia la URL del servicio web, verá que ni siquiera puede mostrar un formulario de entrada de prueba para ese tipo de parámetro. Podría ser posible encontrar una forma de engañarlo para que funcione, pero para ser honesto, debe usarlo de la manera que se pretende y generar un proxy de servicio web.

Dentro de Visual Studio, haga clic con el botón derecho del mouse en el proyecto que contiene el código del cliente y seleccione Agregar servicio o Referencia web. Luego escriba la URL del servicio web y generará un proxy. Si está utilizando WCF se verá algo como esto:

// 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); 

Espero que esto ayude.

+0

Digamos que yo estaba usando C++ y HttpOpenRequest .. ¿cómo iba a hacerlo, entonces? – shergill

+0

No estoy seguro de la parte superior de mi cabeza :) –

+2

Si el código anterior funciona, podría usar Fiddler para ver cómo se construye la solicitud http y luego usar esa información para que funcione su código personalizado. –

5

es posible, he hecho yo mismo

En primer lugar la configuración del encabezado, esto se puede obtener si su servicio web puede ser ejecutado a través de la web y el envío de los parámetros. Uso las herramientas de desarrollador de Chrome. La manera más fácil es revisar la descripción del servicio web (es decir, http: //myweb.com/WS/MyWS.asmx op = Validación)

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"); 

A continuación, la parte de petición de

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(); 

Ahora puede obtener el flujo entrante de la respuesta

Recuerde adaptar el sobre SOAP y los parámetros que se enviarán de acuerdo con la descripción dada por los detalles de la página del servicio web (es decir, http: //myweb.com/WS/MyWS .asmx? op = Validación).

Cuestiones relacionadas