1

率直に言って、私を困惑させた比較的単純なタスクであるべきものがあります。私は脳が揚げられるまでそれを研究しました、そして今私はパントしていて、あなたたちに助けを求めています。

シナリオは次のとおりです。

  • 、、、および属性 WebServiceで 装飾されたASPXページ(Q2.aspx)があります。WebServiceBindingScriptService
  • そのページにはGetAllContacts、属性で装飾され、WebMethod JSONデータを含む文字列を返すメソッド、が含まれています。(価値があるので、ページ自体には他のコントロールや機能は含まれていません。)
  • XmlHttpRequest オブジェクトを使用してASPXページでWebMethodを呼び出しGetAllContacts、JSONデータをHTMLテーブルに変換するJavaScriptを含むHTMLページがあります。
  • Web.Configファイルに、のセクションに適切なプロトコルハンドラーが含まHttpGetHttpPutWebServicesいることを確認しましたSystem.Web.webServices
  • Web.ConfigファイルにセクションScriptModuleの下のエントリ が含まれてSystem.webServer.modulesいること、および適切なドキュメントと一致していることを確認しました。

ただし、ブラウザでHTMLページを表示すると、次のようになります。

  • Webリクエストは通過しますが、結果はASPXページからの未処理のHTMLに対するものです。
  • GetAllContactsコードにブレークポイントを設定することで証明されるように、メソッドが呼び出されることはありません。
  • ただし、Webサービスを呼び出すコードが呼び出され、要求の完了時に呼び出されるJavaScriptコールバック関数が適切に呼び出されます。

JavaScriptコードはおおむね正しく設定されているようですが、何らかの理由でこの時点で完全にエスケープされているため、HTMLページはWebMethodASPXページで実行されず、プレーンHTMLであるかのようにページを返すだけです。GETリクエスト。eval明らかに、HTMLドキュメントはJavaScriptの関数では評価できないため、問題が発生します。(また、JSONデータは返されるHTMLのどこにも表示されないことに注意してください。)

率直に言って、私は困惑しています。私は何十ものMicrosoftの記事、StackOverflowの投稿、CodeProjectの記事を見てきましたが、他に何を知っているのでしょうか。私のコードは大丈夫のようです。しかし、私はよく知っています。シンプルで、愚かで、明白なものが欠けています。私はそれを私に指摘する誰かが必要です。

以下に、ASPXページコードとHTMLコードを示します。これらが、ある程度の光を当てることを期待しています。

ASPXコード

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Q2.aspx.cs" Inherits="Satuit.Q2" enablesessionstate="False" %>
<html>
    <body>
        <form runat="server" id="frmMain"/>
    </body>
</html>
-- Codebehind
using System.IO;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;
using System.Web.UI;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;

namespace Satuit
{
    [WebService(Namespace="http://tempuri.org")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [ScriptService]
    public partial class Q2 : Page
    {

        [WebMethod]
        public static string GetAllContacts()
        {
            return LoadJsonData();
        }

        private static string LoadJsonData()
        {
            using (var stringWriter = new StringWriter())
            {

                string xmlUri = HttpContext.Current.Server.MapPath("\\XmlData\\Contacts.xml");
                string xslUri = HttpContext.Current.Server.MapPath("\\XmlData\\Q2.xsl");

                using (var xmlTextReader = new XmlTextReader(xmlUri))
                {
                    var xpathDocument = new XPathDocument(xmlTextReader);
                    var xslTransform = new XslCompiledTransform();

                    xslTransform.Load(xslUri);
                    xslTransform.Transform(xpathDocument, null, stringWriter);

                    return stringWriter.ToString();
                }
            }
        }
    }
}

HTMLコード

    var objectData; // Receives the objectified results of the JSON request.

    var xmlhttp;
    if(window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }

    xmlhttp.open("GET", "/Q2.aspx/GetAllContacts", true);
    xmlhttp.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    xmlhttp.onreadystatechange = function () 
    {
        if (xmlhttp.readyState == 4) 
        {
            if (xmlhttp.status == 200)
            {
                var jsonResultBuffer = xmlhttp.responseText;
                objectData = eval(jsonResultBuffer);
                DisplayTable();
            }
        }
    };
    xmlhttp.send(null);

    function DisplayTable()
    {       
        var sHtml = "";     
        sHtml = "<table><tr><th>ID</th><th>First</th><th>Last</th><th>Address</th></tr>";           
        for(i = 0; i < objectData.length; i++)
        {
            sHtml += "<tr>";
            sHtml += "<td>" + objectData.ID;
            sHtml += "<td>" + objectData.firstName + "</td>";
            sHtml += "<td>" + objectData.lastName + "</td>";
            sHtml += "<td>" + objectData.address + "</td>"; 
            sHtml += "</tr>"
        }
        sHtml += "</table>"         
        document.getElementById("divTable").innerHTML = sHtml;
    }    
</script>

開発環境の詳細

  • Vista Ultimate SP 2
  • Visual Studio 2008
  • .NET Framework 3.5
  • ソリューションはまだ展開されていないため、VisualStudioが提供する「ローカルWebサーバー」で実行されています。(VistaでIISを展開するだけではいけないのではないかと思います。)
  • WebMethodとHTMLページを含むASPXページは同じソリューション内にあることに注意してください。
4

2 に答える 2

4

POSTリクエストでWebメソッドを呼び出す必要があると思いますコードのこの部分を変更してみてください

xmlhttp.open("POST", "/Q2.aspx/GetAllContacts", true);
xmlhttp.setRequestHeader("content-type", "application/json");
xmlhttp.setRequestHeader("Accept", "application/json");
xmlhttp.onreadystatechange = function () 
{
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
    {
            var jsonResultBuffer = JSON.parse(xmlhttp.responseText);
            objectData = jsonResultBuffer.d;
            DisplayTable();
    }
};

応答は、xmlhttp.responseTextのキーとして「d」を使用してJSON形式で返されます

于 2012-06-26T10:42:22.793 に答える
0

plsはjqueryを使用して次のことを試み、Webサービスがアクセス可能かどうかを確認します。

$.ajax({
        type: "POST",
        url: "Q2.aspx/GetAllContacts",
        data: "",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(response) {
           alert("success");
        },
        error: function(response, aa) {
            alert("fail");
        }
    });

トゥレイン

于 2010-06-25T10:12:18.873 に答える