Domanda

Ho creato un file ASMX con un codice dietro il file. Funziona bene, ma sta producendo XML.

Tuttavia, ne ho bisogno per l'output di JSON. La configurazione di ResponseFormat non sembra funzionare. Il mio code-behind è:

[System.Web.Script.Services.ScriptService]
public class _default : System.Web.Services.WebService {
    [WebMethod]
    [ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
    public string[] UserDetails()
    {
        return new string[] { "abc", "def" };
    }
}
È stato utile?

Soluzione

Da WebService restituisce XML anche quando ResponseFormat è impostato su JSON :

  

Assicurati che la richiesta sia una richiesta POST, non un GET. Scott Guthrie ha un post che spiega perché .

     

Anche se è stato scritto appositamente per jQuery, può anche esserti utile:
   Utilizzo di jQuery per utilizzare i servizi Web JSON ASP.NET

Altri suggerimenti

Per ricevere una stringa JSON pura, senza che venga inserita in un XML, è necessario scrivere la stringa JSON direttamente nel HttpResponse e modificare il tipo restituito WebMethod in vuoto .

    [System.Web.Script.Services.ScriptService]
    public class WebServiceClass : System.Web.Services.WebService {
        [WebMethod]
        public void WebMethodName()
        {
            HttpContext.Current.Response.Write("{property: value}");
        }
    }

Questa è probabilmente una vecchia notizia ormai, ma la magia sembra essere:

  • Attributo [ScriptService] sulla classe del servizio Web
  • [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] sul metodo
  • Tipo di contenuto: application / json su richiesta

Con questi pezzi in atto, una richiesta GET ha esito positivo.

Per un POST HTTP

  • [ScriptMethod (UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] sul metodo

e sul lato client (supponendo che il tuo metodo web sia chiamato MethodName e richieda un singolo parametro chiamato searchString):

        $.ajax({
            url: "MyWebService.asmx/MethodName",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify({ searchString: q }),
            success: function (response) {                  
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(textStatus + ": " + jqXHR.responseText);
            }
        });

Un veloce esempio che ho imparato a mie spese (sostanzialmente trascorrendo 4 ore su Google), puoi usare PageMethods nel tuo file ASPX per restituire JSON (con il marcatore [ScriptMethod ()]) per un metodo statico, tuttavia se tu decidere di spostare i metodi statici in un file asmx, non può essere un metodo statico.

Inoltre, è necessario informare il servizio Web Tipo di contenuto: application / json per recuperare JSON dalla chiamata (sto usando jQuery e 3 errori da evitare quando si usa jQuery l'articolo è stato molto illuminante - è tratto da lo stesso sito web menzionato in un'altra risposta qui).

Stai chiamando il servizio web dallo script client o sul lato server?

Potresti trovare utile inviare un'intestazione del tipo di contenuto al server, ad es.

'application / json; charset = utf-8'

Sul lato client, utilizzo la libreria lato client prototipo e c'è un parametro contentType quando si effettua una chiamata Ajax in cui è possibile specificare questo. Penso che jQuery abbia un metodo getJSON.

Alternativa: usa un gestore HTTP generico (.ashx) e usa la tua libreria json preferita per serializzare e deserializzare manualmente il tuo JSON.

Ho scoperto che il controllo completo sulla gestione di una richiesta e la generazione di una risposta batte qualsiasi altra cosa .NET offre per servizi Web semplici e RESTful.

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