質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • C#

    6575questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET

    483questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

  • IIS

    180questions

    IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

ASP.NET WebフォームにPOSTできない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 923

shun1

score 1

ASP.NET WebフォームにPOSTしているはずなのに、そのWebフォームのPage_LoadメソッドではRequest.HttpMethodがGETになります。
Web.config 等の設定も関係しているでしょうか?
POST元のソースは下記の通りです

該当のソースコード

遷移元
CS.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CS.aspx.cs" Inherits="_Default" %>

<!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>
        <table border="0" cellpadding="0" cellspacing="0">
            <tr>
                <td>
                    First Name:
                </td>
                <td>
                    <asp:TextBox ID="txtFirstName" runat="server" />
                </td>
            </tr>
            <tr>
                <td>
                    Last Name:
                </td>
                <td>
                    <asp:TextBox ID="txtLastName" runat="server" />
                </td>
            </tr>
            <tr>
                <td>
                </td>
                <td>
                    <asp:Button ID="btnPost" runat="server" Text="ポスト" OnClick="PostData" />
                </td>
            </tr>
        </table>
    </div>
    </form>
</body>
</html>


CS.aspx.cs

    protected void PostData(object sender, EventArgs e)
    {
        NameValueCollection collections = new NameValueCollection();
        collections.Add("FirstName", txtFirstName.Text.Trim());
        collections.Add("LastName", txtLastName.Text.Trim());
        string remoteUrl = "http://localhost:58441/Page2_CS.aspx";

        string html = "<html><head>";
        html += "</head><body onload='document.forms[0].submit()'>";
        html += string.Format("<form name='PostForm' method='POST' action='{0}'>", remoteUrl);
        foreach (string key in collections.Keys)
        {
            html += string.Format("<input name='{0}' type='text' value='{1}'>", key, collections[key]);
        }
        html += "</form></body></html>";
        Response.Clear();
        Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1");
        Response.HeaderEncoding = Encoding.GetEncoding("ISO-8859-1");
        Response.Charset = "ISO-8859-1";
        Response.Write(html);
        Response.End();
    }


POST先(=http://localhost:58441/Page2_CS.aspx)のコードは下記の通りです。
page2_CS.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Page2_CS.aspx.cs" Inherits="Page2" %>

<!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">
    <table border="0" cellpadding="0" cellspacing="0">
        <tr>
            <td>
                FirstName:
            </td>
            <td>
                <asp:Label ID="lblFirstName" runat="server" />
            </td>
        </tr>
        <tr>
            <td>
                LastName:
            </td>
            <td>
                <asp:Label ID="lblLastName" runat="server" />
            </td>
        </tr>
    </table>
    </form>
</body>
</html>


page2_CS.aspx.cs

public partial class Page2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.HttpMethod == "GET")
        {
            // The action is a GET.
        }

        if (Request.Form.Count > 0)
        {
            lblFirstName.Text = Request.Form["FirstName"];
            lblLastName.Text = Request.Form["LastName"];
        }
    }
}


Request.Form["FirstName"]の値を取得したいと思っています。

試したこと

Server.Transfer()ではRequest.HttpMethod = "POST"で遷移できています。
ただ、別サーバ間でPOSTでデータの受け渡しをする必要があるので、
Server.Transfer()以外の方法で試しています。

補足情報(言語/FW/ツール等のバージョンなど)

ASP.net 4.5 .net FrameWork 4.5.2

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

コメント欄には書ききれないので回答欄に書きます。

CS.aspx と page2_CS.aspx は別サイトまたは別アプリケーションに存在するのですか?

で、CS.aspx が表示されたブラウザから、その画面にユーザーが入力した文字列を、別サイトまたは別アプリにある page2_CS.aspx に POST したいと言ってますか?

そうすると、CS.aspx.cs のコードはその目的にどういう意味を持っているのですか? PostData メソッドで組み立てた html ソースをブラウザに返しているだけのように見えますが。

Server.Transfer()ではRequest.HttpMethod = "POST"で遷移できています。

とのことですが、どう言うことですか? Server.Transfer というのはアップされたコードには見当たりませんが?

失礼ながら、見当違いのことをされているような気がします。

局所的な質問だけでなく、全体のシナリオを含めて何がしたいのかを書いていただけませんか。そうすれば、局所的な質問の部分は実現が無理でも、「それはできないけど、やりたいことはこうすれば実現できる」というような代案も出てくるかもしれません。

全体的なやりたいことやストーリーのごく一部を切り出して質問すると、もしその質問が全体的なやりたいことを実現するのには見当違いだった場合、回答も当然やりたいことを実現するには的外れになってしまいます。そうすると、見当違いと的外れのやり取りが繰り返されるだけになって、なかなか解決にたどり着けません。時間の無駄でもありますし。

【2017/11/1 追記】

2017/11/01 10:45 の私のコメントで「ご参考に、回答欄に自分がどのように検証したかを書いておきます」と書きましたが、それを以下に書きます。

質問者さんの考えた基本的な方法で POST 送信はできるという最低限のことを確認できるだけですが、「できる」ということは分かるはずです。

まず環境ですが、Windows 10 Pro. 64-bit, IIS10, VS2010 Pro., VS2015 Community, IE11 です。

Visual Studio のテンプレートで作った ASP.NET Web Forms の Web サイトプロジェクト 2 つを IIS 上で動くように設定し、一方のサイト名(ホスト名)を aspnet4site、他方を websiteproject.com としています。

以下、手順を書きます。試してみる場合は、下に書いたように、一気にやらないで、ステップバイステップで実装し、それを実行して確認しながら進めることをお勧めします。

(1) aspnet4site サイトの Default.aspx にラベル UserNameLabel を追加、Default.aspx.cs の Page_Load に以下の 2 行を追加。エラーなく動くことは確認しておく。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.Configuration;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string method = Request.HttpMethod;
        UserNameLabel.Text = Label1.Text = Request.Form["Username"];

    // ・・・以下略・・・

(2) websiteproject.com サイトに以下の内容の HtmlPage.html を追加。

実行して[submit]ボタンをクリックすると上記 (1) の Default.aspx が表示され、UserNameLabel に "POST 送信した文字列" と表示されることを確認。

<html>
    <head>
        <title></title>
    </head>
    <body>
        <form method="post" action="http://aspnet4site/Default.aspx">
            <input id="Username" name="Username" type="text" value="POST 送信した文字列"/>
            <input id="Submit1" type="submit" value="submit" />
        </form>
    </body>
</html>

(3) websiteproject.com サイトの Default.aspx に Button を追加。Button.Click イベントのハンドラで (2) の html コードをそのまま送信できるようにする。

Default.aspx のボタンクリックで (2) の HtmlPage.html と同じ画面が表示され、HtmlPage.html の[button]クリックで上記 (1) の Default.aspx が表示され、UserNameLabel に "POST 送信した文字列" と表示されることを確認。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        string html = @"<html>
    <head>
        <title></title>
    </head>
    <body>
        <form method = ""post"" action = ""http://aspnet4site/Default.aspx"" >
            <input id = ""Username"" name = ""Username"" type = ""text"" value = ""POST 送信した文字列"" />
            <input id = ""Submit1"" type = ""submit"" value = ""submit"" />
        </form>
    </body>
</html> ";

        Response.Write(html);
        Response.End();
    }
}

(4) 上記 (3) の html コードの body 要素に onload='document.forms[0].submit()' を追加。Default.aspx のボタンクリックで上記 (1) の Default.aspx が表示され、UserNameLabel に "POST 送信した文字列" と表示されることを確認。

その際、Fiddler や Visual Studio のデバッガで動作を確認すると以下のようになります。(権限の問題か自分はここには画像は貼れないので、自分の使っているレンタルサーバーに画像をアップし、それへのリンクを張りました)

(a) websiteproject.com サイトの Default.aspx のボタンクリックの際の要求と応答。

http://surferonwww.info/BlogEngine/image.axd?picture=2017%2f11%2ffiddler1.jpg

(b) 上記 (a) の html コードにより http://aspnet4site/Default.aspx に post 要求がかかる。

http://surferonwww.info/BlogEngine/image.axd?picture=2017%2f11%2ffiddler2.jpg

(c) デバッガで aspnet4site サイトの Default.aspx.cs を見て post 要求となっていることを確認。

http://surferonwww.info/BlogEngine/image.axd?picture=2017%2f11%2fpost.jpg

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/31 19:30

    コメントがわかりづらくて済みません。

    > CS.aspx と page2_CS.aspx は別サイトまたは別アプリケーションに存在するのですか?
    CS.aspx と page2_CS.aspx は別アプリケーションとなります。
    PostData メソッドで組み立てた html ソースを別アプリケーションのURL"http://localhost:58441/Page2_CS.aspx"へ画面遷移しています。

    > Server.Transfer()ではRequest.HttpMethod = "POST"で遷移できています。
    > とのことですが、どう言うことですか? Server.Transfer というのはアップされたコードには見当たりませんが?
    アップされたコードに"Server.Transfer"を記載していませんが、page2_CS.aspxと同一アプリ内に、別aspxページで試したとき、page2_CS.aspxへ"POST"で遷移できていたため、補足情報で記載しました。
     ※別アプリケーション間でPOSTにてパラメータ渡しをする必要があるため、Server.Transferでの遷移は使用しない考えです。

    ■全体のシナリオ
    ポータルサイトA と 業務サイトBをシングルサインオンで連携する社内サイトを構築するために、検証作業をしていました。
    ポータルサイトAからは①[UserID]と②[認証用の値]をパラメータとし、業務サイトBのURLへPOST形式でリダイレクトされます。

    上記シナリオの検証しており、CS.aspxのコードを記述しましたが、実行するとRequest.HttpMethod = "GET"にて遷移している状況となっております。

    よろしくお願いいたします。

    キャンセル

  • 2017/10/31 22:14

    Server.Transfer() の件は関係なさそうなので忘れます。「全体のシナリオ」のシングルサインオンがそれで可能なのかも疑問ですが、POST したデータを受け取れないという今回の問題とは関係なさそうなのでちょっと置いといて・・・

    かなり簡略化しましたが質問者さんと同等のコードで検証してみました。結果、期待通り POST され、受け側も POST と判断できてフォームデータを取得できました。

    質問者さんのやり方がどこか間違っているような気がします。

    キャンセル

  • 2017/11/01 00:51

    お忙しいところ、検証していただき本当に感謝です、
    > 「全体のシナリオ」のシングルサインオンがそれで可能なのかも疑問ですが、POST したデータを受け取れないという今回の問題とは関係なさそうなのでちょっと置いといて・・・
    確かに、凄く微妙で恥ずかしい仕様ですが、イントラネットですし、今回の問題とは関係ないので置いといてくださるとうれしいです。すみません。

    > かなり簡略化しましたが質問者さんと同等のコードで検証してみました。結果、期待通り POST され、受け側も POST と判断できてフォームデータを取得できました。
    検証いただきありがとございました。やはりコード自体が問題というよりは、環境や設定などの問題なのでしょうか??
    因みに、私はVisualStudio2015、.net FrameWork 4.5.2 でソリューションを作成しました。web.configもデフォルトからあまり変更していません。
    web.configで追加・削除・変更などはされているでしょうか?FORMでPOST送信したものが、GETに変更される原因が分からず困っております。

    キャンセル

  • 2017/11/01 10:45

    ここに書いてあること以外知り得ない自分には、質問者さんの環境やデフォルトからどう変更したかなどは分かりません。

    たぶん、何が原因かは全く同じ環境・設定で追及しないと分からないと思います。なので、質問者さんに切り分して調べてもらうほかないと思います。

    切り分けの方法で自分が一番有効だと思うのは、問題を再現するのに必要最低限のところまで今のコードをどんどん削っていくことです。(もちろんフォームデータを POST するという目的の機能は残しておいて)

    その際、デバッガや Fiddler などのキャプチャツールを使って、どう動いているか確認・理解するというのも有効だと思います。

    その前に、問題のプロジェクトとは別に新規プロジェクトを作って、フォームデータを POST するという基本的な機能だけ実装して試してみた方が良いかもしれません。もし、問題のプロジェクトを質問者さんがデフォルトから変えているとすると、その影響もあるかもしれないので。

    ご参考に、回答欄に自分がどのように検証したかを書いておきます。(今時間がないので少し後になりそうですが)

    キャンセル

  • 2017/11/01 14:40

    【2017/11/01 14:30 追記】
    2017/11/01 10:45 のコメントと検証内容を教えていただきありがとうございました。
    凄く丁寧に教えいていただき恐縮です。
    早速、別途新規にプロジェクトを作成して試してみました。
    Visual Studio テンプレート[ASP.NET空のWebサイト]にてASP.NET Web Forms の Web サイトプロジェクト 2 つを IIS 上で動くように設定したところ、問題なく[POST]できました。
    それで、問題の発生しているソリューションと比較しました。
    大きな違いは、Visual Studio テンプレート[ASP.NETWebフォームサイト]を使用しているところです。
    Fiddrerで確認しましたが、シナリオで述べたポータルサイトAからはPOSTされているのを確認できましたが、
    業務サイトA[http://localhost:58441/Page2_CS.aspx]にリダイレクトされ、[Page_Load(object sender, EventArgs e)]
    でリクエストを確認するとRequest.HttpMethodに[GET]が設定されてパラメータが削除されている状況であることが分かりました。
    Page_Loadが呼ばれる前に、どこかでPOSTをGETに変換しているのかな。というところまで検証できました。
    Web.configも下記内容まで減らしましたが、上記テンプレートで作成したサイトでは、なぜか[GET]に変換されてしまうようです。
    Web.config
    ```
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <system.web>
    <authentication mode="Windows"/>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
    </system.web>
    </configuration>
    ```

    キャンセル

  • 2017/11/01 16:06

    > 業務サイトA[http://localhost:58441/Page2_CS.aspx]にリダイレクトされ

    上で言う「リダイレクト」というのがいわゆるリダイレクトで、HTTP 301 または 302 応答が返ってきてブラウザがその応答ヘッダの Location に指定されている URL を GET 要求に行ってるとすると、そこが原因ではないのでしょうか? Fiddler で調べてみてください。

    キャンセル

  • 2017/11/01 17:45

    解説ありがとうございます。
    なるほど。そのような仕組みで入れ替わっていたのですね。
    確かに、urlをPage2_CS.aspx ⇒ Page2_CS にすれば内部でリダイレクト処理されませんでした。

    参考になるサイトがなく、一人でハマっていたので助かりました!

    キャンセル

0

別サーバとは、別アプリケーションのことですよね?
であれば普通HttpClient等を使うのですが、そーゆーことではなく?
なんかそもそも考えられないユースケースで実装しようとしておられる気がします。。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/01 09:04

    はい。別アプリケーションになります。
    SurferOnWwwさんがコードを検証していただき、POSTできたようです。
    コード以外のWeb.config等の設定やIISなどの環境などが原因となるのでしょうか?

    キャンセル

0

SurferOnWwwさん、検証作業をしてくださりありがとうございました。
おかげさまで、POSTでリダイレクトしているのに、Request.HttpMethodがGET
となる原因が分かりました。
テンプレート[ASP.NETWebフォームサイト]でプロジェクトを生成すると、
自動的にGlobal.asaxで•URL ルーティング設定をするRouteConfigが呼ばれており、
それが原因でPOSTがGETに入れ替わっていたようです。
ルーティング設定を削除しましたら、無事POST形式で取得できるようになりました。

[Global.asax]

<%@ Import Namespace="System.Web.Routing" %>
<script runat="server">
    void Application_Start(object sender, EventArgs e)
    {
    //↓↓↓  下の処理でPOSTをGETに入れ替えていたようです.  ↓↓
        //この行をコメントアウトすることで解決しました。
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
</script>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/01 16:49 編集

    それは POST を GET に変えるというわけではなく、ユーザーフレンドリーな URL を使えるように(例:default.aspx ではなくて default)するための URL 書き換えの機能です。

    例えば、default.aspx で要求が来ると HTTP 301 応答を返し、その応答ヘッダの Location に default を指定します。

    すなわち、default にリダイレクトされる ⇒ ブラウザは default を GET 要求するということになります。

    ASP.NET 側では default という URL で要求を受けると内部で URL 書き換えが行われて default.aspx が要求されるようになっています。

    その機能を無効にするには質問者さんが行ったようにコメントアウトすればいいのですが、機能を生かしておくのであれば、html の form 要素の action 属性に設定されている url を Page2_CS.aspx ⇒ Page2_CS にすればよさそうです。お試しください。

    キャンセル

  • 2017/11/01 17:18

    実を言うと、自分もこれが原因でハマったことがあったのですが、忘れてました。気が付かなくて、すみません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6575questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET

    483questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

  • IIS

    180questions

    IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。