2010-08-17 9 views
7

J'essaie d'appeler un ASMX à partir de jQuery en utilisant JSON et d'obtenir une réponse d'erreur SOAP.Appel du service Web ASP.NET ASMX à partir de jQuery

Qu'est-ce que je fais de mal ?!

Ceci est mon appel jQuery:

$.ajax({ 
      type: "POST", 
      url: '/Services/TeamPerson.asmx', 
      contentType: "application/json; charset=utf-8", 
      data: {'active':false, 'team_id':team_id, 'player_id':player_id}, 
      dataType: "json", 
      success: function(msg) { 
       alert(msg); 
      }, 
      error: function(xhr, msg) { alert(msg + '\n' + xhr.responseText); } 
      }); 

Ceci est mon service web:

[WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [ToolboxItem(false)] 
    [ScriptService] 
    public class TeamPerson : WebService 
    { 
    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public void SetPlayerStatus(bool active, ulong team_id, ulong player_id) 
    { 
     // blah blah 
    } 
    } 

J'obtiens une erreur SOAP méchant retour:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<soap:Body><soap:Fault><soap:Code> 
    <soap:Value>soap:Receiver</soap:Value></soap:Code> 
    <soap:Reason><soap:Text xml:lang="en"> 
    System.Web.Services.Protocols.SoapException: Server was unable to process request. ---&gt; 
    System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1. 
    at System.Xml.XmlTextReaderImpl.Throw(Exception e)  
    at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)  
    at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()  
    at System.Xml.XmlTextReaderImpl.ParseDocumentContent()  
    at System.Xml.XmlTextReaderImpl.Read()  
    at System.Xml.XmlTextReader.Read() 
    at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.Read()  
    at System.Xml.XmlReader.MoveToContent()  
    at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.MoveToContent()  
    at System.Web.Services.Protocols.SoapServerProtocolHelper.GetRequestElement()  
    at System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest()  
    at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)  
    at System.Web.Services.Protocols.SoapServerProtocol.Initialize() 
     at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response) 

    at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean&amp; abortProcessing) 

    --- End of inner exception stack trace ---</soap:Text></soap:Reason><soap:Detail /></soap:Fault></soap:Body></soap:Envelope> 

je peux frapper /Services/TeamPerson.asmx via Mon navigateur et la méthode Web fonctionnent bien. J'ai également les éléments suivants définis dans web.config:

<httpHandlers> 
    <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"/> 
    <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
    <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/> 
     <add verb="GET,HEAD,POST" path="TinyMCEHandler.aspx" type="Moxiecode.TinyMCE.Web.HttpHandler,Moxiecode.TinyMCE" /> 
    </httpHandlers> 
    <httpModules> 
    <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
    </httpModules> 

Répondre

15

Vous n'êtes pas en train de définir la méthode à faire appel au service. Essayez de changer votre ligne JQuery url: '/Services/TeamPerson.asmx', à url: '/Services/TeamPerson.asmx/SetPlayerStatus',

+1

Cela a fait une grande différence, merci! Maintenant, je reçois juste cette erreur: {"Message": "primitive JSON invalide: active.", "StackTrace": "à ... Est-ce que je passe les données {} params dans le mauvais? –

+0

Ah! I didn 't réaliser les données nécessaires pour être un paramètre de chaîne entre guillemets Cela a fonctionné: data: "{' active ':' false ',' team_id ':" + team_id + ",' player_id ':" + player_id + "}", –

5

Peut-être que c'est la méthode web manquante dans l'URL, ainsi que les paramètres.

var teamID = 123; 
var playerID = 456; 
var active = true; 
var webMethod = 'http://foo.net/TeamPerson.asmx/SetPlayerStatus' 
var parameters = "{'active':'" + active + 
       "','team_id':'" + teamID + 
       "','player_id':'" + playerID + "'}" 

$.ajax({ 
     type: "POST", 
     url: webMethod, 
     data: parameters, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function(msg) {  
       alert('all good'); 
     }, 
     error: function(e){ 
       alert('err'); 
     } 
}); 
+0

Son ancien, je sais, mais .... pourquoi vous n'utilisez pas JSON.stringify (paramètres) dans le paramètre "données"? –

Questions connexes