2010-08-17 39 views
7

Tôi đang cố gắng gọi ASMX từ jQuery bằng cách sử dụng JSON và nhận được phản hồi lỗi SOAP.Gọi dịch vụ Web ASP.NET ASMX từ jQuery

Tôi đang làm gì sai ?!

Đây là cuộc gọi jQuery tôi:

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

Đây là dịch vụ web của tôi:

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

tôi nhận được một lỗi SOAP khó chịu lại:

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

tôi có thể nhấn /Services/TeamPerson.asmx qua trình duyệt của tôi và phương thức web hoạt động tốt. Tôi cũng có các định nghĩa sau trong 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> 

Trả lời

15

Bạn không xác định phương thức nào để gọi trên dịch vụ. Hãy thử thay đổi dòng JQuery của bạn url: '/Services/TeamPerson.asmx', thành url: '/Services/TeamPerson.asmx/SetPlayerStatus',

+1

Điều đó tạo ra sự khác biệt lớn, cảm ơn! Bây giờ tôi chỉ nhận được lỗi này: {"Nội dung": "Nguyên thủy JSON không hợp lệ: đang hoạt động", "StackTrace": "tại ... Tôi có đang truyền dữ liệu {} thông số sai không? –

+0

Ah! I didn Không nhận dữ liệu cần thiết để có tham số chuỗi được trích dẫn. Dữ liệu này hoạt động: dữ liệu: "{'active': 'false', 'team_id':" + team_id + ", 'player_id':" + player_id + "}", –

5

Có thể đó là phương pháp web bị thiếu trong URL, cũng như các tham số.

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

Cũ, tôi biết, nhưng .... tại sao bạn không sử dụng JSON.stringify (tham số) trong tham số "dữ liệu"? –

Các vấn đề liên quan