Подтвердить что ты не робот

Вызов ASMX из jQuery

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

Файл 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,

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

Ответ 1

Одна вещь, которая выделяется, есть 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>

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Вот пример вызова 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

    });

Ответ 5

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

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

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

Ответ 6

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

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

Существует много веских причин использовать GET.

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

Ответ 7

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

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

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

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

https://pastebin.com/CbhjsXZj

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

Ответ 8

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