1

[面倒な質問でごめんなさい。.Net 2.0をターゲットにしていると思います(今のところ)]

こんにちは、私はASP.NETの初心者です。手始めに、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を確認してください。パラメータ「B」はありません。別名bが構成ジェネレータに渡されました。URL文字列/Cookieを確認してください。パラメータ「C」はありません。別名cが構成ジェネレータに渡されました。URL文字列/Cookieを確認してください。パラメータ「D」はありません。別名dが構成ジェネレータに渡されました。URL文字列/Cookieを確認してください。パラメータ「E」はありません。別名eが構成ジェネレータに渡されました。URL文字列/Cookieを確認してください。パラメータ「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が中止されていることを確認してください。構成ジェネレーターに渡されましたが、予期されていませんでした。URL文字列/Cookieを確認してください。パラメータ「HTTP_COOKIE」が設定ジェネレータに渡されましたが、予期されていませんでした。URL文字列/Cookieを確認してください。パラメータ"HTTP_HOST"が構成ジェネレータに渡されましたが、予期されていませんでした。URL文字列/Cookieを確認してください。パラメータ"HTTP_USER_AGENT"が構成ジェネレータに渡されましたが、予期されていませんでした。URL文字列/cookie.Threadが中止されていることを確認してください。構成ジェネレーターに渡されましたが、予期されていませんでした。URL文字列/Cookieを確認してください。パラメータ「HTTP_COOKIE」が設定ジェネレータに渡されましたが、予期されていませんでした。URL文字列/Cookieを確認してください。パラメータ"HTTP_HOST"が構成ジェネレータに渡されましたが、予期されていませんでした。URL文字列/Cookieを確認してください。パラメータ"HTTP_USER_AGENT"が構成ジェネレータに渡されましたが、予期されていませんでした。URL文字列/cookie.Threadが中止されていることを確認してください。URL文字列/Cookieを確認してください。パラメータ"HTTP_USER_AGENT"が構成ジェネレータに渡されましたが、予期されていませんでした。URL文字列/cookie.Threadが中止されていることを確認してください。URL文字列/Cookieを確認してください。パラメータ"HTTP_USER_AGENT"が構成ジェネレータに渡されましたが、予期されていませんでした。URL文字列/cookie.Threadが中止されていることを確認してください。


暗黙的パラメーターと明示的パラメーターを分離する方法はありますか、それとも実行できませんか?わざわざする必要がありますか?おそらく、getの哲学は、不要なものを捨てることです。

ありがとう!

4

2 に答える 2

1

辞書には文字列キーが必要です。コードにはキーの前後に「」がありません。

private static Dictionary<string, string> paramNameToDisplayName = new Dictionary<string, string> {
    { "A", "a"},
    { "B", "b"},
    { "C", "c"},
    { "D", "d"},
    { "E", "e"},
    { "F", "f"},

};

残りのエラーについては、これを使用してみてください。コードは、クエリ文字列パラメータ(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;
                }
于 2010-04-19T22:29:49.150 に答える
1

drousseau が言及しているように、のQueryString代わりにコレクションを使用する必要がありますParamsParamsリクエストで渡されたすべてのデータが含まれます。これは、Cookie、フォーム POST データ、クエリ文字列パラメータ、およびサーバー変数を意味します。

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 でセッション状態をオフにすることができますが、Cookie をクリアする必要があります。

編集: 2.0 をターゲットにすることについて少し見ただけです。つまり、素敵な小さな LINQ ステートメントは問題外です。各コレクション (QueryString と Cookies) を個別にチェックするのがおそらく最も簡単でしょう。

EDIT PART 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 が必要です)、ルーティング フレームワークがあなたのためにすべてを行います-そして、起動するための型付きパラメーターを取得します!

于 2010-04-19T22:41:39.537 に答える