Pergunta

Desculpe por uma pergunta confusa. Eu acredito que estou segmentando .NET 2.0 (por enquanto)

Oi, eu sou um ASP.NET NOOB. Para iniciantes, estou construindo uma página que analisa uma string de URL e preenche uma tabela em um banco de dados. Eu quero que essa string seja estritamente da forma:

http://<server>:<port>/PageName.aspx?A=1&B=2&C=3&D=4&E=5

A ordem dos argumentos não importa, eu simplesmente não quero que nenhum deles esteja faltando, ou quaisquer extras. Aqui está o que eu tentei (sim, é feio; eu só quero fazê -lo funcionar primeiro):

#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

E funciona bem, exceto que reclama de todos os tipos de outras coisas:

http: // localhost: 1796/addstatusupdate.aspx? x = 0


Nenhum parâmetro "A", também conhecido como A foi passado para o gerador de configuração. Verifique seu parâmetro URL String / Cookie.no "B", também conhecido como B foi passado para o gerador de configuração. Verifique seu parâmetro URL String / Cookie.no "C", também conhecido como C foi passado para o gerador de configuração. Verifique seu parâmetro URL String / Cookie.no "D", também conhecido como D foi passado para o gerador de configuração. Verifique seu parâmetro URL String / Cookie.no "E", também conhecido como E foi passado para o gerador de configuração. Verifique seu parâmetro URL String / Cookie.no "F", também conhecido como F foi passado para o gerador de configuração. Verifique sua string / cookie URL.O parâmetro "X", foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie URL.O parâmetro "asp.net_sessionId", foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie URL.O parâmetro "all_http" foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie URL.O parâmetro "All_raw", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie.O parâmetro "APPL_MD_PATH", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "APPL_PHYSICAL_PATH", foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie URL.O parâmetro "auth_type", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "auth_user", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Auth_Password", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "LOGON_USER", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Remote_User", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Cert_cookie", foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie URL.O parâmetro "Cert_flags", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Cert_issuer", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Cert_Keysize" foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Cert_Secretkeysize" foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Cert_SerialNumber", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Cert_server_issuer", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "cert_server_subject" foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Cert_subject", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Content_Length", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Content_Type", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Gateway_Interface", foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie URL.O parâmetro "https", foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie URL.O parâmetro "https_keysize" foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "https_secretkeysize" foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "HTTPS_SERVER_ISSUER", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "https_server_subject", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Instância_id", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie.O parâmetro "Instância_Meta_Path", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Local_addr", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "PATH_INFO", foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie URL.O parâmetro "PATH_TRANSLATED" foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Query_string", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Remote_ADDR", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Remote_Host", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Remote_port", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "request_method", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "script_name" foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Server_name", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Server_port", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Server_port_secure" foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Server_protocol", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "Server_software" foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "URL", foi passado para o gerador de configuração, mas não era esperado. Verifique o seu parâmetro URL String / Cookie. Verifique sua string / cookie de URL.O parâmetro "http_connection", foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie URL.O parâmetro "http_accept" foi passado para o gerador de configuração, mas não era esperado. Verifique sua sequência de URL / cookie. O parâmetro "http_accept_charset", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "http_accept_encoding", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie. O parâmetro "http_accept_language", foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie URL.O parâmetro "http_cookie", foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie de URL.O parâmetro "http_host", foi passado para o gerador de configuração, mas não era esperado. Verifique sua string / cookie URL.O parâmetro "http_user_agent", foi passado para o gerador de configuração, mas não era esperado. Verifique seu URL String / Cookie.Thread estava sendo abortado.


Existe alguma maneira de separar os parâmetros implícitos e explícitos, ou não é factível? Devo menos me incomodar? Talvez a filosofia de obter seja apenas jogar fora, o que não é necessário.

Obrigado!

Foi útil?

Solução

Seu dicionário deve ter uma chave de string, seu código não tem "" em torno das chaves:

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

};

Para o restante dos erros, tente usar isso, seu código estava procurando todos os parâmetros postados, não apenas os parâmetros de consultas (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;
                }

Outras dicas

Como Drousseau menciona, você precisará usar o QueryString coleção em vez de Params. Params Inclui todos os dados aprovados na solicitação, o que significa cookies, formulário de pós -dados, parâmetros de consulta e servidorVariables.

Parece que você está verificando os cookies também, então você precisará fazer uma verificação separada por meio dessa coleção ou mesclar os dois usando algo assim:

        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);

Também vale a pena notar que você também receberá um biscoito no estado da sessão do Asp.net. Você pode codificá -lo ignorando explicitamente os cookies chamados "asp.net_sessionId" (mais fácil) ou apenas desativando o estado da sessão no web.config - você precisará limpar seus cookies.

EDITAR: Acabei de ver um pouco sobre segmentar 2.0, o que significa que a boa declaração LINQ está fora de questão. Provavelmente seria mais fácil verificar se cada uma das coleções (queda e biscoitos) separadamente.

Editar Parte Deux:Aqui está uma alternativa não-Linq para usar uma única pesquisa:

        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);
        }

Usar uma corda codificada como essa é feia, mas ei, deve funcionar.

Eu também gostaria de ressaltar que, se você usasse o ASP.NET MVC ou mesmo apenas o System.Web.Routing (os quais infelizmente exigem .NET 3.5), você não precisaria fazer nada disso, já que a estrutura de roteamento Faz tudo para você - e você terá parâmetros digitados para inicializar!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top