率直に言って、私を困惑させた比較的単純なタスクであるべきものがあります。私は脳が揚げられるまでそれを研究しました、そして今私はパントしていて、あなたたちに助けを求めています。
シナリオは次のとおりです。
- 、、、および属性
WebServiceで 装飾されたASPXページ(Q2.aspx)があります。WebServiceBindingScriptService - そのページには
GetAllContacts、属性で装飾され、WebMethodJSONデータを含む文字列を返すメソッド、が含まれています。(価値があるので、ページ自体には他のコントロールや機能は含まれていません。) XmlHttpRequestオブジェクトを使用してASPXページでWebMethodを呼び出しGetAllContacts、JSONデータをHTMLテーブルに変換するJavaScriptを含むHTMLページがあります。Web.Configファイルに、のセクションに適切なプロトコルハンドラーが含まHttpGetれHttpPutてWebServicesいることを確認しました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ページは同じソリューション内にあることに注意してください。