50 votes

service web asp.net asmx renvoyant xml au lieu de json

Pourquoi est-ce simple service web de refuser le retour JSON pour le client?

Voici mon code client:

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

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

Et la réponse:

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

Peu importe ce que je fais, la réponse revient toujours au format XML. Comment puis-je obtenir le service web pour le retour Json?

EDIT:

Voici le Violoneux de trace HTTP:

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>

J'ai perdu le compte du nombre d'articles que j'ai lu maintenant essayer de résoudre ce problème. Les instructions sont incomplètes ou ne résolvent pas mon problème pour une raison quelconque. Certains des plus pertinents comprennent (sans succès):

En Plus de plusieurs autres articles de portée générale.

44voto

njr101 Points 5532

Finalement pensé à elle.

Le code de l'application est correcte comme affiché. Le problème vient de la configuration. Le web correct.la config est:

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

Selon la documentation, l'enregistrement du gestionnaire doit être inutile .NET 4 vers le haut comme il a été déplacé à la machine.config. Pour quelque raison que ce soit, ce n'est pas de travail pour moi. Mais l'ajout de l'enregistrement pour le web.config pour mon application résolu le problème.

Beaucoup d'articles sur ce problème, instruire, ajouter le gestionnaire de l' <system.web> section. Cela ne fonctionne PAS et provoque un tas d'autres problèmes. J'ai essayé d'ajouter le gestionnaire pour les deux sections et cela génère un ensemble d'autres erreurs de migration qui a complètement mal acheminés mon dépannage.

Dans le cas où il aide à quelqu'un d'autre, si j'avais ther même problème, voici la liste de contrôle, je voudrais passer en revue:

  1. Avez-vous spécifier type: "POST" dans la requête ajax?
  2. Avez-vous spécifier contentType: "application/json; charset=utf-8" dans la requête ajax?
  3. Avez-vous spécifier dataType: "json"dans la requête ajax?
  4. Est-ce que votre .service web asmx inclure l' [ScriptService]` attribut?
  5. Est-ce que votre méthode web comprennent l' [ScriptMethod(ResponseFormat = ResponseFormat.Json)] d'attribut? (Mon code fonctionne même sans cet attribut, mais beaucoup d'articles qui disent que c'est obligatoire)
  6. Avez-vous ajouté l' ScriptHandlerFactory sur le web.fichier de configuration en <system.webServer><handlers>?
  7. Avez-vous supprimé tous les gestionnaires de l'internet.fichier de config dans en <system.web><httpHandlers>?

Espérons que cela aide quelqu'un avec le même problème. et grâce à des affiches pour des suggestions.

27voto

Ajay Points 61

Pas de succès avec la solution ci-dessus, voici comment je l'ai résolue.

mettez cette ligne dans votre webservice et renvoyez plutôt le type, écrivez simplement la chaîne dans le contexte de la réponse

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

12voto

Kalpesh Desai Points 21

Si vous souhaitez rester avec Framework 3.5, vous devez modifier le code comme suit.

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

1voto

SQLDBA Points 1084

J'ai un service Web .asmx (.NET 4.0) avec une méthode qui retourne une chaîne. La chaîne est une liste sérialisée comme vous le voyez dans beaucoup d'exemples. Cela renverra un JSON qui n'est pas encapsulé dans XML. Aucune modification de web.config ni besoin de DLL tierces.

 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;
 

La partie client qui utilise le service ressemble à ceci:

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

0voto

j0aqu1n Points 859

Pour moi, cela fonctionne avec ce code que j'ai reçu de ce post:

Comment puis-je renvoyer JSON à partir de mon service de repos WCF (.NET 4), à l'aide de Json.Net, sans qu'il s'agisse d'une chaîne, entourée de guillemets?

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X