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

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

因此就會出現下面的錯誤:web

未處理的異常:  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");

 

你們能夠看到,解決問題的辦法就是使用反射。編碼

反射spa

指程序能夠訪問、檢測和修改它自己狀態或行爲的一種能力。
程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝 程序集、模塊和類型的對象。您可使用反射動態地建立類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。而後,能夠調用類型的方法或訪問其字段和屬性。
 
優勢:
一、反射提升了程序的靈活性和擴展性。
二、下降耦合性,提升自適應能力。
三、它容許程序建立和控制任何類的對象,無需提早硬編碼目標類。

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