asp.net asmx servizio web xml di ritorno invece di json

Perché questo semplice servizio web si rifiutano di restituire JSON per il cliente?

Ecco il mio codice cliente:

        var params = { };
        $.ajax({
            url: "/Services/SessionServices.asmx/HelloWorld",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            timeout: 10000,
            data: JSON.stringify(params),
            success: function (response) {
                console.log(response);
            }
        });

E il servizio:

namespace myproject.frontend.Services
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [ScriptService]
    public class SessionServices : System.Web.Services.WebService
    {
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

web.config:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
</configuration>

E la risposta:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">Hello World</string>

Non importa quello che faccio, la risposta è sempre la schiena come XML. Come posso ottenere il servizio web, per restituire Json?

EDIT:

Qui è il Violinista HTTP traccia:

REQUEST
-------
POST http://myproject.local/Services/SessionServices.asmx/HelloWorld HTTP/1.1
Host: myproject.local
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json; charset=utf-8
X-Requested-With: XMLHttpRequest
Referer: http://myproject.local/Pages/Test.aspx
Content-Length: 2
Cookie: ASP.NET_SessionId=5tvpx1ph1uiie2o1c5wzx0bz
Pragma: no-cache
Cache-Control: no-cache

{}

RESPONSE
-------
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 19 Jun 2012 16:33:40 GMT
Content-Length: 96

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">Hello World</string>

Ho perso il conto di quanti articoli ho letto ora cercando di risolvere questo problema. Le istruzioni sono incompleti o non risolvere il mio problema per qualche motivo.
Alcuni di quelli più importanti sono (tutte senza successo):

Oltre a molti altri articoli.

  • Vedo il framework di destinazione tag set di 4.0, quale versione del framework è la tua app in realtà costruito nel?
  • Sotto la Proprietà del Progetto nella scheda, il Framework di Destinazione è “.Net Framework 4”. È sufficiente o devo impostare qualche altra parte? Mi dispiace, io sono relativamente nuovo del VS (più js esperienza)
  • Il codice sembra corretto. Vi preghiamo di registrare la tua richiesta AJAX e la risposta del server utilizzando WireShark? Sarebbe utile vedere questi pacchetti HTTP per capire cosa succede.
  • Grazie per aver trovato il tempo di guardare a questo. Ho postato HTTP traccia, come richiesto. Forse si può vedere qualcosa che mi manca.
  • Possibile duplicare: stackoverflow.com/questions/9914782/…
InformationsquelleAutor njr101 | 2012-06-18



10 Replies
  1. 44

    Finalmente capito.

    L’applicazione del codice è corretto, in quanto inviato. Il problema è che con la configurazione. Web corretto.config è:

    <configuration>
        <system.web>
            <compilation debug="true" targetFramework="4.0" />
        </system.web>
        <system.webServer>
            <handlers>
                <add name="ScriptHandlerFactory"
                     verb="*" path="*.asmx"
                     type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                     resourceType="Unspecified" />
            </handlers>
        </system.webServer>
    </configuration>

    Secondo la documentazione, la registrazione, il conduttore dovrebbe essere inutile .Rete 4 verso l’alto come è stata spostata la macchina.config. Per qualsiasi motivo, questo non funziona per me. Ma aggiungendo la registrazione per il web.config per la mia app ha risolto il problema.

    Un sacco di articoli su questo problema, con istruzioni di aggiungere il gestore per la <system.web> sezione. Questo NON funziona e provoca un sacco di altri problemi. Ho provato ad aggiungere il gestore di entrambe le sezioni e questo genera una serie di altri errori di migrazione che in tutto il mio mal di risoluzione dei problemi.

    Nel caso In cui aiuta chiunque altro, se avessi ther stesso problema, ecco la lista di controllo avrei recensione:

    1. Hai specificare type: "POST" nella richiesta ajax?
    2. Hai specificare contentType: "application/json; charset=utf-8" nella richiesta ajax?
    3. Hai specificare dataType: "json"nella richiesta ajax?
    4. Non la tua .web asmx servizio di [ScriptService] attributo?
    5. Il vostro web metodo sono il [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
      attributo? (Il mio codice funziona anche senza questo attributo, ma un sacco di articoli di dire che è necessario)
    6. Hanno aggiunto il ScriptHandlerFactory per il web.file di configurazione in <system.webServer><handlers>?
    7. Hai rimosso tutti i gestori dal web.file di configurazione in <system.web><httpHandlers>?

    Spero che questo aiuta qualcuno con lo stesso problema. e grazie per i manifesti e per i suggerimenti.

    • Sono stato a battere la testa contro il muro per poche ore su questo e il tuo post è stato molto utile. Ho eseguito attraverso tutti i sette passi e il mio servizio è ancora il ritorno xml nella risposta. Sto usando ASP.NET 3.5 – eventuali altri pensieri? Sto anche utilizzando jQuery plug-in forma (non è necessario indicare esplicitamente POST, json, etc.)
    • Se si apre una nuova domanda ed aggiungere un commento qui il collegamento, posso dare un’occhiata. Si prega di includere un violinista traccia della richiesta e la risposta. Includere il tuo sito web completo.config. E comprendono anche il asp.net codice particolare, tra gli attributi. Vi suggerisco di testare l’utilizzo di un simile “Ciao Mondo” di servizio come per il mio esempio.
    • Questa risposta mi ha aiutato molto, soprattutto i sette punti che ha citato.
    • sto usando questo stesso nella mia domanda, ma io sono sempre un errore, per favore mi suggeriscono quello che mi manca qui. XMLHttpRequest impossibile caricare 192.168.200.56/ChatApp.asmx/HelloWorld. Non valido codice di stato HTTP 500
    • Aggiungere alcuni più magic #2, la modifica contentType solo “application/json” risolto il mio problema.
  2. 27

    Senza successo con la soluzione di cui sopra, ecco come ho risolto.

    mettere questa riga nel tuo webservice e piuttosto tipo di ritorno basta scrivere la stringa in contesto di risposta

    this.Context.Response.ContentType = "application/json; charset=utf-8";
    this.Context.Response.Write(serial.Serialize(city));
    • Avete fatto! Questa è la risposta migliore. Ho fatto la mia funzione di un “vuoto” di ritorno-tipo e usato il tuo codice, e JQuery UI autocomplete inizia a lavorare finalmente.
    • Ti ringrazio molto .. ha funzionato per me!
    • Che grezzo e preoccupante, ma brutalmente efficace quando più complicato muck circa non sembra risolvere il mio problema. Questo funziona.
    • Happy bunny! 😀
    • Amico, il mio migliore salvatore di sempre! Sto battendo la testa contro il muro per molte ore fino a quando ho visto la tua risposta, nient’altro mi ha aiutato. Semplicemente mi piace tanto 🙂
  3. 12

    Se si vuole rimanere rimanere con Framework 3.5, è necessario fare cambiamenti nel codice come segue.

    [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. 
    [ScriptService]
    public class WebService : System.Web.Services.WebService
    {
        public WebService()
        {
        }
    
        [WebMethod]
        public void HelloWorld() //It's IMP to keep return type void.
        {
            string strResult = "Hello World";
            object objResultD = new { d = strResult }; //To make result similarly like ASP.Net Web Service in JSON form. You can skip if it's not needed in this form.
    
            System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
            string strResponse = ser.Serialize(objResultD);
    
            string strCallback = Context.Request.QueryString["callback"]; //Get callback method name. e.g. jQuery17019982320107502116_1378635607531
            strResponse = strCallback + "(" + strResponse + ")"; //e.g. jQuery17019982320107502116_1378635607531(....)
    
            Context.Response.Clear();
            Context.Response.ContentType = "application/json";
            Context.Response.AddHeader("content-length", strResponse.Length.ToString());
            Context.Response.Flush();
    
            Context.Response.Write(strResponse);
        }
    }
    • Sarebbe utile se è stato aggiunto alla tua risposta, che cosa hai usato e possibilmente link per la documentazione. In questo modo è molto più facile per qualcun altro per capire come questo funziona esattamente e come si può usare in un’altra situazione.
    • Questa risposta funziona bene per ASMX + jQuery in Sharepoint 2010 .NET Framework 3.5. Ho deciso di utilizzare standard JavaScriptSerializer invece di riferimento per NewtonJson assemblea. Grazie!
  4. 6

    C’è un modo molto più semplice per restituire una stringa puro dal servizio web. Io la chiamo CORVO funzione (la rende facile da ricordare).

      [WebMethod]
      public void Test()
        {
            Context.Response.Output.Write("and that's how it's done");    
        }

    Come si può vedere, il tipo di ritorno è “vuoto”, ma CROW funzione verrà restituito il valore che si desidera.

    • Questo ha funzionato perfettamente per me. Ho cambiato la stringa di ritorno a vuoto e utilizzato il contesto.risposta.uscita.scrivi a sputare fuori il JSON che è stato serializzato!
  5. 1

    Ho una .asmx web service.NET 4.0) con un metodo che restituisce una stringa. La stringa serializzata Elenco, come si vede in molti degli esempi. Questo restituirà json che non è avvolto in XML. Modifiche al web.config o bisogno per il 3 ° partito Dll.

    var tmsd = new List<TmsData>();
    foreach (DataRow dr in dt.Rows)
    {
    
    m_firstname = dr["FirstName"].ToString();
    m_lastname = dr["LastName"].ToString();
    
    tmsd.Add(new TmsData() { FirstName = m_firstname, LastName = m_lastname} );
    
    }
    
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    string m_json = serializer.Serialize(tmsd);
    
    return m_json;

    La parte client che utilizza il servizio di simile a questo:

       $.ajax({
           type: 'POST',
           contentType: "application/json; charset=utf-8",
           dataType: 'json',
           url: 'http://localhost:54253/TmsWebService.asmx/GetTombstoneDataJson',
           data: "{'ObjectNumber':'105.1996'}",
           success: function (data) {
               alert(data.d);
           },
           error: function (a) {
               alert(a.responseText);
           }
       });
  6. 0

    Per me funziona, con questo codice che ho avuto da questo post:

    Come posso tornare json dal mio WCF rest service (.Rete 4), utilizzando Json.Net senza essere una stringa racchiusa tra virgolette?

    [WebInvoke(UriTemplate = "HelloWorld", Method = "GET"), OperationContract]
    public Message HelloWorld()
    {
        string jsonResponse = //Get JSON string here
        return WebOperationContext.Current.CreateTextResponse(jsonResponse, "application/json; charset=utf-8", Encoding.UTF8);
    }
    • Il ScriptService attributo dovrebbe prendere cura di questo automaticamente. Io davvero non voglio gestire tutte le serializzazione roba me. Ho altri progetti in cui questo codice funziona bene. Ma sono su altri server, il che mi fa pensare che ci sia un qualche tipo di problema di configurazione.
  7. 0

    Ho provato tutti i passaggi precedenti ( anche la risposta), ma non mi è successo, la mia configurazione di sistema di Windows Server 2012 R2, IIS 8. Il passo successivo risolto il mio problema.

    Cambiato l’app piscina, che è riuscito pipeline = classico.

  8. 0

    So che è davvero vecchia questione, ma mi è venuto un stesso problema oggi e ho cercato ovunque per trovare la risposta, ma con nessun risultato. Dopo lunghe ricerche ho trovato il modo per fare questo lavoro. Per tornare JSON dal servizio, è necessario fornire i dati della richiesta in formato corretto, utilizzare JSON.stringify() analizzare i dati prima richiesta e non dimenticare di contentType: "application/json; charset=utf-8", utilizzando questo dovrebbe fornire un risultato atteso.

  9. 0

    Spero che questo aiuta, sembra che devi ancora mandare qualche oggetto JSON nella richiesta, anche se il Metodo che si sta chiamando non ha parametri.

    var params = {};
    return $http({
            method: 'POST',
            async: false,
            url: 'service.asmx/ParameterlessMethod',
            data: JSON.stringify(params),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
    
        }).then(function (response) {
            var robj = JSON.parse(response.data.d);
            return robj;
        });
  10. -1
    response = await client.GetAsync(RequestUrl, HttpCompletionOption.ResponseContentRead);
    if (response.IsSuccessStatusCode)
    {
        _data = await response.Content.ReadAsStringAsync();
        try
        {
            XmlDocument _doc = new XmlDocument();
            _doc.LoadXml(_data);
            return Request.CreateResponse(HttpStatusCode.OK, JObject.Parse(_doc.InnerText));
        }
        catch (Exception jex)
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest, jex.Message);
        }
    }
    else
        return Task.FromResult<HttpResponseMessage>(Request.CreateResponse(HttpStatusCode.NotFound)).Result;

Lascia un commento