反射:修改請求頭HttpWebRequest/Webclient Header屬性的date值-"此標頭必須使用適當的屬性進行修改"


場景:調用外部接口,接口要求Header信息里面包涵Date信息,且Date信息必須是格式化好的,(他們用的是Java),但是C#默認的是Date屬性不能被修改,

所以就會出現下面的錯誤:

未處理的異常:  System.Net.WebException: 在 WebClient 請求期間發生異常。 ---> Sy
tem.ArgumentException: 此標頭必須使用適當的屬性進行修改。
參數名: name
   在 System.Net.WebHeaderCollection.ThrowOnRestrictedHeader(String headerName)
   在 System.Net.WebHeaderCollection.Add(String name, String value)
   在 System.Net.HttpWebRequest.set_Headers(WebHeaderCollection value)
   在 System.Net.WebClient.CopyHeadersTo(WebRequest request)
   在 System.Net.WebClient.GetWebRequest(Uri address)
   在 System.Net.WebClient.DownloadFile(Uri address, String fileName)
   --- 內部異常堆棧跟蹤的結尾 ---
   在 System.Net.WebClient.DownloadFile(Uri address, String fileName)
   在 System.Net.WebClient.DownloadFile(String address, String fileName)
   在 hash.Program.Main(String[] args) 位置 D:\powerall\hash\hash\Program.cs:行
號 122

 

解決代碼:

MethodInfo priMethod = webReqst.Headers.GetType().GetMethod("AddWithoutValidate", BindingFlags.Instance | BindingFlags.NonPublic);
                priMethod.Invoke(webReqst.Headers, new[] { "Date", DATE });
                string myDate = webReqst.Headers.Get("Date");

 

大家可以看到,解決問題的辦法就是使用反射。

反射

指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。
程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝 程序集、模塊和類型的對象。您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。然后,可以調用類型的方法或訪問其字段和屬性。
 
優點:
1、反射提高了程序的靈活性和擴展性。
2、降低耦合性,提高自適應能力。
3、它允許程序創建和控制任何類的對象,無需提前硬編碼目標類。

缺點:
  1、性能問題:使用反射基本上是一種解釋操作,用於字段和方法接入時要遠慢於直接代碼。因此反射機制主要應用在對靈活性和拓展性要求很高的系統框架上,普通程序不建議使用。
2、使用反射會模糊程序內部邏輯;程序員希望在源代碼中看到程序的邏輯,反射卻繞過了源代碼的技術,因而會帶來維護的問題,反射代碼比相應的直接代碼更復雜。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM