asp.net asmx web service retournant xml au lieu de json
pourquoi ce simple service web refuse-t-il de rendre JSON au 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 en XML. Comment puis-je obtenir le service web pour retourner Json?
Modifier:
Voici la trace HTTP Du Violon:
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 de combien d'articles j'ai lu maintenant essayer de corriger cela. Les instructions sont incomplètes ou ne résolvent pas mon problème pour une raison quelconque. Parmi les plus importantes, citons (toutes sans succès):
- ASP.NET le service web renvoie par erreur XML au lieu de JSON
- service web asmx retour xml au lieu de json .net 4.0
- http://williamsportwebdeveloper.com/cgi/wp/?p=494
- http://encosia.com/using-jquery-to-consume-aspnet-json-web-services/
- http://forums.asp.net/t/1054378.aspx
- http://jqueryplugins.info/2012/02/asp-net-web-service-returning-xml-instead-of-json/
Plus plusieurs autres articles généraux.
10 réponses
a finalement compris.
le code app est correct tel qu'il est affiché. Le problème vient de la configuration. Le web correct.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 le docs, l'enregistrement du gestionnaire ne devrait pas être nécessaire à partir de .NET 4 vers le haut car il a été déplacé à la machine.config. Pour quelque raison que ce soit, ce n'est pas de travail pour moi. Mais en ajoutant l'inscription sur le web.config pour mon application résolu le problème.
beaucoup d'articles sur ce problème indiquent d'ajouter le handler à la section <system.web>
. Cela ne fonctionne pas et cause toute une charge d'autres problèmes. J'ai essayé d'ajouter le Gestionnaire aux deux sections et cela génère un ensemble d'autres erreurs de migration qui ont complètement mal dirigé mon dépannage.
au cas où cela aiderait quelqu'un d'autre, si j'avais le même problème à nouveau, voici la liste de contrôle que je passerais en revue:
- Avez-vous préciser
type: "POST"
dans la requête ajax? - avez-vous spécifié
contentType: "application/json; charset=utf-8"
dans la demande ajax? - avez-vous spécifié
dataType: "json"
dans la demande ajax? - est-ce que votre .service web asmx inclure le
[ScriptService]
attribut? - votre méthode web inclut-elle l'attribut
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
? (Mon code fonctionne même sans cet attribut, mais beaucoup d'articles qui disent que c'est obligatoire) - Avez-vous Ajouté le
ScriptHandlerFactory
au web.fichier de configuration dans<system.webServer><handlers>
? - avez-vous retiré tous les manipulateurs du web.fichier de configuration dans
<system.web><httpHandlers>
?
Espérons que cela aide quelqu'un avec le même problème. et merci aux affiches pour les suggestions.
pas de succès avec la solution ci-dessus, voici comment je l'ai résolu.
mettez cette ligne dans votre webservice et plutôt tapez retour juste écrire la chaîne dans le contexte de réponse
this.Context.Response.ContentType = "application/json; charset=utf-8";
this.Context.Response.Write(serial.Serialize(city));
si vous voulez rester avec Framework 3.5, vous devez faire des changements dans 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);
}
}
il est beaucoup plus facile de retourner une chaîne pure du service web. Je l'appelle fonction de corbeau (rend facile à se rappeler).
[WebMethod]
public void Test()
{
Context.Response.Output.Write("and that's how it's done");
}
comme vous pouvez le voir, le type de retour est" nul", mais la fonction de corbeau retournera quand même la valeur que vous voulez.
j'ai un .service web asmx (.NET 4.0) avec une méthode qui renvoie une chaîne de caractères. La chaîne est une liste sérialisée comme vous voyez dans beaucoup des exemples. Cela ramènera json qui n'est pas enveloppé dans XML. Pas de modifications sur le site web.configuration ou besoin de DLLs tiers.
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 du 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);
}
});
pour moi, il fonctionne avec ce code que j'ai reçu de ce post:
[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);
}
j'ai essayé toutes les étapes ci-dessus ( même la réponse), mais je n'ai pas réussi, ma configuration système est Windows Server 2012 R2, IIS 8. L'étape suivante a résolu mon problème.
a changé l'application pool, qui a géré pipeline = classic.
je sais que c'est vraiment une vieille question, mais j'ai le même problème aujourd'hui, et j'ai cherché partout pour trouver la réponse, mais sans résultat. Après de longues recherches, j'ai trouvé le moyen de faire ce travail. Pour retourner JSON du service, vous avez fournir des données dans la demande dans le format correct, utiliser JSON.stringify()
pour analyser les données avant la demande et ne pas oublier contentType: "application/json; charset=utf-8"
, en utilisant ce devrait fournir le résultat attendu.
espérons que cela aide, il semble que vous ayez encore à envoyer un objet JSON dans la requête, même si la méthode que vous appelez n'a pas de paramètres.
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;
});
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;