2009-05-18 9 views
17

Tôi đang cố gọi một phương thức ASMX từ jQuery mà không thành công. Sau đây là mã của tôi, và tôi không hiểu những gì tôi đang thiếu.Gọi ASMX từ jQuery

file Something.js,

function setQuestion() { 
    $.ajax({ 
     type: "POST", 
     data: "{}", 
     dataType: "json", 
     url: "http: //localhost/BoATransformation/Survey.asmx/GetSurvey", 
     contentType: "application/json; charset=utf-8", 
     success: onSuccess 
    }); 
} 

function onSuccess(msg) { 
    $("#questionCxt").append(msg); 
} 

SomethingElse.cs File,

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.Web.Script.Services.ScriptService] 
public class Survey : System.Web.Services.WebService { 

    public Survey() { 
    } 

    [WebMethod] 
    [ScriptMethod(UseHttpGet = true)] 
    public string GetSurvey() { 
     return "Question: Who is Snoopy?"; 
    } 
} 
+3

Bạn gặp phải lỗi gì? –

Trả lời

25

Một điều nổi bật là bạn phải UseHttpGet=true nhưng trong mã jQuery của bạn, bạn đang sử dụng POST.

Đây cũng là trang thử nghiệm mà tôi đã tạo gọi trang ASMX.

[WebMethod] 
public Catalog[] GetCatalog() 
{ 
    Catalog[] catalog = new Catalog[1]; 
    Catalog cat = new Catalog(); 
    cat.Author = "Jim"; 
    cat.BookName ="His Book"; 
    catalog.SetValue(cat, 0); 
    return catalog; 
} 

<script type="text/javascript"> 
    $(document).ready(function() { 
    $.ajax({ 
      type: "POST", 
      url: "default.asmx/GetCatalog", 
      cache: false, 
      contentType: "application/json; charset=utf-8", 
      data: "{}", 
      dataType: "json", 
      success: handleHtml, 
      error: ajaxFailed 
     }); 
    }); 

    function handleHtml(data, status) { 
     for (var count in data.d) { 
      alert(data.d[count].Author); 
      alert(data.d[count].BookName); 
     } 
    } 

    function ajaxFailed(xmlRequest) { 
     alert(xmlRequest.status + ' \n\r ' + 
       xmlRequest.statusText + '\n\r' + 
       xmlRequest.responseText); 
    } 
</script> 
+0

Trong phạm vi tôi hiểu điều này, tôi đang cố gắng làm một cái gì đó tương tự bản thân mình. Bạn có thể cho tôi biết, vì thuộc tính '[WebMethod]' có vẻ được hỗ trợ trong các tệp ASPX thông thường, tại sao tệp ASMX cần thiết? Cảm ơn. –

+0

Jonathan, nếu bạn đang tạo một phương thức sẽ chỉ được sử dụng cho trang cụ thể mà bạn đang gọi là webmethod, bạn có thể thêm nó trực tiếp vào trang đó. Tuy nhiên nếu bạn muốn sử dụng nó từ nhiều trang có lẽ tốt hơn để tạo một asmx dành riêng cho nó để nó có thể được tái sử dụng và không có mối quan hệ trực tiếp với một số trang. –

+0

Vì vậy, tôi đã tổ chức ASMX trong IIS trong một máy chủ, ASMX có chức năng 'DoTest' mà tôi có thể nhấp vào và nó đưa tôi đến một trang khác mà tôi có thể nhấp vào nút" Gọi "và nó hiển thị XML. Tuy nhiên khi tôi đã thử ở trên với cuộc gọi JQuery, tôi nhận được một '0 và lỗi' là lỗi' ajaxFailed'. Bất kỳ ý tưởng/ – Si8

1

Đây là ví dụ về cuộc gọi jQuery đến phương pháp trang trên aspx, nhưng nó sẽ tương tự như trang asmx.

$.ajax(
    { 
     type: "POST", 
     url: "NDQA.aspx/ValidateRoleName", 
     data: '{"roleName":"' + $('[id$=RoleNameTextBox]').val() + '"}', 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: ValidateSuccess, 
     error: ValidateError 

    }); 
1

Tôi cũng khuyên bạn nên xóa UseHttpGet như Jim Scott đề xuất.

Bạn có thể thêm thông tin sau vào tùy chọn của mình và kiểm tra objXMLHttpRequest để xem phản hồi lỗi chi tiết hơn.

error: function(objXMLHttpRequest, textStatus, errorThrown) { 
debugger;    
} 
6

Bạn phải chắc chắn rằng bạn chỉ định Json như là định dạng phản ứng nếu đó là những gì bạn muốn và thoát khỏi UseHttpGet do security features:

[WebMethod] 
[ScriptMethod(ResponseFormat=ResponseFormat.Json)] 
public string GetSurvey() { 
    return "Question: Who is Snoopy?"; 
} 
1

Bạn phải chắc chắn rằng bạn chỉ định Json là định dạng phản hồi nếu đó là những gì bạn muốn và loại bỏ UseHttpGet do các tính năng bảo mật:

Nếu bạn đọc bài viết đó thì bạn sẽ thấy rằng nó là an toàn để sử dụng UseHttpGet như ASP.NET có các tính năng để chặn các trang web cross scripting tấn công vector.

Có rất nhiều lý do hợp lệ để sử dụng GET.

Anh ấy có thể xóa thông số dữ liệu và thay đổi POST thành GET để thực hiện cuộc gọi. Giả sử bạn muốn có một phản ứng JSON, nó sẽ được yêu cầu để thêm ResponseFormat = ResponseFormat.Json.

2

Tôi đã xem qua câu hỏi này và gặp vấn đề tương tự. Tôi đã giải quyết bằng cách thêm:

[WebInvoke(Method="POST",ResponseFormat=WebMessageFormat.Json)] 

Dưới thuộc tính phương thức web của bạn, nếu bạn muốn sử dụng POST. ví dụ:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.Web.Script.Services.ScriptService] 
public class Survey : System.Web.Services.WebService { 

    public Survey() { 
    } 

    [WebMethod] 
    [WebInvoke(Method="POST",ResponseFormat=WebMessageFormat.Json)] 
    [ScriptMethod(UseHttpGet = true)] 
    public string GetSurvey() { 
     return "Question: Who is Snoopy?"; 
    } 
} 
0

Nếu bạn cố gắng trình duyệt chrome, hãy thử internet explorer nó làm việc cho tôi và cũng có thể nó là về trình duyệt chrome bạn phải thêm phần mở rộng cho các công trình trong chrome nhưng tôi không biết tên của phần mở rộng

1

Các các bước sau đã giải quyết được vấn đề của tôi, hy vọng nó sẽ giúp một số vấn đề,

  1. Để cho phép dịch vụ web này được gọi từ tập lệnh, sử dụng ASP.NET AJAX, bao gồm các dòng sau trên lớp dịch vụ asmx của bạn ví dụ

    [System.Web.Script.Services.ScriptService] public class GetData: System.Web.Services.WebService {

  2. Thêm các giao thức dưới system.web trong web.config, xin vui lòng nhấp vào liên kết nếu bạn không thể xem cấu hình

https://pastebin.com/CbhjsXZj

<system.web> 
<webServices> 
    <protocols> 
    <add name="HttpGet"/> 
    <add name="HttpPost"/> 
    </protocols> 
</webServices>