19

jQuery から ASMX メソッドを呼び出そうとしていますが、成功しません。以下は私のコードですが、何が欠けているのかわかりません。

ファイル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?";
    }
}
4

8 に答える 8

27

際立っていることの 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>
于 2009-05-18T19:32:43.077 に答える
6

Json が必要な場合は、応答形式として Json を指定し、セキュリティ機能UseHttpGetのために削除する必要があります。

[WebMethod]
[ScriptMethod(ResponseFormat=ResponseFormat.Json)]
public string GetSurvey() {
    return "Question: Who is Snoopy?";
}
于 2009-05-18T20:11:04.497 に答える
2

aspx のページ メソッドへの jQuery 呼び出しの例を次に示しますが、これは 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

    });
于 2009-05-18T19:33:39.130 に答える
2

私はこの質問に出くわし、同じ問題を抱えていました。次を追加して解決しました:

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

POST を使用する場合は、Web メソッド属性の下に。すなわち:

[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?";
    }
}
于 2012-06-15T13:57:18.653 に答える
1

Json が必要な場合は応答形式として必ず指定し、セキュリティ機能のために UseHttpGet を取り除く必要があります。

この記事を読めば、ASP.NET にはクロス サイト スクリプティング攻撃ベクトルをブロックする機能があるため、UseHttpGet を使用しても安全であることがわかります。

GET を使用する正当な理由はたくさんあります。

データ パラメータを削除し、POST を GET に変更して、呼び出しを機能させることができます。JSON 応答が必要であると仮定すると、 ResponseFormat=ResponseFormat.Json も追加する必要があります。

于 2012-06-08T17:04:11.830 に答える
1

Jim Scott が提案したように、UseHttpGet を削除することもお勧めします。

以下をオプションに追加し、objXMLHttpRequest をチェックして、より詳細なエラー応答を確認できます。

error: function(objXMLHttpRequest, textStatus, errorThrown) {
 debugger;               
}
于 2009-05-18T19:42:25.150 に答える
1

次の手順で問題が解決しました。誰かの役に立てば幸いです。

  1. この Web サービスをスクリプトから呼び出せるようにするには、ASP.NET AJAX を使用して、たとえば asmx サービス クラスの上に次の行を含めます。

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

  2. web.config の system.web の下にプロトコルを追加します。構成を表示できない場合は、リンクをクリックしてください。

https://pastebin.com/CbhjsXZj

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

于 2017-08-13T18:41:07.310 に答える
0

Chromeブラウザを試す場合は、Internet Explorerを試してください

于 2016-10-10T19:34:57.390 に答える