2010-04-19 23 views
1

[對不起,一個凌亂的問題。我相信我的目標。NET 2.0(現在)]ASP.Net如何執行HTTP get URL格式?

嗨,我是一個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」,又名一個被傳遞給配置生成。檢查你的URL字符串/ cookie.No參數「B」,又名b被傳遞給配置生成器。檢查您的URL字符串/ cookie.No參數「C」,又名c被傳遞給配置生成器。檢查你的URL字符串/ cookie.No參數「D」,又名d被傳遞給配置生成器。檢查您的URL字符串/ cookie.No參數「E」,也就是e被傳遞給配置生成器。檢查你的URL字符串/ 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的哲學就是拋棄那些不需要的東西。

謝謝!

回答

1

你的字典應該有一個字符串鍵,你的代碼沒有「」周圍的按鍵:

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

};

有關錯誤的休息,嘗試用這個,你的代碼一直在尋找所有張貼的參數,可以不只是查詢字符串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; 
       } 
+0

謝謝!原來我需要泛型和Linq來實現這個功能。 – 2010-04-20 17:18:56

+0

問題:我如何獲得Contains 與不區分大小寫的比較器一起工作?我看到了第二個參數的選項;我只是不知道哪個泛型類實現了這個接口,並做我想要的。謝謝! – 2010-04-20 22:37:25

+0

請求.QueryString.AllKeys.Contains (expectedParameterName,StringComparer.InvariantCultureIgnoreCase) – derek 2010-04-20 23:24:52

1

由於drousseau提到,你」您需要使用QueryString集合而不是ParamsParams包含在請求上傳遞的所有數據,這意味着cookie,形成POST數據,查詢字符串參數和服務器變量。

看起來你正在檢查的餅乾一樣,所以你要麼需要通過收集單獨做檢查,或通過使用這樣的合併兩個:

 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中的會話狀態 - 但你需要清除你的cookies。

編輯:剛剛看到了有關瞄準2.0的一點,這意味着很好的小LINQ語句是不可能的。單獨檢查每個集合(QueryString和Cookies)可能是最簡單的。

編輯部分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),你不需要做任何這樣的事情,因爲路由框架可以完成所有的工作 - 而且你可以獲得輸入參數來啓動!

+0

Daniel,我可以升級到3.5或4.0,但我只是潛入ASP.Net並且時間有限。在LINQ示例中 - 一旦我擁有了兩個,我該怎麼處理它?另外,cookie如何影響我。我從其他地方複製了部分錯誤消息,但不明白Cookie是如何進入遊戲的。再次感謝! – 2010-04-20 01:48:38

+1

使用「both」字典迭代並執行您的檢查而不是Request.Params。 我收錄了cookies,因爲它們在Response.Write調用中提到。 ASP.NET使用稱爲會話狀態(http://msdn.microsoft.com/en-us/library/ms972429.aspx)來保存有關請求之間用戶會話的數據。它跟蹤它的默認方式是使用自動設置的cookie。因此,如果您正在檢查cookie,會話狀態cookie將自動顯示,這意味着如果您只希望設置指定的值,則需要對其進行解釋。 – 2010-04-20 02:51:45