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.

È stato utile?

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 il Content-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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top