Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我在C#中发出WebRequest时没有设置日期标题?_C#_Api_Storage_Webrequest - Fatal编程技术网

为什么我在C#中发出WebRequest时没有设置日期标题?

为什么我在C#中发出WebRequest时没有设置日期标题?,c#,api,storage,webrequest,C#,Api,Storage,Webrequest,今晚,我开始了一个小项目,试图创建一个C#库来访问数据库。当您创建对Google Storage API的任何类型的请求时,您必须在web请求中包含“日期”头 我试图在C#中创建一个WebRequest,并注意到我无法手动设置“日期”标题。根据,日期属性应由系统自动设置 由于缺少“日期”标题,我对谷歌的请求失败了。Fiddler确认我的请求中没有发送日期标头 以下是我正在使用的代码片段: WebRequest webRequest; webRequest = WebRequest.Create(

今晚,我开始了一个小项目,试图创建一个C#库来访问数据库。当您创建对Google Storage API的任何类型的请求时,您必须在web请求中包含“日期”头

我试图在C#中创建一个WebRequest,并注意到我无法手动设置“日期”标题。根据,日期属性应由系统自动设置

由于缺少“日期”标题,我对谷歌的请求失败了。Fiddler确认我的请求中没有发送日期标头

以下是我正在使用的代码片段:

WebRequest webRequest;
webRequest = WebRequest.Create("http://commondatastorage.googleapis.com");

String auth = "GOOG1 " + m_accessKey + ":" + CreateSignature();

webRequest.Headers.Add("Authorization", auth);
webRequest.ContentType = "text/html";

Stream objStream;
objStream = webRequest.GetResponse().GetResponseStream();

知道会发生什么吗?为什么不将日期标头与我的web请求一起发送?

根据文档,默认情况下,属性为DateTime.MinValue,它不会将日期标头与请求一起发送

所以要设置它,你需要做的就是

HttpWebRequest webRequest;
webRequest = (HttpWebRequest)WebRequest.Create("http://commondatastorage.googleapis.com");

webRequest.Date = DateTime.UtcNow;

我可以通过使用TcpClient类并创建自己的标题来解决这个问题,如本文所述:

除了使用tcp类和重新编码之外,所有操作都将使用反射来使用“AddWithoutValidation”方法添加它们。这将在.NET3.5(一种变通方法)中起作用

//request.Headers.Add("date", getIsoStringFromDate(DateTime.Now)); <- EXCEPTION in .Net 3.5

 //WORKAROUND
 Type type = request.Headers.GetType();
 BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
 MethodInfo methodInfo = type.GetMethod("AddWithoutValidate", flags);
 object[] myPara = new object[2];
 myPara[0] = "date";
 myPara[1] = DateTime.Now.ToShortDateString();
 methodInfo.Invoke(request.Headers, myPara);

//request.Headers.Add(“date”,getIsoStringFromDate(DateTime.Now));我认为只有当您以.NET 4.0为目标时才能设置此属性:当以.NET 3.5为目标时,我绝对不能设置此属性。