wake-up-neo.com

asp.net asmx web service gibt xml statt json zurück

Warum weigert sich dieser einfache Webservice, JSON an den Client zurückzugeben?

Hier ist mein Kundencode:

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

Und der Service:

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

web.config:

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

Und die Antwort:

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

Egal was ich mache, die Antwort kommt immer als XML zurück. Wie kann ich den Webservice dazu bringen, Json zurückzugeben?

EDIT:

Hier ist der Fiddler-HTTP-Trace:

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>

Ich habe die Zählung verloren, wie viele Artikel ich jetzt gelesen habe, als ich versuchte, dies zu korrigieren. Die Anweisungen sind entweder unvollständig oder lösen mein Problem aus irgendeinem Grund nicht .. Einige der relevanteren enthalten (alle ohne Erfolg):

Plus einige andere allgemeine Artikel.

49
njr101

Endlich herausgefunden.

Der App-Code ist wie angegeben eingestellt. Das Problem liegt bei der Konfiguration. Die richtige web.config ist:

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

Laut den Dokumenten sollte die Registrierung des Handlers ab .NET 4 nicht erforderlich sein, da er in die machine.config verschoben wurde. Aus irgendeinem Grund funktioniert das für mich nicht. Durch Hinzufügen der Registrierung zur web.config für meine App wurde das Problem jedoch behoben.

Viele Artikel zu diesem Problem weisen an, den Handler dem Abschnitt <system.web> hinzuzufügen. Dies funktioniert NICHT und verursacht eine ganze Reihe anderer Probleme. Ich habe versucht, den Handler zu beiden Abschnitten hinzuzufügen, und dies generiert eine Reihe anderer Migrationsfehler, die meine Fehlerbehebung völlig fehlgeleitet haben.

Falls es jemandem hilft, wenn ich das gleiche Problem noch einmal hätte, hier die Checkliste, die ich überprüfen würde:

  1. Haben Sie type: "POST" in der Ajax-Anforderung angegeben?
  2. Haben Sie contentType: "application/json; charset=utf-8" in der Ajax-Anforderung angegeben?
  3. Haben Sie dataType: "json" in der Ajax-Anforderung angegeben?
  4. Enthält Ihr .asmx-Webservice das [ScriptService]-Attribut?
  5. Enthält Ihre Webmethode das [ScriptMethod(ResponseFormat = ResponseFormat.Json)] -Attribut? (Mein Code funktioniert auch ohne dieses Attribut, aber viele Artikel sagen, dass es erforderlich ist.)
  6. Haben Sie die ScriptHandlerFactory zur Datei web.config in <system.webServer><handlers> hinzugefügt?
  7. Haben Sie alle Handler aus der Datei web.config in <system.web><httpHandlers> entfernt?

Hoffe, das hilft jedem mit dem gleichen Problem. und danke an poster für Vorschläge.

44
njr101

Kein Erfolg mit der obigen Lösung, wie ich sie gelöst habe.

setzen Sie diese Zeile in Ihren Webservice und geben Sie stattdessen einfach den String in den Antwortkontext ein

this.Context.Response.ContentType = "application/json; charset=utf-8";
this.Context.Response.Write(serial.Serialize(city));
24
Ajay

Wenn Sie bei Framework 3.5 bleiben möchten, müssen Sie den Code wie folgt ändern.

[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);
    }
}
12
Kalpesh Desai

Es ist viel einfacher, einen reinen String vom Webservice zurückzugeben. Ich nenne es die CROW-Funktion (macht es leicht, sich daran zu erinnern). 

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

Wie Sie sehen, ist der Rückgabetyp "void", aber die CROW-Funktion liefert immer noch den gewünschten Wert.

6
GabrielJ

Ich habe einen .asmx-Webdienst (.NET 4.0) mit einer Methode, die eine Zeichenfolge zurückgibt. Die Zeichenfolge ist eine serialisierte Liste, wie Sie in vielen Beispielen sehen. Dies gibt Json zurück, das nicht in XML eingeschlossen ist. Keine Änderungen an web.config oder Notwendigkeit von Drittanbieter-DLLs.

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;

Der Client-Teil, der den Dienst verwendet, sieht folgendermaßen aus:

   $.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
smoore4

Ich hoffe, das hilft, es scheint, dass Sie immer noch ein JSON-Objekt in der Anforderung senden müssen, auch wenn die von Ihnen aufgerufene Methode keine Parameter enthält.

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
Otto

Für mich funktioniert es mit diesem Code, den ich aus diesem Beitrag erhalten habe:

Wie kann ich Json von meinem WCF-Rest-Service (.NET 4) mit Json.Net zurückgeben, ohne dass es sich um einen String handelt, der in Anführungszeichen eingeschlossen ist?

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

Ich weiß, das ist eine wirklich alte Frage, aber ich bin heute zu demselben Problem gekommen und habe überall gesucht, um die Antwort zu finden, aber ohne Ergebnis. Nach langen Nachforschungen habe ich den Weg gefunden, diese Arbeit zu machen. Um JSON vom Dienst zurückzugeben, für den Sie Daten in der richtigen Form angegeben haben, verwenden Sie JSON.stringify(), um die Daten vor der Anfrage zu analysieren, und vergessen Sie nicht contentType: "application/json; charset=utf-8".

0

Ich habe alle oben genannten Schritte ausprobiert (sogar die Antwort), aber ich war nicht erfolgreich. Meine Systemkonfiguration ist Windows Server 2012 R2, IIS.

App-Pool geändert, der die Pipeline verwaltet hat = klassisch.

0
Arindam Nayak