Вызов ASMX из jQuery

Я безуспешно пытаюсь вызвать метод ASMX из jQuery. Ниже приведен мой код, и я не понимаю, чего мне не хватает.

Файл Что-то.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,

[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?";
    }
}

person Community    schedule 18.05.2009    source источник


Ответы (8)


Одна вещь, которая выделяется, это то, что у вас есть UseHttpGet=true, но в вашем коде jQuery вы используете POST.

Также вот тестовая страница, которую я создал, вызывая страницу 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>
person Jim Scott    schedule 18.05.2009
comment
Насколько я понимаю это, я пытаюсь сделать что-то подобное сам. Можете ли вы сказать мне, поскольку атрибут [WebMethod], похоже, поддерживается в обычных файлах ASPX, зачем нужен файл ASMX? Спасибо. - person Jonathan Wood; 30.06.2011
comment
Джонатан, если вы создаете метод, который будет использоваться только для конкретной страницы, с которой вы вызываете веб-метод, вы можете определенно добавить его на страницу напрямую. Однако, если вы хотите использовать его с нескольких страниц, вероятно, лучше создать для него специальный asmx, чтобы его можно было использовать повторно и он не имел прямого отношения к какой-либо странице. - person Jim Scott; 08.08.2011
comment
Итак, я разместил ASMX в IIS на сервере. ASMX имеет функцию DoTest, на которую я могу щелкнуть, и она перенаправляет меня на другую страницу, где я могу нажать кнопку «Вызвать», и она отображает XML. Однако, когда я попробовал это с вызовом JQuery, я получаю 0 and error как ошибку ajaxFailed. Любая идея/ - person Si8; 19.01.2017

Вы должны убедиться, что указали Json в качестве формата ответа, если это то, что вы хотите, и избавиться от UseHttpGet из-за функции безопасности:

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

Вот пример jQuery-вызова метода страницы на aspx, но он будет похож на 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

    });
person CSharpAtl    schedule 18.05.2009

Я столкнулся с этим вопросом и имел ту же проблему. Я решил это, добавив:

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

Ниже вашего атрибута веб-метода, если вы хотите использовать POST. то есть:

[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?";
    }
}
person user609926    schedule 15.06.2012

Я бы также предложил удалить UseHttpGet, как предложил Джим Скотт.

Вы можете добавить следующие параметры и проверить objXMLHttpRequest, чтобы увидеть более подробный ответ об ошибке.

error: function(objXMLHttpRequest, textStatus, errorThrown) {
 debugger;               
}
person Rick Hochstetler    schedule 18.05.2009

Вы должны убедиться, что указали Json в качестве формата ответа, если это то, что вы хотите, и избавиться от UseHttpGet из-за функций безопасности:

Если вы прочтете эту статью, то увидите, что использовать UseHttpGet безопасно, поскольку ASP.NET имеет функции для блокировки вектора атаки межсайтового скриптинга.

Есть много веских причин для использования GET.

Он может удалить параметр данных и изменить POST на GET, чтобы вызов заработал. Предполагая, что вам нужен ответ JSON, необходимо также добавить ResponseFormat=ResponseFormat.Json.

person Sean Smith    schedule 08.06.2012

Следующие шаги решили мою проблему, надеюсь, это поможет кому-то,

  1. Чтобы разрешить вызов этой веб-службы из сценария с использованием ASP.NET AJAX, включите следующую строку, например, над классом обслуживания asmx.

    [System.Web.Script.Services.ScriptService] открытый класс GetData: System.Web.Services.WebService {

  2. Добавьте протоколы в system.web в web.config, нажмите на ссылку, если вы не можете просмотреть конфигурацию

https://pastebin.com/CbhjsXZj

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

person balaji palamadai    schedule 13.08.2017

Если вы попробуете браузер Chrome, попробуйте Internet Explorer, он сработал для меня, а также речь идет о браузере Chrome, вы должны добавить расширение для работы в Chrome, но я не знаю название расширения

person Taha Karaca    schedule 10.10.2016