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 是否被中止。


我有什么方法可以将隐式参数和显式参数分开,还是不可行?我应该打扰吗?也许得到的哲学就是扔掉不需要的东西。

谢谢!

4

2 回答 2

1

您的 Dictionary 应该有一个字符串键,您的代码在键周围没有“”:

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集合而不是Params. Params包括在请求中传递的所有数据,这意味着 cookie、表单 POST 数据、查询字符串参数和服务器变量。

看起来您也在检查 cookie,因此您要么需要通过该集合进行单独检查,要么使用以下内容合并两者:

        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)可能是最简单的。

编辑 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 回答