asp.net asmx web service zwracający xml zamiast json

Dlaczego ta prosta usługa internetowa odmawia zwrotu JSON klientowi?

Oto Mój kod klienta:

        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);
            }
        });

I serwis:

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";
        }
    }
}

Www.config:

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

I ODPOWIEDŹ:

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

Bez względu na to, co robię, odpowiedź zawsze wraca jako XML. Jak sprawić, by serwis internetowy zwrócił Json?

EDIT:

Oto ślad HTTP Fiddlera:

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>

Straciłem rachubę ile artykułów przeczytałem teraz próbując naprawić to. Instrukcje są albo niekompletne, albo nie rozwiązują mojego problemu z jakiegoś powodu. Do bardziej istotnych należą (wszystkie bez powodzenia):

Oraz kilka innych artykułów ogólnych.

Author: Community, 2012-06-18

10 answers

W końcu to rozgryzłem.

Kod aplikacji jest poprawny, jak napisano. Problem jest z konfiguracją. Prawidłowa sieć.config to:

<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>

Zgodnie z dokumentami, Rejestracja obsługi powinna być niepotrzebna od. NET 4 w górę, ponieważ została przeniesiona do maszyny.config. Z jakiegoś powodu, to nie działa na mnie. Ale dodanie rejestracji do sieci.konfiguracja mojej aplikacji rozwiązała problem.

Wiele artykułów na ten temat nakazuje dodać handler do sekcji <system.web>. To nie działa i powoduje cały ładunek innych problemów. Próbowałem dodać obsługę do obu sekcji, a to generuje zestaw innych błędów migracji, które całkowicie błędnie skierowały moje rozwiązywanie problemów.

W przypadku, gdyby to pomogło komukolwiek innemu, gdybym miał ten sam problem ponownie, oto lista kontrolna, którą bym przejrzał:

  1. czy określiłeś type: "POST" w żądaniu ajax?
  2. czy określiłeś contentType: "application/json; charset=utf-8" w żądaniu ajax?
  3. czy określiłeś dataType: "json" w żądaniu ajax?
  4. Czy twój .asmx web service zawiera atrybut [ScriptService]?
  5. czy Twoja metoda internetowa zawiera atrybut [ScriptMethod(ResponseFormat = ResponseFormat.Json)] ? (Mój kod działa nawet bez tego atrybutu, ale wiele artykułów mówi, że jest on wymagany) {]}
  6. dodałeś ScriptHandlerFactory do sieci.plik konfiguracyjny w <system.webServer><handlers>?
  7. usunąłeś wszystkie programy obsługi z sieci.plik konfiguracyjny w <system.web><httpHandlers>?
Mam nadzieję, że to pomoże każdemu z tym samym problemem. i dzięki plakatom dla sugestie.
 42
Author: njr101,
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-03-29 22:10:04

Brak sukcesu z powyższym rozwiązaniem, tutaj jak go rozwiązać.

Umieść tę linię w swoim webservice i raczej return type po prostu napisz łańcuch w kontekście odpowiedzi

this.Context.Response.ContentType = "application/json; charset=utf-8";
this.Context.Response.Write(serial.Serialize(city));
 21
Author: Ajay,
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-03 17:41:18

Jeśli chcesz pozostać przy frameworku 3.5, musisz wprowadzić zmiany w kodzie w następujący sposób.

[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);
    }
}
 11
Author: Kalpesh Desai,
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
2013-09-08 13:51:13

Istnieje o wiele łatwiejszy sposób na zwrócenie czystego ciągu z usługi internetowej. Nazywam to funkcją kruka (ułatwia zapamiętanie).

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

Jak widzisz, zwracanym typem jest "void", ale funkcja CROW nadal zwróci żądaną wartość.

 6
Author: GabrielJ,
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
2015-04-24 12:06:26

Mam .asmx web service (. NET 4.0) z metodą, która zwraca łańcuch znaków. Ciąg jest serializowaną listą, jak widać w wielu przykładach. Zwróci json, który nie jest zawinięty w XML. Brak zmian w sieci.config lub potrzeba bibliotek DLL innych firm.

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;

Część kliencka, która korzysta z usługi wygląda następująco:

   $.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);
       }
   });
 1
Author: smoore4,
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
2013-05-08 10:12:09

Dla mnie działa z tym kodem, który dostałem z tego posta:

Jak mogę zwrócić json z mojej usługi WCF rest (. NET 4), używając Json.Net, bez sznurka, zapakowanego w Cytaty?

[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);
}
 0
Author: j0aqu1n,
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-05-23 11:54:56

Próbowałem wszystkich powyższych kroków (nawet odpowiedź), ale nie powiodło mi się, moja konfiguracja systemu to Windows Server 2012 R2, IIS 8. Poniższy krok rozwiązał mój problem.

Zmieniono pulę aplikacji, która zarządzała tagiem pipeline = classic.

 0
Author: Arindam Nayak,
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
2014-04-09 14:39:11

Wiem, że to naprawdę stare pytanie, ale doszedłem do tego samego problemu dzisiaj i szukałem wszędzie, aby znaleźć odpowiedź, ale bez rezultatu. Po długich badaniach znalazłem sposób, aby to zadziałało. Aby zwrócić JSON z usługi, podałeś dane w żądaniu w odpowiednim formacie, użyj JSON.stringify(), aby przeanalizować dane przed żądaniem i nie zapomnij o contentType: "application/json; charset=utf-8", używając tego powinno dostarczyć oczekiwany wynik.

 0
Author: Sebastian Siewień,
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-03-23 10:47:31

Mam nadzieję, że to pomoże, wydaje się, że nadal musisz wysłać jakiś obiekt JSON w żądaniu, nawet jeśli wywołana metoda nie ma parametrów.

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;
    });
 0
Author: Otto,
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-09-29 09:52:34
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;
 -1
Author: Mohamed.Abdo,
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
2015-12-08 09:26:22