場景:調用外部接口,接口要求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、性能問題:使用反射基本上是一種解釋操作,用於字段和方法接入時要遠慢於直接代碼。因此反射機制主要應用在對靈活性和拓展性要求很高的系統框架上,普通程序不建議使用。