none
asp.netでXMLHttpRequestを受け取り、xmlを返信する RRS feed

  • 質問

  • ASP.NETでxmlデータを作成しているのですが、クライアント側でうまく受け取れません
    以下のプログラムなのですが、ASP.net側で作成したxmlをうまく受信したいのですが、何が足りないでしょうか

    状況としては、html側で、openして、sendすると、コールバック関数にreadyState ==0で最初にイベントが発生し、
    aspx.csのPage_Loadまでは実行できていることが確認できています
    なのでxmlは出力されているとは思うのですが、クライアント側にデータが受け取れません

    aspxファイルを単独で実行すると、単純なxmlが出力されているというような状態です
    XMLデータを受け取るのに何が間違っているかわかるでしょうか(それか、asp.netで、データ通信をする際の参考になるようなサイトがありましたら教えていただきたいです)

    ★★★★★★データを呼び出す側のhtmlファイル
    <head>
        <title>Ajax TEST</title>
        <script type="text/javascript">
            //ボタンクリック
            function btnSend_onclick() {
                var xmlObj = new XMLHttpRequest();
                //コールバック関数登録
                xmlObj.onreadystatechande = callback(xmlObj);
                //設定
                xmlObj.open("POST", "responseAct.aspx", true);
                xmlObj.setRequestHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
                xmlObj.send("aaa=data1&bbb=data2");
            }
            //コールバック関数
            function callback(xmlObj) {
                if (xmlObj.readyState == 4 ){//readyState ==0の時は、イベントが発生している
                //&& xmlObj.status == 200) {
                    alert(xmlObj.responseText);
                }
            }
        </script>
    </head>
    <body><p><input id="btnSend" type="button" value="発射" onclick="return btnSend_onclick()" /></p>
    </body>

    ★aspxファイル(どうせ表示されないのでテンプレートからいじっていません)
    ★このページを単独で表示すると、aspx.csで作成されたxmlファイルがブラウザ上に表示される
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="responseAct.aspx.cs" Inherits="responseAct" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
        </div>
        </form>
    </body>
    </html>

    ★aspx.csファイル(ここでxmlデータを作成)
    ★index.htmlからはコールされてxmlデータの作成までは実行されていることを確認
    public partial class responseAct : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //postデータ
            string strA = Request.Form.Get("aaa");//ちゃんとデータが入ってきている
            string strB = Request.Form.Get("bbb");//ちゃんとデータが入ってきている
            
            //xml文字列
            StringBuilder builder = new StringBuilder();
            builder.Append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
            builder.Append("<root>");
            builder.Append("<elem>");
            builder.Append("<data>ここにテキストを突っ込む</data>");
            builder.Append("</elem>");
            builder.Append("<data2>");
            builder.Append(strA);
            builder.Append("</data2>");
            builder.Append("</root>");

            //xml出力
            Response.ContentType = "text/xml";
            Response.ContentEncoding = System.Text.Encoding.UTF8;
            Response.Write(builder.ToString());
            Response.End();
        }
    }


    2012年5月31日 6:37

回答

  • xmlObj.onreadystatechande = callback(xmlObj);
    callback()という名前の関数を呼び出し、その戻り値をonreadystatechandeイベントハンドラに登録。typoもありますし、本来callback関数そのものをイベントハンドラに登録すべきでは?
    • 回答としてマーク いちろう 2012年6月15日 5:56
    2012年5月31日 7:06
  • うまくいかない原因は佐祐理さんが言われるとおりだと思いますが・・・

    勉強のためと言うことなら別ですが、今は XMLHttpRequest などという
    プリミティブなものは使わず、jQuery を利用すべきだと思います。

    jQuery.ajax()
    http://api.jquery.com/jQuery.ajax/

    呼び出す相手も、aspx ページではなく、Web サービスのメソッドを呼び
    出すのがよいと思います。

    その例は、以下のページが参考になりませんか。

    jQuery AJAX と Web サービス
    http://surferonwww.info/BlogEngine/post/2011/06/04/jQuery-AJAX-and-Web-Service.aspx

    • 回答としてマーク いちろう 2012年6月15日 5:57
    2012年5月31日 13:29
  • > なぜ、プリミティブなものを使わず、jQueryを利用すべきと提案する
    > のでしょうか? この質問に対する一般的な答えは「ライブラリーに
    > ブラウザー間の差異を吸収してもらうため」だと思います。

    生産性と保守性を考えてのことです。「ブラウザー間の差異を吸収」ほ
    その一部に過ぎません。

    自分が客なら、XMLHttpRequest を使ったプリミティブなコードで書かれ
    たアプリを納品されるのはイヤですね。jQuery を使ってほしいです。


    > 結局、ライブラリーを使う使わない、ライブラリーの中でもjQueryを
    > 選択するしないは質問者さんの自由かと。

    それは、趣味とか勉強のために XMLHttpRequest を使って書いてみたい
    という場合に限られる話だと思います。

    仕事で Web アプリを開発しているというような場合は違うのではない
    でしょうか。

    また、jQuery はデファクトスタンダードで、実質的に他に選択の余地
    はないと思っています。

    • 回答としてマーク いちろう 2012年6月15日 5:57
    2012年6月1日 12:17
  • # どう返すか悩んでました。

    このフォーラムは個人的な好みを他人に強要する場ではないと思います。(最初、理由も挙げずに「jQueryを利用すべき」と断言したり、「自分が客なら~イヤですね」とか。)
    たとえば、

    プリミティブなものを使わず、jQueryなどのライブラリーを推奨します。jQueryであればVisual Studio 2010にはバージョン1.4.1が付属し、Microsoftによるサポートも得られます。

    みたいな書き方であれば反論しなかったかなと思います。

    以下は、SurferOnWwwさんの個人的な好みに対する返信であり、余談です。
    jQueryがデファクトスタンダードなのはわかりますが、個人的には好きではありません。ちょっと前に流行っていたprototype.jsと同じ印象を持っています。シェアの割には詰めが甘かったり、バージョン間の非互換があったり、プラグイン間で競合したり…。
    jQueryで書こうとすると他にも問題が山積みです。一番気になっているのは、何か操作しようとしてもモデルが分離できずにタグ操作に終始することです。そう、SuferOnWwwさんの言われるプリミティブなコードと何ら変わらない点です。jQueryって生産性や保守性の高いコードが書けるのでしょうか…?

    • 回答としてマーク いちろう 2012年6月15日 5:57
    2012年6月2日 15:30
  • > このフォーラムは個人的な好みを他人に強要する場ではないと思います。

    強要ではなくて、意見を述べたつもりです。でも、そんなことは重要なこと
    ではなくて、自分の論点でもありません。

    XMLHttpRequest を使ったプリミティブなコードを書くのと、jQuery を使う
    のとでは、生産性と保守性を考えたらどちらを選ぶべきか、どちらもダメな
    ら他に選択肢はあるかが論点だと思っています。

    で、自分の意見は、jQuery を使うべきで、他に選択肢なはいと言っています。

    少なくとも今回のケースでは、以下のオリジナルのコード、

    function btnSend_onclick() {
        var xmlObj = new XMLHttpRequest();
        xmlObj.onreadystatechande = callback(xmlObj);
        xmlObj.open("POST", "responseAct.aspx", true);
        xmlObj.setRequestHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
        xmlObj.send("aaa=data1&bbb=data2");
    }
    
    function callback(xmlObj) {
       if (xmlObj.readyState == 4 ){
           alert(xmlObj.responseText);
    }

    が、jQuery を使えば、以下のように書けるわけで、タイプミスとかコールバ
    ック関数の設定のミスとかは避けられたのではないでしょうか?

    function btnSend_onclick() {
        $.post("responseAct.aspx",
            { aaa: 'data1', bbb: 'data2' },
            function (data) {
                alert(data.xml);
            });
    }

    > SurferOnWwwさんの個人的な好みに対する返信であり、余談です。

    好みの問題ではないと思います。

    Microsoft が AJAX クライアントライブラリの開発を打ち切って、jQuery を
    サポートしているという状況で、好みの問題で jQuery を使わないというのは
    説得力がないと思います。

    #趣味とか勉強のために XMLHttpRequest を使って書いてみたいという場合は、
     話が別というのは先に申し上げたとおりです。


    2012年6月3日 8:35
  • 「alert(data.xml);」と書かれていますが、jQueryではxmlプロパティがXMLHttpRequestのresponseTextプロパティに相当するのでしょうか? jQuery.postやjQuery.ajaxのドキュメントを参照しましたが、第一引数dataの説明が

    The data returned from the server, formatted according to the dataType parameter

    としかなく、何が返ってくるのかわかりませんでした。dataTypeを省略しているのでContent-Type: text/xmlから判断されてXMLDocumentが返されるのでしょうか? ということはXMLDocumentのxmlプロパティということになるのでしょうか…??

    結局、jQueryを使うと本当に「タイプミスとかコールバック関数の設定のミスとかは避けられ」るのでしょうか?

    それと挙げられた例は他のライブラリを使っても同じことが書けるわけで、jQuery以外に選択肢がないというのもわかりませんでした。
    Microsoftがサポートしているからというのが理由なら、理由を先に述べるべき、と私は書いています。
    そうだとしてもサポート外のライブラリーを使うべきではない理由にはならないでしょう。jQUeryは1.7.2が出ていますが、Microsoftのサポートする古いバージョンを使わなければならないのですか?

    • 回答としてマーク いちろう 2012年6月15日 5:58
    2012年6月4日 0:44
  • レスの内容(反論の論点)がよく分かりません。

    結局、今回の質問者さんのケースでは、佐祐理さんはどうされる
    のでしょう? 

    今までの話からは「jQuery は自分の好みに合わないから使わない、
    XMLHttpRequest を使うか、他のライブラリを使う」ということと
    思えますが、違うでしょうか。

    > それと挙げられた例は他のライブラリを使っても同じことが書
    > けるわけで、jQuery以外に選択肢がないというのもわかりませ
    > んでした。
     
    他のライブラリとは何でしょう? 「同じことが書ける」程度で
    あれば、そのライブラリを選択するメリットはなさそうです。

    そこに個人的な好みが入り込む余地はなくて、実質的に jQuery
    以外の選択肢はないと思います。(趣味とか勉強なら話は別)

    > jQUeryは1.7.2が出ていますが、Microsoftのサポートする古い
    > バージョンを使わなければならないのですか?

    Microsoft は古いバージョンの jQuery しかサポートしてないの
    でしょうか?  1.7.2 も CDN からダウンロードできます。「サポ
    ート」という言葉を別の意味で使っているのでしょうか?

    • 回答としてマーク いちろう 2012年6月15日 5:58
    2012年6月4日 13:10
  • 私の主張は、質問者さんに対しては最初の回答通りです。環境に関しては触れていません。

    SurferOnWwwさんに対しては

    • 理由も述べずに「jQuery を利用すべき」という回答は良くない。最初から理由を併せて述べるべき。
    • jQueryを使ってもコールバックでプリミティブなdocumentオブジェクトが返ってくるので「プリミティブなものを使わず」が実現できていない。単に複雑度が増しただけ。
    • jQueryを使っても「タイプミスとかコールバック関数の設定のミスとかは避けられ」ないことを実証してくれてありがとう。

    くらいです。

    「Microsoftのサポート」という言葉は http://support.microsoft.com/ で問い合わせ可能かどうかという意味で書きました。

    • 回答としてマーク いちろう 2012年6月15日 5:58
    2012年6月5日 0:34
  • 一つだけ教えてください。先の私のレスに書いた、

    > 結局、今回の質問者さんのケースでは、佐祐理さんはどうされる
    > のでしょう? 

    > 今までの話からは「jQuery は自分の好みに合わないから使わない、
    > XMLHttpRequest を使うか、他のライブラリを使う」ということと
    > 思えますが、違うでしょうか。

    という理解は合っているでしょうか? 違っているとしたら、どこが
    どのように違うのでしょうか。

    なお、前から言っていますように、趣味とか勉強のためという環境は
    除きます。

    • 回答としてマーク いちろう 2012年6月15日 5:58
    2012年6月5日 12:46
  • すいません。返信が遅くなってしまいました。
    タイプミスを修正し、xmlObj.onreadystatechande=callback(){....}

    として動作させました。

    それといろいろとライブラリに関して皆さんの意見、ありがとうございます。
    一応外部のライブラリを使用しないという要求だったので・・・(ソース公開されているといえど)ちょっと荒れてしまったみたいで申し訳ないです

    • 回答としてマーク いちろう 2012年6月15日 5:56
    2012年6月15日 5:56

すべての返信

  • xmlObj.onreadystatechande = callback(xmlObj);
    callback()という名前の関数を呼び出し、その戻り値をonreadystatechandeイベントハンドラに登録。typoもありますし、本来callback関数そのものをイベントハンドラに登録すべきでは?
    • 回答としてマーク いちろう 2012年6月15日 5:56
    2012年5月31日 7:06
  • うまくいかない原因は佐祐理さんが言われるとおりだと思いますが・・・

    勉強のためと言うことなら別ですが、今は XMLHttpRequest などという
    プリミティブなものは使わず、jQuery を利用すべきだと思います。

    jQuery.ajax()
    http://api.jquery.com/jQuery.ajax/

    呼び出す相手も、aspx ページではなく、Web サービスのメソッドを呼び
    出すのがよいと思います。

    その例は、以下のページが参考になりませんか。

    jQuery AJAX と Web サービス
    http://surferonwww.info/BlogEngine/post/2011/06/04/jQuery-AJAX-and-Web-Service.aspx

    • 回答としてマーク いちろう 2012年6月15日 5:57
    2012年5月31日 13:29
  • 勉強のためと言うことなら別ですが、今は XMLHttpRequest などという
    プリミティブなものは使わず、jQuery を利用すべきだと思います。

    なぜ、プリミティブなものを使わず、jQueryを利用すべきと提案するのでしょうか?
    この質問に対する一般的な答えは「ライブラリーにブラウザー間の差異を吸収してもらうため」だと思います。その観点で今回のXMLHttpRequestはどうでしょうか。IE7以降、およびその他のブラウザーに共通して導入されています。つまり、IE6以前に対応する必要がなければ、プリミティブなXMLHttpRequestを使用しても構わないのではないか、と私は考えます。

    結局、ライブラリーを使う使わない、ライブラリーの中でもjQueryを選択するしないは質問者さんの自由かと。

    2012年6月1日 1:23
  • > なぜ、プリミティブなものを使わず、jQueryを利用すべきと提案する
    > のでしょうか? この質問に対する一般的な答えは「ライブラリーに
    > ブラウザー間の差異を吸収してもらうため」だと思います。

    生産性と保守性を考えてのことです。「ブラウザー間の差異を吸収」ほ
    その一部に過ぎません。

    自分が客なら、XMLHttpRequest を使ったプリミティブなコードで書かれ
    たアプリを納品されるのはイヤですね。jQuery を使ってほしいです。


    > 結局、ライブラリーを使う使わない、ライブラリーの中でもjQueryを
    > 選択するしないは質問者さんの自由かと。

    それは、趣味とか勉強のために XMLHttpRequest を使って書いてみたい
    という場合に限られる話だと思います。

    仕事で Web アプリを開発しているというような場合は違うのではない
    でしょうか。

    また、jQuery はデファクトスタンダードで、実質的に他に選択の余地
    はないと思っています。

    • 回答としてマーク いちろう 2012年6月15日 5:57
    2012年6月1日 12:17
  • # どう返すか悩んでました。

    このフォーラムは個人的な好みを他人に強要する場ではないと思います。(最初、理由も挙げずに「jQueryを利用すべき」と断言したり、「自分が客なら~イヤですね」とか。)
    たとえば、

    プリミティブなものを使わず、jQueryなどのライブラリーを推奨します。jQueryであればVisual Studio 2010にはバージョン1.4.1が付属し、Microsoftによるサポートも得られます。

    みたいな書き方であれば反論しなかったかなと思います。

    以下は、SurferOnWwwさんの個人的な好みに対する返信であり、余談です。
    jQueryがデファクトスタンダードなのはわかりますが、個人的には好きではありません。ちょっと前に流行っていたprototype.jsと同じ印象を持っています。シェアの割には詰めが甘かったり、バージョン間の非互換があったり、プラグイン間で競合したり…。
    jQueryで書こうとすると他にも問題が山積みです。一番気になっているのは、何か操作しようとしてもモデルが分離できずにタグ操作に終始することです。そう、SuferOnWwwさんの言われるプリミティブなコードと何ら変わらない点です。jQueryって生産性や保守性の高いコードが書けるのでしょうか…?

    • 回答としてマーク いちろう 2012年6月15日 5:57
    2012年6月2日 15:30
  • > このフォーラムは個人的な好みを他人に強要する場ではないと思います。

    強要ではなくて、意見を述べたつもりです。でも、そんなことは重要なこと
    ではなくて、自分の論点でもありません。

    XMLHttpRequest を使ったプリミティブなコードを書くのと、jQuery を使う
    のとでは、生産性と保守性を考えたらどちらを選ぶべきか、どちらもダメな
    ら他に選択肢はあるかが論点だと思っています。

    で、自分の意見は、jQuery を使うべきで、他に選択肢なはいと言っています。

    少なくとも今回のケースでは、以下のオリジナルのコード、

    function btnSend_onclick() {
        var xmlObj = new XMLHttpRequest();
        xmlObj.onreadystatechande = callback(xmlObj);
        xmlObj.open("POST", "responseAct.aspx", true);
        xmlObj.setRequestHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
        xmlObj.send("aaa=data1&bbb=data2");
    }
    
    function callback(xmlObj) {
       if (xmlObj.readyState == 4 ){
           alert(xmlObj.responseText);
    }

    が、jQuery を使えば、以下のように書けるわけで、タイプミスとかコールバ
    ック関数の設定のミスとかは避けられたのではないでしょうか?

    function btnSend_onclick() {
        $.post("responseAct.aspx",
            { aaa: 'data1', bbb: 'data2' },
            function (data) {
                alert(data.xml);
            });
    }

    > SurferOnWwwさんの個人的な好みに対する返信であり、余談です。

    好みの問題ではないと思います。

    Microsoft が AJAX クライアントライブラリの開発を打ち切って、jQuery を
    サポートしているという状況で、好みの問題で jQuery を使わないというのは
    説得力がないと思います。

    #趣味とか勉強のために XMLHttpRequest を使って書いてみたいという場合は、
     話が別というのは先に申し上げたとおりです。


    2012年6月3日 8:35
  • 「alert(data.xml);」と書かれていますが、jQueryではxmlプロパティがXMLHttpRequestのresponseTextプロパティに相当するのでしょうか? jQuery.postやjQuery.ajaxのドキュメントを参照しましたが、第一引数dataの説明が

    The data returned from the server, formatted according to the dataType parameter

    としかなく、何が返ってくるのかわかりませんでした。dataTypeを省略しているのでContent-Type: text/xmlから判断されてXMLDocumentが返されるのでしょうか? ということはXMLDocumentのxmlプロパティということになるのでしょうか…??

    結局、jQueryを使うと本当に「タイプミスとかコールバック関数の設定のミスとかは避けられ」るのでしょうか?

    それと挙げられた例は他のライブラリを使っても同じことが書けるわけで、jQuery以外に選択肢がないというのもわかりませんでした。
    Microsoftがサポートしているからというのが理由なら、理由を先に述べるべき、と私は書いています。
    そうだとしてもサポート外のライブラリーを使うべきではない理由にはならないでしょう。jQUeryは1.7.2が出ていますが、Microsoftのサポートする古いバージョンを使わなければならないのですか?

    • 回答としてマーク いちろう 2012年6月15日 5:58
    2012年6月4日 0:44
  • レスの内容(反論の論点)がよく分かりません。

    結局、今回の質問者さんのケースでは、佐祐理さんはどうされる
    のでしょう? 

    今までの話からは「jQuery は自分の好みに合わないから使わない、
    XMLHttpRequest を使うか、他のライブラリを使う」ということと
    思えますが、違うでしょうか。

    > それと挙げられた例は他のライブラリを使っても同じことが書
    > けるわけで、jQuery以外に選択肢がないというのもわかりませ
    > んでした。
     
    他のライブラリとは何でしょう? 「同じことが書ける」程度で
    あれば、そのライブラリを選択するメリットはなさそうです。

    そこに個人的な好みが入り込む余地はなくて、実質的に jQuery
    以外の選択肢はないと思います。(趣味とか勉強なら話は別)

    > jQUeryは1.7.2が出ていますが、Microsoftのサポートする古い
    > バージョンを使わなければならないのですか?

    Microsoft は古いバージョンの jQuery しかサポートしてないの
    でしょうか?  1.7.2 も CDN からダウンロードできます。「サポ
    ート」という言葉を別の意味で使っているのでしょうか?

    • 回答としてマーク いちろう 2012年6月15日 5:58
    2012年6月4日 13:10
  • 私の主張は、質問者さんに対しては最初の回答通りです。環境に関しては触れていません。

    SurferOnWwwさんに対しては

    • 理由も述べずに「jQuery を利用すべき」という回答は良くない。最初から理由を併せて述べるべき。
    • jQueryを使ってもコールバックでプリミティブなdocumentオブジェクトが返ってくるので「プリミティブなものを使わず」が実現できていない。単に複雑度が増しただけ。
    • jQueryを使っても「タイプミスとかコールバック関数の設定のミスとかは避けられ」ないことを実証してくれてありがとう。

    くらいです。

    「Microsoftのサポート」という言葉は http://support.microsoft.com/ で問い合わせ可能かどうかという意味で書きました。

    • 回答としてマーク いちろう 2012年6月15日 5:58
    2012年6月5日 0:34
  • 一つだけ教えてください。先の私のレスに書いた、

    > 結局、今回の質問者さんのケースでは、佐祐理さんはどうされる
    > のでしょう? 

    > 今までの話からは「jQuery は自分の好みに合わないから使わない、
    > XMLHttpRequest を使うか、他のライブラリを使う」ということと
    > 思えますが、違うでしょうか。

    という理解は合っているでしょうか? 違っているとしたら、どこが
    どのように違うのでしょうか。

    なお、前から言っていますように、趣味とか勉強のためという環境は
    除きます。

    • 回答としてマーク いちろう 2012年6月15日 5:58
    2012年6月5日 12:46
  • すいません。返信が遅くなってしまいました。
    タイプミスを修正し、xmlObj.onreadystatechande=callback(){....}

    として動作させました。

    それといろいろとライブラリに関して皆さんの意見、ありがとうございます。
    一応外部のライブラリを使用しないという要求だったので・・・(ソース公開されているといえど)ちょっと荒れてしまったみたいで申し訳ないです

    • 回答としてマーク いちろう 2012年6月15日 5:56
    2012年6月15日 5:56