我正在向S3做一个HttpWebRequest,我正在尝试将Date标头设置为这样的:
"星期一,2012年7月16日01:16:18 -0000"
这是我尝试过的:
string pattern = "ddd, dd MMM yyyy HH:mm:ss -0000";
request.Date = DateTime.ParseExact("Mon, 16 Jul 2012 01:16:18 -0000", pattern, null);
Run Code Online (Sandbox Code Playgroud)
但是,当我查看请求的标题时,这是我得到的:
request.Headers.Get("Date");
// "Mon, 16 Jul 2012 07:16:18 GMT"
Run Code Online (Sandbox Code Playgroud)
我相信这可能是请求403的原因.AWS错误文档提到:
403 Forbidden - 请求时间与服务器时间之间的差异太大.
任何有关将此日期整理出来的建议将不胜感激.谢谢!
Osc*_*car 13
有一些事情需要澄清:
您的日期模式不正确.
HttpWebRequest request.Date标头只能在.NET Framework 4中进行修改,并且根据文档,System.Net命名空间将始终使用GMT(UTC)格式将此标头写为标准格式.所以,无论你怎么做你想要的日期格式,都行不通!
在其他.NET框架版本中,您将无法修改HttpWebRequest request.Date标头,因为它将使用正确的GMT(UTC)格式的实际日期,除非您使用一种黑客来设置自己的日期和格式(见下文).
解决您的问题(测试和工作):
你的进口:
using System.Net;
using System.Reflection;
Run Code Online (Sandbox Code Playgroud)
获取今日日期格式:星期一,2012年7月16日01:16:18 -0000
string today = String.Format("{0:ddd,' 'dd' 'MMM' 'yyyy' 'HH':'mm':'ss' 'K}", DateTime.Now);
Run Code Online (Sandbox Code Playgroud)
这是棘手的事情,你可以通过这样做来破解HttpWebRequest日期标题:
(不要再做request.Date = something;了,请用以下内容替换)
MethodInfo priMethod = request.Headers.GetType().GetMethod("AddWithoutValidate", BindingFlags.Instance | BindingFlags.NonPublic);
priMethod.Invoke(request.Headers, new[] { "Date", today });
Run Code Online (Sandbox Code Playgroud)
从您的请求中获取日期(仅用于测试):
// "myDate" will output the same date as the first moment:
// Mon, 16 Jul 2012 01:16:18 -0000
// As you can see, you will never get this again:
// Mon, 16 Jul 2012 07:16:18 GMT
string myDate = request.Headers.Get("Date");
Run Code Online (Sandbox Code Playgroud)
此时,您已成功将自己的格式和日期值设置为HttpWebRequest日期标题!
希望这可以帮助 :-)