2013-10-24 14 views
13

Mam następujący sposób:Jak uzyskać odpowiedzi JSON od A 3,5 ASMX Web Service

using System.Web.Services; 
using System.Web.Script.Services; 
using System.Web.Script.Serialization; 
using Newtonsoft.Json; 
using System.Collections; 

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
//[System.ComponentModel.ToolboxItem(false)] 
[System.Web.Script.Services.ScriptService] 

// [System.Web.Script.Services.ScriptService] 
public class Tripadvisor : System.Web.Services.WebService { 

    public Tripadvisor() { 

     //Uncomment the following line if using designed components 
     //InitializeComponent(); 
    } 


    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string HotelAvailability(string api) 
    { 
     JavaScriptSerializer js = new JavaScriptSerializer(); 
     string json = js.Serialize(api); 
     //JsonConvert.SerializeObject(api); 
     return json ; 
    } 

Tutaj ustawić atrybut ResponseFormat to jest JSON wciąż są zwracane jako XML.

Chcę format json przy użyciu tej usługi ASMX Wszelkie pomysły?

+0

Możliwy duplikat [Pobierz dane JSON z jQuery z usługi .NET: zdezorientowany z ustawieniem ajaxowego] (http://stackoverflow.com/questions/5690882/get-json-data-with-jquery-from-a- net-service-confused-with-ajax-setup) – GSerg

+0

Możliwy duplikat [usługi sieciowej Asmx, jak zwrócić JSON, a nie XML?] (https://stackoverflow.com/questions/14950578/asmx-web-service-how- to-return-json-and-not-xml) –

Odpowiedz

40

Napotkałem ten sam problem i zawarłem poniższy kod, aby go uruchomić.

[WebMethod] 
[ScriptMethod(UseHttpGet=true ,ResponseFormat = ResponseFormat.Json)] 
public void HelloWorld() 
{ 
    Context.Response.Clear(); 
    Context.Response.ContentType = "application/json"; 
    Context.Response.Write("Hello World"); 
    //return "Hello World"; 
} 

Aktualizacja:

Aby uzyskać czystą formacie JSON, można użyć javascript serializatora jak poniżej.

public class WebService1 : System.Web.Services.WebService 
{ 
    [WebMethod] 
    [ScriptMethod(UseHttpGet=true ,ResponseFormat = ResponseFormat.Json)] 
    public void HelloWorld() 
    { 
     JavaScriptSerializer js = new JavaScriptSerializer(); 
     Context.Response.Clear(); 
     Context.Response.ContentType = "application/json";   
     HelloWorldData data = new HelloWorldData(); 
     data.Message = "HelloWorld"; 
     Context.Response.Write(js.Serialize(data)); 


    } 
} 

public class HelloWorldData 
{ 
    public String Message; 
} 

Działa to jednak w przypadku typów złożonych, ale ciąg nie wykazuje żadnej różnicy.

+0

thansk do odtworzenia drogi, ale nie działa w moim kodzie ... – MansinhDodiya

+0

czy próbowałeś usunąć return i użyć response.write() zamiast? – Saranya

+0

Okey teraz da mi json ale nie czysto na przykład przekazuję parametr taki jak ABC i zwraca "ABC" ale czysty json jest jak {"ABC"} – MansinhDodiya

1

Tylko wątpliwość. Kiedy nie otrzymujesz odpowiedzi JSON? Ponieważ po wywołaniu usługi internetowej od klienta (zakładam, że jest to przeglądarka internetowa, tj. Xhr), należy określić nagłówek typu zawartości w żądaniu jako "application/json; charset = yourcharset".

Wierzę, że powyższe rozwiązanie zawsze zwraca json, bez względu na rodzaj treści określony przez klienta. Platforma ASMx w systemie dotnet umożliwia to za pomocą metody nagłówkowej typu treści, więc powyższe może zostać sklasyfikowane jako włamanie, gdy dostępne jest schludne rozwiązanie.

Podobne pytanie na Return Json Data from ASMX web service

To może pomóc także ->http://forums.asp.net/p/1054378/2338982.aspx#2338982

PS: Jestem zakładając używasz wersji dotnet 4.

0

Drodzy przyszłych czytelników: Aktualnie nie jest akceptowane odpowiedź właściwą drogę. To wiąże cię z używaniem JavaScriptSerializer i tracisz możliwość żądania xml (lub jakiegokolwiek formatu serializacji, który może pojawić się w przyszłości). "Właściwa droga" obejmuje również mniej kodu!

Jeśli ozdobić swoją klasę usług z atrybutem [ScriptService] - co trzeba - wtedy ASP.NET 3.5+ powinien automatycznie serialise odpowiedzi na JSON warunkiem swoich żądań Ajax połączeń JSON. Sugestie serializowania do JSON ręcznie są po prostu błędne, chyba że chcesz użyć innego serializera, takiego jak Newtonsoft.

że jesteś widząc XML sugeruje jedną z następujących czynności:

  • Nie żądają JSON w wywołaniu Ajax - proszę zobaczyć pracę przykładowy kod poniżej
  • ewentualnie niektóre wpisy web.config brakuje, zgodnie na odpowiedź: here (wyłączenie odpowiedzialności: większość z nich nie jest dostępna w sieci internetowej o nazwie .config; tylko zacząć grać z nimi, jeżeli nic innego nie działa)

Oto prosty przykład pracy z JSON włączona ASMX serwis internetowy:

<%@ WebService Language="C#" Class="WebService" %> 
using System; 
using System.Collections.Generic; 
using System.Web.Services; 

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.Web.Script.Services.ScriptService] 
public class WebService : System.Web.Services.WebService { 
    [WebMethod] 
    public MyClass Example() 
    { 
     return new MyClass(); 
    } 

    public class MyClass 
    { 
     public string Message { get { return "Hi"; } } 
     public int Number { get { return 123; } } 
     public List<string> List { get { return new List<string> { "Item1", "Item2", "Item3" }; } } 
    } 
} 

JavaScript, żeby poprosić go i przetwarza odpowiedź (my po prostu pop-up alert JS z komunikatem z MyClass.Message): Prośba

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Test</title> 
    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.4.js" type="text/javascript"></script> 
</head> 
<body> 
    <script type="text/javascript"> 
     $.ajax({ 
      type: "POST", 
      url: "WebService.asmx/Example", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      data: "{ }", 
      error: function (XMLHttpRequest, textStatus, errorThrown) { alert(langError + " " + textStatus); }, 
      success: function (msg) { 
       alert(msg.d.Message); 
      } 
     }); 
    </script> 
</body> 
</html> 

http:

POST http://HOST.com/WebService.asmx/Example HTTP/1.1 
Accept: application/json, text/javascript, */*; q=0.01 
Content-Type: application/json; charset=utf-8 
X-Requested-With: XMLHttpRequest 
Referer: http://HOST.com/Test.aspx 
Accept-Language: en-GB,en;q=0.5 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0) 
Connection: Keep-Alive 
Content-Length: 3 
Host: HOST.com 

{ } 
Odpowiedź

HTTP:

HTTP/1.1 200 OK 
Cache-Control: private, max-age=0 
Content-Type: application/json; charset=utf-8 
Server: Microsoft-IIS/8.0 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Tue, 20 Feb 2018 08:36:12 GMT 
Content-Length: 98 

{"d":{"__type":"WebService+MyClass","Message":"Hi","Number":123,"List":["Item1","Item2","Item3"]}} 

Wynik:

wyświetlany jest komunikat "Hi" w okienko JS.

Powiązane problemy