2010-04-26 12 views
5

Próbuję wywołać funkcję usługi sieci Web za pomocą metody GET za pomocą jQuery, ale mający problem. Jest to kod serwis internetowy:Wywołanie funkcji usługi sieci web ASP.NET za pomocą metody GET z jQuery

[WebService(Namespace = "http://something.com/samples")] 
[ScriptService] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class TestWebService : System.Web.Services.WebService { 
    [WebMethod] 
    public string Test2() 
    { 
     string result = null; 

    try 
     { 
      result = "{'result':'success', 'datetime':'" + DateTime.Now.ToString() + "'"; 
     } 
     catch (Exception ex) 
     { 
      result = "Something wrong happened"; 
     } 

     return result; 
    } 

} 

To tak, jak wywołać funkcję:

$.ajax({ type: "GET", 
     url: "http://localhost/testwebsite/TestWebService.asmx/Test2", 
     data: "{}", 
     contentType: "application/json", 
     dataType: "json", 
     error: function (xhr, status, error) { 
      alert(xhr.responseText); 
     }, 
     success: function (msg) { 
      alert('Call was successful!'); 
     } 
    }); 

Metoda nazywa się pomyślnie, ale wynik ciąg zostaje objęty znacznikami XML, takich jak to:

<string> 
{'result':'success', 'datetime':'4/26/2010 12:11:18 PM' 
</string> 

I otrzymuję błąd z tego powodu (procedura obsługi błędu jest wywoływana). Czy ktoś wie, co można z tym zrobić?

+0

Gdzie jest twój "}" na końcu zwróconego ciągu JSON? –

+0

Masz na myśli ciąg jsonów zakodowanych znacznikami XML? Myślę, że zrobiłem coś nie tak, kiedy skopiowałem go z okna przeglądarki, oczywiście powinno tam być. –

+0

Być może, ale nie widzę tego również w kodzie usługi sieciowej. –

Odpowiedz

0
  1. Reguła dla json: Można tylko dostęp do danych z samej domenie!

  2. Jedynym wyjątkiem jest, gdy za pomocą jsonp (co jest dość skomplikowana do wdrożenia, ponieważ nie ma serializer jsonp w ramach .NET).
    Jeśli urządzenie korzysta z standardową usługę internetową (i nie WCF) można znaleźć wskazówki howto wdrożenia tego here.

+0

Na razie powinno mi wystarczyć uzyskanie dostępu do danych w tej samej domenie. Ale nawet jeśli otworzę adres URL taki jak ten http: //localhost/testwebsite/TestWebService.asmx/Test2 w przeglądarce na moim komputerze lokalnym, widzę XML wyrenderowany. Jedyne, czego teraz potrzebuję, to pozbyć się XML –

0

Upewnij się, aby dodać do swoich ajax opcji:

contentType: "application/json; charset=utf-8" 

Twój ogólny wniosek powinien wyglądać tak, aby uzyskać json powrotem zamiast XML:

$.ajax({ type: "GET", 
    url: "http://localhost/testwebsite/TestWebService.asmx/Test2", 
    data: "{}", 
    contentType: "application/json", 
    dataType: "json", 
    contentType: "application/json; charset=utf-8". 
    error: function (xhr, status, error) { 
     alert(xhr.responseText); 
    }, 
    success: function (msg) { 
     alert('Call was successful!'); 
    } 
}); 

ScottGu has a full breakdown on what's required here, ale wygląda na brakujący contentType w twoim przypadku (który też mnie zawiózł na chwilę).

+0

Zmiana contentType nie przyniosła żadnego efektu –

+0

@the_V - Jakiego błędu ostrzega? również po prostu dla kopnięć, masz takie samo zachowanie w POST? –

+0

POST działa dobrze, ale chcę, aby działał z GET. O błędzie: xhr.responseTekst jest następujący: {'result': 'success', 'datetime': '27.04.2010 0:57:30'

0

Możesz spróbować ustawić ResponseFormat na swoich metodach. Zobacz http://williamsportwebdeveloper.com/cgi/wp/?p=494, aby zobaczyć, jak to zrobili dla JSON. Prawdopodobnie domyślnie jest to XML.

+0

Próbowałem dodać następujący atrybut do definicji metoda: [ScriptMethod (ResponseFormat = ResponseFormat.Json, UseHttpGet = true, XmlSerializeString = false)] ale nie zrobił 't work –

0

trzeba ozdobić metodę z ScriptMethodAttribute:

[WebService(Namespace = "http://something.com/samples")] 
[ScriptService] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class TestWebService : System.Web.Services.WebService { 

    [WebMethod] 
    [ScriptMethod] 
    public string Test2() 
    { 
    [...] 
    } 
} 

To zapewni, że metoda zwraca JSON domyślnie (domyślna wartość ResponseFormat jest Json).

+0

Atrybut [ScriptMethod] nie przynosi żadnego efektu –

0

Próbowałeś WebInvokeAttribute, posiada elementy, które definiują Zapytanie & formatów Response którym można ustawić do WebMessageFormat.Json.
Coś jak:
[WebInvoke(UriTemplate = "ServiceName", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, Method = "POST")]

0
  1. Można użyć obsługi HTTP zamiast usługi internetowej.
  2. Możesz analizować odpowiedź xml za pomocą javascript na kliencie.
Powiązane problemy