C#HttpWebRequest日期标题格式

Mit*_*civ 6 c# amazon-s3

我正在向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日期标题!

希望这可以帮助 :-)