Asp.net

從 jQuery 呼叫 ASP.NET ASMX Web 服務

  • August 17, 2010

我正在嘗試使用 JSON 從 jQuery 呼叫 ASMX 並獲得 SOAP 錯誤響應。

我究竟做錯了什麼?!

這是我的 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); }
         }); 

這是我的網路服務:

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

我得到一個討厭的 SOAP 錯誤:

<?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. ---> 
    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& abortProcessing)

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

我可以/Services/TeamPerson.asmx通過我的瀏覽器點擊,並且網路方法工作正常。我還在 web.config 中定義了以下內容:

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

您沒有定義在服務上呼叫哪個方法。嘗試將您的 JQuery 行更改url: '/Services/TeamPerson.asmx',url: '/Services/TeamPerson.asmx/SetPlayerStatus',

可能是 URL 中缺少 Web 方法以及參數。

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

引用自:https://stackoverflow.com/questions/3506634