2012-01-16 14 views
5

Mi problema es conocido y discutido tema here y here. Pero incluso después de leer e implementar las soluciones sugeridas, no puedo hacer que esto funcione.llamada dominios con jQuery jsonp al servicio web ASP.NET

El problema: el servicio web XML regresar insted de JSON:

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://tempuri.org/">"Now i am getting jsop string""2nd param"</string> 

Ahora vamos a romper el código en secciones:

el servidor remoto (IIS 7.0, .NET 4):
web.config:

<?xml version="1.0"?> 
<configuration> 
     <system.webServer> 
      <modules> 
       <add name="JsonHttpModule.JsonHttpModule" type="JsonHttpModule"/> 
      </modules> 
     </system.webServer> 
    <system.web.extensions> 
     <scripting> 
      <webServices> 
       <jsonSerialization maxJsonLength="102400"/> 
      </webServices> 
     </scripting> 
    </system.web.extensions> 
    <system.web> 
     <compilation debug="true" targetFramework="4.0" /> 
     <customErrors mode="Off"/> 
     <webServices> 
      <protocols> 
       <add name="HttpGet"/> 
       <add name="HttpPost"/> 
      </protocols> 
     </webServices> 
    </system.web> 
</configuration> 


el servicio web:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Services; 
using System.Web.Script.Services; 
using JsonHttpModule; 
/// <summary> 
/// Summary description for JSONP_EndPoint 
/// </summary> 
[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService] 
public class MyService : System.Web.Services.WebService { 
    [WebMethod] 
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
    public string Sum(string x, string y) 
    { 
     return x + y; 
    } 

} 


la clase HttpModule:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.IO; 
using System.Text; 

/// <summary> 
/// Summary description for ContentTypeHttpModule 
/// </summary> 
namespace JsonHttpModule 
{ 
    public class JsonHttpModule : IHttpModule 
    { 
     private const string JSON_CONTENT_TYPE = "application/json; charset=utf-8"; 

     public void Dispose() 
     { 
     } 
     public void Init(HttpApplication app) 
     { 
      app.BeginRequest += OnBeginRequest; 
      app.EndRequest += new EventHandler(OnEndRequest); 
     } 
     public void OnBeginRequest(object sender, EventArgs e) 
     { 
      HttpApplication app = (HttpApplication)sender; 
      HttpRequest request = app.Request; 
      //Make sure we only apply to our Web Service 
      if (request.Url.AbsolutePath.ToLower().Contains("MyService.asmx")) 
      { 
       if (string.IsNullOrEmpty(app.Context.Request.ContentType)) 
       { 
        app.Context.Request.ContentType = JSON_CONTENT_TYPE; 
       } 
       app.Context.Response.Write(app.Context.Request.Params["callback"] + "("); 
      } 
     } 
     void OnEndRequest(object sender, EventArgs e) 
     { 
      HttpApplication app = (HttpApplication)sender; 
      HttpRequest request = app.Request; 
      if (request.Url.AbsolutePath.ToLower().Contains("MyService.asmx")) 
      { 
       app.Context.Response.Write(")"); 
      } 
     } 
    } 
} 

lado del cliente (localhost):

<script> 
    $(function() { 
     $('#btn_test').click(function() { 
      $.ajax({ url: "http://tonofweb.com/MyService.asmx/Sum", 
       data: { x: JSON.stringify("Now i am getting jsop string"), y: JSON.stringify("2nd param") }, 
       dataType: "jsonp", 
       success: function (json) { 
        alert(json.d); 
       }, 
       error: function() { 
        alert("Hit error fn!"); 
       } 
      }); 
    }); 
}); 
</script> 
    <input id="btn_test" type="button" value="POST" /> 

así que lo que estoy haciendo mal aquí? puede probarlo usted mismo es un servicio web en vivo. Gracias por su ayuda.

+0

cambiar de jsonp a JSON no funciona debido a la edición dominios y convertir a oponerse todavía volver xml –

Respuesta

7

Parece que toda la configuración y los atributos están en su lugar para que el servicio web devuelva JSON pero noté en su solicitud de jQuery que no especifica el tipo de contenido de los datos que está ingresando. Lo he agregado a el código de abajo:

$.ajax({ 
    url: "http://tonofweb.com/MyService.asmx/Sum", 
    contentType: "application/json; charset=utf-8", 
    data: { x: JSON.stringify("1"), y: JSON.stringify("2") }, 
    dataType: "jsonp", 
    success: function (json) { 
    alert(json.d); 
    }, 
    error: function() { 
    alert("Hit error fn!"); 
    } 
}); 

Aviso he añadido a los contentType: "application/json; charset=utf-8", configuración de la solicitud.

He probado el código de la navegación a http://tonofweb.com (que devuelve un 403 por el momento), incluyendo jQuery utilizando el jQuerify bookmarklet, y luego ejecutar el código de su pregunta primero (sin el contentType), y luego el código Publiqué arriba (con contentType).

Estas son las respuestas de la ficha Red en los desarrolladores de Chrome Herramientas:

Sin contentType:

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://tempuri.org/">"Now i am getting jsop string""2nd param"</string> 

Con contentType:

{"d":"12"} 

Así que el segundo al menos da como resultado que JSON sea devuelto por el servidor. Para que todo lo demás sea igual, yo diría que agreguen el contentType.

ver aquí para una explicación de los requisitos para volver JSON:

ASMX and JSON – Common mistakes and misconceptions

La solicitud HTTP debe declarar un tipo de contenido application/json. Este informa al ScriptService que recibirá sus parámetros como JSON y que debe responder en especie.

Ahora todavía tiene otro problema, y ​​es que la solicitud, al finalizar, llama a la función de error. Si cambia dataType: "jsonp" a dataType: "json" llamará a la función de éxito. Entonces, algo sobre su implementación del wrapper de devolución de llamada es incorrecto, porque jQuery no puede manejar la respuesta como JSONP.

Ahora que no estoy viendo la devolución de llamada envuelto en la respuesta, ya sea, por JSONP, la respuesta debe ser algo como:

jQuery17106476630216930062_1326752446188({"d":"12"}) 

noto que está vinculando a this post acerca de cómo hacer una respuesta de JSONP un servicio web, pero no está siguiendo el consejo: no usa Response.Filter, sino que usa Response.Write.

+0

aún no funciona .... –

+0

Sí, se está trabajando, que declaró: "El problema: el servicio web XML regresar inssted de json: ". Acabo de probar este código, y su servicio web responde con JSON si solo agrega 'contentType:" application/json; charset = utf-8 "' –

+1

aún no puedo hacer que funcione incluso después de agregar contentType: "aplicación/json; charset = utf-8 "Estoy obteniendo: " 1 "" 2 "

Cuestiones relacionadas