2010-10-14 15 views
5

Symptôme: Lorsque je fais une demande de service Web (à partir de JQuery en utilisant .ajax, en ASP.NET fichier .asmx), si elle est faite en utilisant GET au lieu de POST, le fichier .asmx retourne toujours XML au lieu de JSON. Si je retourne l'appel aux messages, il répond très bien comme JSON.ASP.NET WebService renvoie par erreur XML au lieu de JSON uniquement lors de l'utilisation de Http Get mais web.config est configuré à droite

Objectif: Comment puis-je obtenir JSON au lieu de XML, en utilisant HTTP GET?

J'ai déjà un peu de googling et ce ne sont pas les suspects habituels comme ScriptService manquant ou ne pas enregistrer de gestionnaire dans web.config. Il se comporte comme l'usine de gestionnaire de script ne fonctionne que sur les messages? S'il vous plaît, aidez-moi à me diriger dans la bonne direction ici!

Code Serveur:

namespace mynamespace 
{ 
    /// <summary> 
    /// Summary description for ServiceAddresses 
    /// </summary> 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [ToolboxItem(false)] 
    [System.Web.Script.Services.ScriptService] 
    public class MyService : System.Web.Services.WebService 
    { 
     [WebMethod] 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] 
     public string HelloWorld() 
     { 
      return "Hello World at " + DateTime.Now.ToLongTimeString(); 
     } 
    } 
} 

Code client:

function testhelloworld(postorget) { 
    var webMethod = '/servicedir/MyService.asmx/HelloWorld'; 
    $.ajax({ 
     type: ('GET'===postorget)?'GET':'POST', 
     url: webMethod, 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 
     data: "{}", 
     success: function(msg) { 
      $('#info').text(msg.d); 
     }, 
     error: function(xhr, ajaxOptions, thrownError) { 
      $('#info').text('Error: ' + xhr.responseText); 
     } 
    }); 
} 

Travaux bien si je passe le service à UseHttpGet = fausses demandes et des clients comme POST. Renvoie XML si j'utilise GET.

Fiddler dit demande est:

GET http://myserver/servicedir/MyService.asmx/HelloWorld?{} HTTP/1.1 
Host: myserver 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 (.NET CLR 3.5.30729) 
Accept: application/json, text/javascript, */* 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
X-Requested-With: XMLHttpRequest 
Referer: http://myserver/test/index.aspx 

Réponse:

HTTP/1.1 200 OK 
Server: Microsoft-IIS/5.1 
Date: Thu, 14 Oct 2010 00:31:44 GMT 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Cache-Control: private, max-age=0 
Content-Type: text/xml; charset=utf-8 
Content-Length: 115 

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

parties pertinentes de web.config:

<webServices> 
    <protocols> 
    <add name="HttpGet"></add> 
    <add name="HttpPost"></add> 
    </protocols> 
</webServices> 
. . . 
     <remove verb="*" path="*.asmx"/> 
     <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
. . . 
    <remove name="ScriptHandlerFactory"/> 
    <remove name="ScriptHandlerFactoryAppServices"/> 
    <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 

même chose, mais avec recompiler UseHttpGet = faux et demande via POST fonctionne.

Fiddler dit demande POST est:

POST http://myserver/servicedir/MyService.asmx/HelloWorld HTTP/1.1 
Host: myserver 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 (.NET CLR 3.5.30729) 
Accept: application/json, text/javascript, */* 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Content-Type: application/json; charset=utf-8 
X-Requested-With: XMLHttpRequest 
Referer: http://myserver/test/index.aspx 
Content-Length: 2 
Pragma: no-cache 
Cache-Control: no-cache 

{} 

Réponse:

HTTP/1.1 200 OK 
Server: Microsoft-IIS/5.1 
Date: Thu, 14 Oct 2010 00:37:03 GMT 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Cache-Control: private, max-age=0 
Content-Type: application/json; charset=utf-8 
Content-Length: 33 

{"d":"Hello World at 8:37:03 PM"} 

préemptive répondant aux non-réponses:

Je veux utiliser GET parce que je voudrais les clients à être capable de mettre en cache.

Je suis conscient qu'il y a des problèmes de sécurité avec get e.g. posté sur le blog de scott gu. Je sais que je ne pouvais pas utiliser les scripts d'ASP.NET et juste le faire moi-même, ou essayer Jayrock. Mais, je voudrais comprendre pourquoi le stock ASP.NET ScriptHandler ne fonctionne pas.

Répondre

0

Je ne sais pas sur les services Web asmx, mais nous utilisons WCF et il fonctionne avec ces attributs sur la méthode

[WebGet(RequestFormat = WebMessageFormat.Json, 
ResponseFormat = WebMessageFormat.Json]