ASP.Net Come far rispettare il formato URL HTTP get?
-
28-09-2019 - |
Domanda
[Mi dispiace per una domanda disordinato. Credo che sto il targeting Net 2.0 (per ora)]
Ciao, io sono un niubbo ASP.NET. Per cominciare Sto costruendo una pagina che analizza una stringa URL e popola una tabella in un database. Voglio che stringa da rigorosamente della forma:
http://<server>:<port>/PageName.aspx?A=1&B=2&C=3&D=4&E=5
L'ordine degli argomenti non importa, solo che non voglio che nessuno di loro mancanza, o eventuali extra. Ecco quello che ho provato (sì, è brutto, voglio solo farlo funzionare prima):
#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 funziona bene, tranne che lamenta ogni sorta di altre cose:
http: // localhost: 1796 / AddStatusUpdate.aspx X = 0
Nessun parametro "A", alias un è stato passato al generatore di configurazione. Controllare la stringa URL / cookie.No parametro "B", aka B è stato passato al generatore di configurazione. Controllare la stringa URL / cookie.No parametro "C", aka c è stato passato al generatore di configurazione. Controllare la stringa URL / cookie.No parametro "D", aka d è stato passato al generatore di configurazione. Controllare la stringa URL / cookie.No parametro "E", alias di posta è stato passato al generatore di configurazione. Controllare la stringa URL / cookie.No parametro "F", alias f è stato passato al generatore di configurazione. Controllare la stringa URL / cookie.The parametro "X", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "ASP.NET_SessionId", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "ALL_HTTP", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "ALL_RAW", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "APPL_MD_PATH", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "APPL_PHYSICAL_PATH", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "AUTH_TYPE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "AUTH_USER", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "AUTH_PASSWORD", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "LOGON_USER", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "REMOTE_USER", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "CERT_COOKIE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "CERT_FLAGS", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "CERT_ISSUER", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "CERT_KEYSIZE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "CERT_SECRETKEYSIZE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "CERT_SERIALNUMBER", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "CERT_SERVER_ISSUER", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "CERT_SERVER_SUBJECT", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "CERT_SUBJECT", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parameter "CONTENT_LENGTH", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "CONTENT_TYPE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "GATEWAY_INTERFACE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTPS", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTPS_KEYSIZE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTPS_SECRETKEYSIZE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTPS_SERVER_ISSUER", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTPS_SERVER_SUBJECT", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "instance_id", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "INSTANCE_META_PATH", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "LOCAL_ADDR", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "PATH_INFO", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "PATH_TRANSLATED", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "QUERY_STRING", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "REMOTE_ADDR", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "REMOTE_HOST", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "REMOTE_PORT", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "REQUEST_METHOD", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.The parametro "SCRIPT_NAME", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "SERVER_NAME", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "SERVER_PORT", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "SERVER_PORT_SECURE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "SERVER_PROTOCOL", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "SERVER_SOFTWARE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL cookie.The parametro "URL" /, è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTP_CACHE_CONTROL", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTP_CONNECTION", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTP_ACCEPT", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTP_ACCEPT_CHARSET", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTP_ACCEPT_ENCODING", è stato passato al generatore di configurazione, ma non era previsto. Controlla la tua stri URLng / cookie.The parametro "HTTP_ACCEPT_LANGUAGE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTP_COOKIE", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTP_HOST", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / parametro cookie.The "HTTP_USER_AGENT", è stato passato al generatore di configurazione, ma non era previsto. Controllare la stringa URL / cookie.Thread veniva interrotta.
C'è qualche modo per me per separare i parametri impliciti ed espliciti la, o non è fattibile? Dovrei nemmeno? Forse la filosofia di ottenere è quello di gettare solo via che ciò che non è necessaria.
Grazie!
Soluzione
Il dizionario dovrebbe avere una chiave di stringa, il codice non ha "" intorno ai tasti:
private static Dictionary<string, string> paramNameToDisplayName = new Dictionary<string, string> {
{ "A", "a"},
{ "B", "b"},
{ "C", "c"},
{ "D", "d"},
{ "E", "e"},
{ "F", "f"},
};
Per il resto degli errori, provare a utilizzare questo, il codice era alla ricerca di tutti i params distaccati, non solo i params querystring (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;
}
Altri suggerimenti
Come drousseau cita, avrete bisogno di utilizzare la raccolta QueryString
invece di Params
. Params
include tutti i dati passati in merito alla richiesta, il che significa cookie, dati dei moduli inviati, i parametri QueryString e ServerVariables.
Sembra che si sta controllando i biscotti e, in modo potrete sia bisogno di fare un controllo separato per tale raccolta, oppure unire le due utilizzando qualcosa di simile:
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);
E 'anche interessante notare che si sta anche andando a essere sempre un cookie è sceso da ASP.NET lo stato della sessione. È possibile sia il codice intorno ad esso ignorando esplicitamente biscotti chiamati "ASP.NET_SessionId" (più facile), o semplicemente disattivare lo stato della sessione in web.config -. È necessario eliminare i cookie se
Modifica appena visto il bit sul targeting 2.0, il che significa che bella dichiarazione po LINQ è fuori questione. Probabilmente sarebbe più semplice per verificare appena ciascuna delle collezioni (QueryString e Cookies) a parte.
Modifica parte DEUX: Ecco un non-LINQ alternativa all'utilizzo di una singola ricerca:
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);
}
Utilizzando una stringa hard-coded come quello è brutto, ma hey, dovrebbe funzionare.
Vorrei anche far notare che se si è utilizzato ASP.NET MVC o anche solo System.Web.Routing (entrambi i quali, purtroppo, richiede .NET 3.5), che non avrebbe dovuto fare niente di tutto questo, dal momento che il quadro di routing fa tutto per voi! - e si otterrebbe digitato i parametri di boot