Jak pozwolić plik ASMX wyjście JSON

Utworzyłem plik ASMX z kodem za plikiem. Działa dobrze, ale wyprowadza XML.

Jednak potrzebuję go do wyjścia JSON. Konfiguracja ResponseFormat nie działa. Mój kod-za to:

[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" };
    }
}
 60
Author: doekman, 2008-10-17

6 answers

From WebService zwraca XML nawet gdy ResponseFormat ustawiony na JSON :

Upewnij się, że żądanie jest żądaniem POST, a nie GET. Scott Guthrie ma post wyjaśniający dlaczego.

Chociaż jest napisany specjalnie dla jQuery, może to być również przydatne dla Ciebie:
używanie jQuery do konsumpcji ASP.NET JSON Web Services

 39
Author: Pavel Chuchuva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-10 05:40:55

Aby otrzymać czysty łańcuch JSON, bez zawijania go w XML, musisz napisać łańcuch JSON bezpośrednio do HttpResponse I zmienić typ powrotu WebMethod na void.

    [System.Web.Script.Services.ScriptService]
    public class WebServiceClass : System.Web.Services.WebService {
        [WebMethod]
        public void WebMethodName()
        {
            HttpContext.Current.Response.Write("{property: value}");
        }
    }
 51
Author: iCorrect,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-22 11:55:51

To już chyba stara wiadomość, ale magia wydaje się być:

  • [ScriptService] atrybut na web service class
  • [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] on method
  • Content-type: application / json in request

Z tymi elementami na miejscu, żądanie GET jest pomyślne.

Do postu HTTP

  • [ScriptMethod (UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] on method

Oraz po stronie klienta (zakładając, że Twój webmethod nazywa się MethodName i przyjmuje jeden parametr o nazwie 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);
            }
        });
 14
Author: marc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-25 08:05:49

A quick gotcha that I learned the hard way (zasadniczo spędzając 4 godziny w Google), można użyć PageMethods w pliku ASPX, aby zwrócić JSON (z [ScriptMethod()] marker) dla statycznej metody, jednak jeśli zdecydujesz się przenieść swoje statyczne metody do pliku asmx, to nie może być statyczna metoda.

Ponadto, musisz poinformować serwis internetowy Content-Type: application / json, aby uzyskać JSON z powrotem z połączenia (używam jQuery i 3 błędy, aby uniknąć podczas korzystania z jQuery artykuł był bardzo pouczający - pochodzi z tej samej strony, o której mowa w innej odpowiedzi tutaj).

 9
Author: Bryan Rehbein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 21:19:34

Czy wywołujesz serwis WWW ze skryptu klienta czy po stronie serwera?

Może się okazać, że wysłanie nagłówka content type na serwer pomoże, np.

'application / json; charset=utf-8'

Po stronie klienta, używam biblioteki po stronie klienta prototype i jest parametr contentType podczas wykonywania wywołania Ajax, gdzie można to określić. Myślę, że jQuery ma metodę getJSON.

 4
Author: bitsprint,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-17 10:38:54

Alternatywa: użyj ogólnej obsługi HTTP (.ashx) i użyj ulubionej biblioteki json, aby ręcznie serializować i deserializować swój JSON.

Odkryłem, że pełna kontrola nad obsługą żądania i generowaniem odpowiedzi bije wszystko inne. NET oferuje proste, pełne usługi internetowe.

 3
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 20:47:07