Вызов ASMX из jQuery - PullRequest
17 голосов
/ 18 мая 2009

Я пытаюсь вызвать метод 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?";
    }
}

Ответы [ 8 ]

26 голосов
/ 18 мая 2009

Одна вещь, которая выделяется, у вас есть 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>
6 голосов
/ 19 мая 2009

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

[WebMethod]
[ScriptMethod(ResponseFormat=ResponseFormat.Json)]
public string GetSurvey() {
    return "Question: Who is Snoopy?";
}
2 голосов
/ 15 июня 2012

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

[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?";
    }
}
2 голосов
/ 18 мая 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

    });
1 голос
/ 13 августа 2017

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

  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>

1 голос
/ 08 июня 2012

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

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

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

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

1 голос
/ 18 мая 2009

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

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

error: function(objXMLHttpRequest, textStatus, errorThrown) {
 debugger;               
}
0 голосов
/ 10 октября 2016

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

...