反射:修改请求头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、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

时间: 2024-12-14 18:17:24

反射:修改请求头HttpWebRequest/Webclient Header属性的date值-"此标头必须使用适当的属性进行修改"的相关文章

Zuul 修改 请求头、响应头 (死磕)

疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 疯狂创客圈 高并发 环境 视频,陆续上线: Windows Redis 安装(带视频) Linux Redis 安装(带视频) Windows Zookeeper 安装(带视频) Linux Zookeeper 安装(带视频) RabbitMQ 离线安装(带视频) Nacos 安装(带视频) ElasticSear

iview-admin 2.1 + django 2.1 (一) 登录认证+修改请求头

登录认证+修改请求头 前端 登录 config/index.js dev: 后端地址 api/user.js const data = { username: userName.valueOf(), password } 请求头设置 libs/axios.js interceptors (instance, url) { // 请求拦截 instance.interceptors.request.use(config => { // 添加全局的loading... 增加下面的 if (url !

$headers = $this->input->request_headers();返回请求头(header)数组

请查看:CI中的输入类部分 建议用第一个 $headers = $this->input->request_headers() $this->input->request_headers() 在不支持apache_request_headers()的非Apache环境非常有用.返回请求头(header)数组. $headers = $this->input->request_headers(); $this->input->get_request_heade

Android系列之网络(二)----HTTP请求头与响应头

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4005034.html 联系方式:[email protected] [正文] 国庆佳节,习惯并享受着一个人独霸整个教研室的感觉. 在上一篇文章中,我们学习到了如何使用HttpClient发送HTTP请求.博文链接: Android系列之网络(一)----使用HttpClient发送HTTP请求

http请求头信息

1.HTTP Request Header 请求头信息对照表 Header 解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏览器可以接受的字符编码集. Accept-Charset: iso-8859-5 Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型. Accept-Encoding: compress, gzip Accept-Language 浏览器可接

第六章类(七)属性3提供属性验证、只读和只写属性、取值和赋值方法的访问修饰符

只记录回忆点 如果为LastName赋了无效的值,代码就会抛出异常.拦截赋值,并通过字段风格的API对参数进行验证,这是属性的优点之一. 一个好的实践是从属性的实现中访问属性的支持字段.换言之,要一直使用属性,不要直接调用字段. 可移除属性的取值方法或赋值方法来改变属性的可访问性. 只有赋值方法的属性是只写属性,这种情况较罕见.C#6.0开始支持只读自动实现的属性. 设计规范 如果属性值不变,要创建只读属性: 不要提供只写属性,也不要让赋值方法的可访问性比取值方法更宽松: 原文地址:https:

HTTP中的请求头和响应头属性解析

HTTP中的请求头和响应头属性解析 下面总结一下平时web开发中,HTTP请求的相关过程以及重要的参数意义 一次完整的HTTP请求所经历的7个步骤 说明:HTTP通信机制是在一次完整的HTTP通信过程中,web浏览器与web服务器之间将完成下列7个步骤: 建立TCP连接 Web浏览器向web服务器发送请求命令  例如:GET /sample/hello.jsp HTTP 1.1 Web浏览器发送请求头信息 Web服务器应答  例如:HTTP/1.1 200 ok Web服务器发送应答头信息 We

Android Retrofit2&OkHttp3添加统一的请求头Header

在使用Retrofit时,有时候需要设置Set-Cookie等请求头,如果每一个url都需要,那么直接来个拦截器就好了. 官方说明: OkHttp3下OkHttpClient的 List< Interceptor> interceptors()方法,返回的是一个不可编辑的列表,如果对其进行编辑会报出UnSupportedOperationException Interceptor的典型使用场景,就是对request和response的Headers进行编辑 如下图所示: 注意Header头,不

http请求头中的Content-Type属性在angular 和 node中的用法

post请求的请求体有以下两种格式: 1. 字符串: 'name=code_bunny&age=12' 这种格式的请求体,需要配置请求头 'Content-Type':'application/x-www-form-urlencoded' 2. json: {name:'code_bunny',age:12} 这种格式的请求体,需要配置请求头 'Content-Type':'application/json;charset=UTF-8' 注意: 请求体格式和请求头的Content-Type类型必