ASP.NET HTTP Get URLフォーマットを実施する方法は?
-
28-09-2019 - |
質問
厄介な質問について申し訳ありません。私は.NET 2.0をターゲットにしていると思います(今のところ)
こんにちは、私はasp.net noobです。手始めに、URL文字列を解析し、データベース内のテーブルに入力するページを作成しています。私はその文字列を厳密にフォームにしたい:
http://<server>:<port>/PageName.aspx?A=1&B=2&C=3&D=4&E=5
議論の順序は重要ではありません。私はそれらのいずれかが欠落していないだけではありません。これが私が試したものです(はい、それは醜いです。私はそれを最初に動作させたいだけです):
#if (DEBUG)
// Maps parameter names to their human readable names.
// Used for error checking.
private static Dictionary<string, string> paramNameToDisplayName = new Dictionary<string, string> {
{ "A", "a"},
{ "B", "b"},
{ "C", "c"},
{ "D", "d"},
{ "E", "e"},
{ "F", "f"},
};
[Conditional("DEBUG")]
private void validateRequestParameters(HttpRequest request)
{
bool endResponse = false;
// Use foreach var
foreach (string expectedParameterName in paramNameToDisplayName.Keys)
{
if (request[expectedParameterName] == null)
{
Response.Write(String.Format("No parameter \"{0}\", aka {1} was passed to the configuration generator. Check your URL string / cookie.",
expectedParameterName, paramNameToDisplayName[expectedParameterName]));
endResponse = true;
}
}
// Use foreach var
foreach (string actualParameterName in request.Params)
{
if (!paramNameToDisplayName.ContainsKey(actualParameterName))
{
Response.Write(String.Format("The parameter \"{0}\", was passed to the configuration generator, but it was not expected. Check your URL string / cookie.",
actualParameterName));
endResponse = true;
}
}
if (endResponse)
{
Response.End();
}
}
#endif
そして、それは他のあらゆる種類のものについて不平を言っていることを除いて、大丈夫です:
http:// localhost:1796/addstatusupdate.aspx?x = 0
パラメーター「A」はありません。別名Aは構成ジェネレーターに渡されました。 URL文字列 / Cookie.Noパラメーター「B」を確認してください。別名Bは構成ジェネレーターに渡されました。 URL文字列 / Cookie.Noパラメーター「C」を確認してください。別名Cは構成ジェネレーターに渡されました。 URL文字列 / Cookie.Noパラメーター「D」を確認してください。別名Dは構成ジェネレーターに渡されました。 url string / cookie.noパラメーター「e」を確認してください。別名Eは構成ジェネレーターに渡されました。 url string / cookie.noパラメーター "f"を確認してください。別名fは構成ジェネレーターに渡されました。 URL文字列 / Cookieを確認します。パラメーター「x」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「ASP.NET_SESSIONID」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「All_http」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「All_raw」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Appl_md_path」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Appl_Physical_Path」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「auth_type」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「auth_user」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「auth_password」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「logon_user」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「Remote_User」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「CERT_COOKIE」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「CERT_FLAGS」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「CERT_ISSUER」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「CERT_KEYSIZE」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「CERT_SECRETKEYSIZE」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「CERT_SERIALNUMBER」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「CERT_SERVER_ISSUER」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「CERT_SERVER_SUBJECT」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「CERT_SUBJECT」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「content_length」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「content_type」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Gateway_interface」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「HTTPS」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「https_keysize」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「https_secretkeysize」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「https_server_issuer」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「https_server_subject」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Instance_ID」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「instance_meta_path」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「local_addr」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Path_Info」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Path_Translated」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「query_string」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「Remote_Addr」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Remote_Host」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「Remote_Port」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「request_method」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Script_Name」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Server_Name」が構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「Server_Port」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Server_Port_Secure」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Server_Protocol」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「Server_Software」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認します。パラメーター「URL」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「http_cache_control」が構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「http_connection」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「http_accept」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「http_accept_charset」が構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「http_accept_encoding」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「http_accept_language」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「http_cookie」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「http_host」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。パラメーター「http_user_agent」は、構成ジェネレーターに渡されましたが、予想されませんでした。 URL文字列 / Cookieを確認してください。Threadは中止されていました。
暗黙的なパラメーターと明示的なパラメーターを分離する方法はありますか、それとも実行できませんか?私も気にするべきですか?おそらく、GETの哲学は、必要ではないものを捨てることです。
ありがとう!
解決
辞書には文字列キーが必要です。コードはキーの周りに「」を持っていません。
private static Dictionary<string, string> paramNameToDisplayName = new Dictionary<string, string> {
{ "A", "a"},
{ "B", "b"},
{ "C", "c"},
{ "D", "d"},
{ "E", "e"},
{ "F", "f"},
};
残りのエラーについては、これを使用してみてください。コードは、QueryString Params(Request.QueryString.Allkeys)だけでなく、投稿されたすべてのパラメーションを探していました。
if (!request.QueryString.AllKeys.Contains<string>(expectedParameterName))
{
Response.Write(String.Format("No parameter \"{0}\", aka {1} was passed to the configuration generator. Check your URL string / cookie.", expectedParameterName, paramNameToDisplayName[expectedParameterName]));
endResponse = true;
}
他のヒント
Drousseauが言及しているように、あなたはそれを使用する必要があります QueryString
の代わりにコレクション Params
. Params
リクエストに合わせて渡されたすべてのデータが含まれています。これは、Cookie、フォームポストデータ、クエリストリングパラメーター、サーバーバリエブルを意味します。
クッキーもチェックしているように見えるので、そのコレクションを通じて個別のチェックを行う必要があるか、次のようなものを使用して2つをマージする必要があります。
var both = (
from key in Request.QueryString.AllKeys
select new { Key = key, Value = Request.QueryString[key] }).Union(
from key in Request.Cookies.AllKeys
select new { Key = key, Value = Request.Cookies[key].Value }).ToDictionary(entry => entry.Key, entry => entry.Value);
また、ASP.NETセッションの状態によってCookieをドロップしてもらうつもりであることも注目に値します。 「ASP.NET_SESSIONID」という名前のCookieを明示的に無視することで、その周りのコーディング(最も簡単な)、またはWeb.Configのセッション状態をオフにするだけで、クッキーをクリアする必要があります。
編集: 2.0をターゲットにすることについて少し見ました。つまり、素敵な小さなLinqステートメントは問題外です。おそらく、それぞれのコレクション(クエリストリングとCookie)を個別にチェックするのが最も簡単でしょう。
パートdeuxの編集:これは、単一のルックアップを使用するための非LINQの代替手段です。
NameValueCollection both = new NameValueCollection(Request.QueryString);
foreach (String key in Request.Cookies.AllKeys)
{
if (key != "ASP.NET_SessionId") both.Add(key, Request.Cookies[key].Value);
}
そのようなハードコーディングされた文字列を使用するのは醜いですが、ちょっと、それは機能するはずです。
また、ASP.NET MVCまたはSystem.Web.Routing(残念ながら.NET 3.5が必要)を使用した場合、ルーティングフレームワークはこれを行う必要がないことを指摘したいと思います。それはあなたのためにすべてですか?そして、あなたは起動するために入力されたパラメーターを取得するでしょう!