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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

IIS

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

ASP.NET

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

Q&A

解決済

3回答

11720閲覧

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

shun1

総合スコア7

C#

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

IIS

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

ASP.NET

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

0グッド

1クリップ

投稿2017/10/31 07:32

編集2017/11/01 05:41

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

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 09:33

編集2017/11/01 07:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shun1

2017/10/31 10: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 13:14

Server.Transfer() の件は関係なさそうなので忘れます。「全体のシナリオ」のシングルサインオンがそれで可能なのかも疑問ですが、POST したデータを受け取れないという今回の問題とは関係なさそうなのでちょっと置いといて・・・ かなり簡略化しましたが質問者さんと同等のコードで検証してみました。結果、期待通り POST され、受け側も POST と判断できてフォームデータを取得できました。 質問者さんのやり方がどこか間違っているような気がします。
shun1

2017/10/31 15:51

お忙しいところ、検証していただき本当に感謝です、 > 「全体のシナリオ」のシングルサインオンがそれで可能なのかも疑問ですが、POST したデータを受け取れないという今回の問題とは関係なさそうなのでちょっと置いといて・・・ 確かに、凄く微妙で恥ずかしい仕様ですが、イントラネットですし、今回の問題とは関係ないので置いといてくださるとうれしいです。すみません。 > かなり簡略化しましたが質問者さんと同等のコードで検証してみました。結果、期待通り POST され、受け側も POST と判断できてフォームデータを取得できました。 検証いただきありがとございました。やはりコード自体が問題というよりは、環境や設定などの問題なのでしょうか?? 因みに、私はVisualStudio2015、.net FrameWork 4.5.2 でソリューションを作成しました。web.configもデフォルトからあまり変更していません。 web.configで追加・削除・変更などはされているでしょうか?FORMでPOST送信したものが、GETに変更される原因が分からず困っております。
退会済みユーザー

退会済みユーザー

2017/11/01 01:45

ここに書いてあること以外知り得ない自分には、質問者さんの環境やデフォルトからどう変更したかなどは分かりません。 たぶん、何が原因かは全く同じ環境・設定で追及しないと分からないと思います。なので、質問者さんに切り分して調べてもらうほかないと思います。 切り分けの方法で自分が一番有効だと思うのは、問題を再現するのに必要最低限のところまで今のコードをどんどん削っていくことです。(もちろんフォームデータを POST するという目的の機能は残しておいて) その際、デバッガや Fiddler などのキャプチャツールを使って、どう動いているか確認・理解するというのも有効だと思います。 その前に、問題のプロジェクトとは別に新規プロジェクトを作って、フォームデータを POST するという基本的な機能だけ実装して試してみた方が良いかもしれません。もし、問題のプロジェクトを質問者さんがデフォルトから変えているとすると、その影響もあるかもしれないので。 ご参考に、回答欄に自分がどのように検証したかを書いておきます。(今時間がないので少し後になりそうですが)
shun1

2017/11/01 05: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 07:06

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

2017/11/01 08:45

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

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 06:17

shun1

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/01 07:53 編集

それは 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 08:18

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

0

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

投稿2017/10/31 08:20

ShikaTech

総合スコア468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shun1

2017/11/01 00:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問