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