Почему заголовок Date не установлен, когда я делаю WebRequest в C #? - PullRequest
3 голосов
/ 23 июня 2010

Сегодня вечером я начал небольшой проект, пытаясь создать библиотеку C # для доступа к Google Storage API . Когда вы создаете любой запрос к Google Storage API, вы должны включить заголовок «Дата» в веб-запрос.

Я попытался создать WebRequest в C # и заметил, что не могу установить заголовок «Дата» вручную. Согласно этой странице MSDN , свойство Date должно автоматически устанавливаться системой.

Мои запросы в Google не выполняются из-за отсутствия заголовка «Дата». Fiddler подтверждает, что заголовок Date не отправляется в моем запросе.

Вот фрагмент кода, который я использую:

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();

Есть идеи, что может происходить? Почему заголовок Date не отправляется с моим веб-запросом?

Ответы [ 3 ]

1 голос
/ 24 июня 2010

Мне удалось решить эту проблему, используя класс TcpClient и создав собственные заголовки, как описано в этом посте: http://www.issociate.de/board/goto/970687/HTTPWebRequest_Date_Header.html

1 голос
/ 23 июня 2010

Согласно документации, свойство HttpWebRequest.Date по умолчанию имеет значение DateTime.MinValue, которое не отправляет заголовок Date с запросом.

Итак, чтобы установить все, что вам нужно сделать, это ...

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

webRequest.Date = DateTime.UtcNow;
0 голосов
/ 17 марта 2015

Если не использовать класс tcp и не перекодировать все, можно использовать отражения, чтобы добавить их с помощью метода «AddWithoutValidation».Это будет работать в .Net 3.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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...