2010-10-05 15 views
5

Estoy tratando de llamar a un servicio web (.asmx) desde una aplicación C#, en formato json.El servicio web se niega a recibir parámetros y responde en JSON

Cuando especifico el método de solicitud como GET, y no especifico contentType.

(req es HttpWebRequest)

req.Method = "GET"; 

Todo funciona bien, pero me da la respuesta XML.
cuando especifico Tipo de contenido:

req.ContentType = "application/json; charset=utf-8"; 

me sale error interno del servidor

500.

Cuando cambio método de la petición:

req.Method = "POST"; 

que sólo puede llamar a los métodos sin parámetros, que devuelve correctamente JSON, pero si trato de llamar a un método con parámetros, me sale error 500 de nuevo.

El código de servicio Web:

[WebMethod(EnableSession =true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string SimplestWebService() 
    {   
     return "hello"; 
    } 

Y con parámetros:

[WebMethod(EnableSession = true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string Echo(string aString) 
    {  
     return aString; 
    } 

será muy apreciada Cualquier idea.

Agregado: Quizás no estoy escribiendo la solicitud POST correcta (ahora lo estoy enviando en el encabezado, al igual que una solicitud GET). ¿Puede alguien por favor guiarme en eso?

Modo de creación: El sitio web es, en efecto marcado como script:

[ScriptService] 
public class MyAPI : System.Web.Services.WebService 

Y aquí es cómo construir mi solicitud POST (realmente tienden a creer que es el problema):

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(methodUrl.ToString()); 
req.Method = "POST"; 
req.Headers.Add("aString","oren"); 
req.ContentLength = 0;  
... 
req.ContentType = "application/json; charset=utf-8"; 
req.Accept = "application/json; charset=utf-8"; 
using (HttpWebResponse res = (HttpWebResponse)req.GetResponse()) 
{ 
    StreamReader sr = new StreamReader(res.GetResponseStream()); 
    result.Append(sr.ReadToEnd()); 
} 
... 

también probamos:

req.Method = "POST";   
string postData = "aString=kjkjk"; 
req.ContentType = @"application/json; charset=utf-8"; 
req.Accept = @"application/json; charset=utf-8"; 
ASCIIEncoding encoding = new ASCIIEncoding(); 
byte[] byte1 = encoding.GetBytes(postData); 
req.ContentLength = byte1.Length; 
Stream newStream = req.GetRequestStream(); 
newStream.Write(byte1, 0, byte1.Length); 
newStream.Close();   

dos últimas notas:
1. Este servicio web funciona en XML utilizando el navegador.
2. Al pedir json, el código nunca alcanza un punto de interrupción en el servicio web. Entonces este es posiblemente un problema de IIS (estoy usando IIS 6.1). Probé la recomendación de tipo MIME here.

Muchas gracias.

+0

¿Puede incluir el código donde configura la solicitud saliente? Específicamente, ¿cómo está agregando el parámetro "aString"? Eso podría ayudar a resolver el problema. – mikemanne

+0

Además, ¿la clase ASMX está etiquetada como: [ScriptService]? Creo (no 100% seguro) que es necesario para acceder al servicio web usando solicitudes de modo POST y datos con formato JSON. – mikemanne

+0

@mikemanne: Muchas gracias por la entrada. Actualizado. –

Respuesta

5

Actualización 2:

estoy usando fiddler2 mirar a una petición POST con éxito (de jQuery a mi servicio asmx), y veo una diferencia que podría valer la pena comprobación:

Accept: application/json, text/javascript, */* 

También hay algunas otras diferencias, pero esa es la única que se dispara como una posible pistola humeante.

respuesta Actualizado (en respuesta a la pregunta actualizada):

Parece que estás usando el contentStream correctamente. Sin embargo, los datos que está presionando sobre él ("aString = kjkjk") no son JSON válidos. Como se señala más adelante, los datos probablemente tendrán que estar en formato JSON válida:

{'aString':'kjkjk'} 

respuesta original:

Creo que está configurando el contenido "laCadena" incorrectamente. Para solicitudes de método POST, los datos de "carga útil" no se aplican al encabezado, es el contenido de la solicitud en sí. Por lo tanto, debe transmitirlo al objeto de solicitud; ver this MSDN reference para un ejemplo. No olvides establecer también la longitud del contenido de la solicitud.

Dado que está implementando el servicio a través de JSON (y ha especificado JSON como el tipo de contenido), creo que tendrá que convertir una cadena JSON en bytes sin procesar, y eso es lo que usted empujará en el corriente. Su cadena JSON debe ser algo como esto:

{'aString':'This is the text I want to echo.'} 

Es posible que tenga que hacer algunos ajustes (no estoy en un lugar donde pueda poner fácilmente juntos un ejemplo de código exacto), pero esto debe conseguirle yendo en la dirección correcta.

+0

Todavía no hay suerte .. Necesita una respuesta más específica –

+0

Una tontería: asegúrese de que su URL (methodUrl) se dirige al servicio web correcto (htp: //yourmachine/MyAPI.asmx/Echo).(deliberadamente mal escrito 'http' para que aparezca correctamente en este comentario) – mikemanne

+0

Debería estar avergonzado de mí mismo (-:. No puede darle la recompensa todavía, sólo en 22 horas (normas SO). Gracias. –

0

ContentType me parece que es el tipo de contenido de la solicitud , no la respuesta. ¿Qué sucede si envía un encabezado Accept en su lugar (informando al servidor de los tipos de contenido que está dispuesto a aceptar).

+0

Exactamente los mismos resultados que antes, ambos con GET y POST. –

+0

Lo comprobé en Fiddler, y recibo una respuesta json: {"Mensaje": "Hubo un error al procesar la solicitud". "StackTrace": "", "ExceptionType": ""} (y 500 servidor interno) error en el encabezado) –

+0

Además, si intento omitir el contentType, obtengo una respuesta XML. –

Cuestiones relacionadas