Errore durante l'accesso al servizio web ASP.net utilizzando JQuery - JSONP
-
10-07-2019 - |
Domanda
Per favore, guarda il codice qui sotto e aiutami a capire cosa sto facendo di sbagliato nel mio codice del servizio web. Voglio creare un servizio web asp.net che può essere utilizzato con un JSONP. Sto usando Jquery sul lato client per accedere al sito. Anche dopo aver impostato gli attributi corretti il ??mio servizio web emette ancora xml a causa del quale la chiamata aynch ha esito negativo.
Servizio Web
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {
public WebService () {
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod]
[ScriptMethod(ResponseFormat= ResponseFormat.Json, XmlSerializeString=false, UseHttpGet=true)]
public string HelloWorld(int id, string __callback) {
return __callback + "({message: 'Hello World'})";
}
}
Risposta del servizio Web:
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">test({message: 'Hello World'})</string>
web.config:
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false"
type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false"
type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd"
type="System.Web.Handlers.ScriptResourceHandler,
System.Web.Extensions, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31BF3856AD364E35"
validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule"
type="System.Web.Handlers.ScriptModule, System.Web.Extensions,
Version=3.5.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
JavaScript
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
url: "http://localhost:54404/jsonp/webservice.asmx/HelloWorld?id=2&__callback=?", //?jsonp=MatchSvcCallback
dataType: "jsonp",
data: {},
//jsonp : "MatchSvcCallback",
success: function(msg) {
alert("Inside success callback function"); // not being called
},
error: function(xhr, msg){
var response = JSON.parse(xhr.responseText);
}
});
Il codice js funziona con un gestore, ma non riesce per il servizio web a causa della risposta xml.
Soluzione
Penso che il problema qui sia perché jQuery non imposta l'intestazione Content-Type
nella richiesta HTTP per HTTP GET quando si utilizza $ .ajax ()
. Viene inviato solo se il tipo di richiesta è "POST". Questo sembra essere il caso di entrambi dataType: " jsonp "
e dataType: " json "
.
Ho provato il tuo esempio e ho visto lo scambio di richieste / risposte in Fiddler e abbastanza sicuro che don vedi Content-Type: application / xml; charset = UTF-8
inviato nelle intestazioni per le richieste HTTP GET. L'intestazione viene inviata se si utilizza HTTP POST. Immagino che la presenza di questa intestazione sia un indizio per l'idraulico del servizio Web ASP.NET di decidere se restituire una risposta in formato JSON o XML.
Sembra che tu non sia l'unico con questo problema, vedi il seguente articolo sul sito web di Elegant Code:
Chiamare Web ASP.NET remoto Servizi di JQuery
La soluzione sembra essere una delle seguenti:
-
Usa un
HttpModule
per iniettare ilContent-Type: application / xml; charset = UTF-8
nell'intestazione flusso come descritto nell'articolo precedente. -
Utilizza un
HttpHandler
per l'endpoint come spiegato prima dell'utilizzo di un servizio Web ASP.NET. -
Prova l'approccio basato sulla pagina di Rick Strahl nel seguente articolo (che è in effetti un
HttpHandler
): JSONP per cross -site Callbacks .