web-dev-qa-db-ger.com

So erhalten Sie eine JSON-Antwort von einem 3.5-asmx-Webdienst

Ich habe folgende Methode:

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

Hier habe ich das ResponseFormat-Attribut gesetzt, da Json immer noch als XML zurückgegeben wird.

Ich möchte mit diesem asmx-Dienst json formatieren Ideen?

13
Mansinh

Ich hatte das gleiche Problem und fügte den folgenden Code hinzu, damit es funktioniert.

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

Aktualisieren:

Um ein reines Json-Format zu erhalten, können Sie den JavaScript-Serializer wie unten beschrieben verwenden. 

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

Dies funktioniert jedoch für komplexe Typen, aber die Zeichenfolge zeigt keinen Unterschied.

44
Saranya

Nur ein Zweifel. Wann erhalten Sie keine JSON-Antwort? Wenn Sie den Webdienst vom Client aus aufrufen (ich nehme einen Webbrowser an, d. H. Xhr), sollten Sie den Inhaltstypheader der Anforderung als "application/json; charset = yourcharset" angeben.

Ich glaube, dass die obige Lösung immer json zurückgibt, unabhängig davon, welcher Inhaltstyp vom Client angegeben wird. Das Dotnet-asmx-Framework ermöglicht dies mit der Content-Type-Header-Methode. Daher könnte das Obige als Hack klassifiziert werden, wenn eine saubere Lösung verfügbar ist.

Ähnliche Frage an Json Data vom ASMX-Webservice zurückgeben

Das könnte auch helfen -> http://forums.asp.net/p/1054378/2338982.aspx#2338982

P.S: Ich gehe davon aus, dass Sie Dotnet Version 4 verwenden.

1
aravind

Liebe zukünftige Leser: Die derzeit akzeptierte Antwort ist nicht der richtige Weg. Es bindet Sie an die Verwendung von JavaScriptSerializer und Sie verlieren die Fähigkeit, XML anzufordern (oder in der Tat jedes Serialisierungsformat, das in der Zukunft erscheinen könnte). Der "richtige Weg" beinhaltet auch weniger Code !

Wenn Sie Ihre Serviceklasse mit dem [ScriptService] Attribut - welches Sie haben - dann sollte ASP.NET 3.5+ die Antwort auf JSON automatisch serialisieren vorausgesetzt Ihr Ajax-Aufruf fordert JSON an . Die Vorschläge zur manuellen Serialisierung auf JSON sind einfach falsch, es sei denn, Sie möchten einen anderen Serialisierer wie Newtonsoft verwenden.

Dass Sie XML gesehen haben, deutet auf Folgendes hin:

  • Sie fordern in Ihrem Ajax-Aufruf kein JSON an
  • Möglicherweise fehlen laut einer Antwort einige web.config-Einträge hier (Haftungsausschluss: Ich habe die meisten davon nicht in einer produktiven web.config; spiele nur damit, wenn nichts anderes funktioniert)

Hier ist ein einfaches Arbeitsbeispiel für einen JSON-fähigen ASMX-Webdienst:

<%@ 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, um es anzufordern und die Antwort zu verarbeiten (wir rufen einfach eine JS-Warnung mit der Nachricht von MyClass.Message auf):

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

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

{ }

HTTP-Antwort:

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

Ergebnis:

"Hi" wird in einem JS-Popup angezeigt.

1
Stephen Kennedy