Нужна помощь с объектом HttpWebRequest
Я пытаюсь создать прокси-модуль для.NET, но у меня возникают проблемы при копировании заголовков из текущего запроса в новый запрос. Я устанавливаю заголовки нового запроса, потому что я хочу, чтобы прокси поддерживал запросы SOAP. Вот часть моего кода. Я могу опубликовать все, если нужно, но это единственная часть, которая, кажется, связана с проблемой, которую я имею:
HttpApplication app = (HttpApplication)sender; // sender from context.BeginRequest event
HttpRequest crntReq = app.Request; // set a reference to request object for easier access
HttpWebRequest proxyReq = (HttpWebRequest)HttpWebRequest.Create(crntReq.Url.AbsoluteUri);
// parse headers from current httpcontext.request.headers and add each name->value to the
// new request object
foreach (string header in crntReq.Headers)
{
proxyReq.Headers.Add(header, crntReq.Headers[header]); // throws exception :(
}
Когда мой код попадает в цикл foreach, он вызывает исключение для функции Headers.Add. Я предполагаю, что коллекция имеет ограничения доступа, в целях безопасности. Похоже, что некоторые значения заголовка доступны со свойствами самого объекта HttpWebRequest. Однако в этом случае я бы предпочел избавиться от абстракции и установить свойства вручную. Исключение, которое я получаю:
{"Этот заголовок должен быть изменен с использованием соответствующего свойства.\ R \nParameter name: name"}
Заранее спасибо за помощь,
CJAM
3 ответа
Некоторые из заголовков фактически отображаются как свойства непосредственно в объекте HttpWebRequest. Эти заголовки вам не разрешено устанавливать напрямую. например, HttpWebRequest,ContentType и HttpWebRequest.UserAgent
Вам нужно будет обновить эти свойства напрямую и избегать их установки через свойство Headers.
Поэтому я понимаю ваш ответ как "Невозможно установить коллекцию явно". Я надеялся, что есть способ добавить имена и значения в NameValueDictionary, но я предполагаю, что мне нужно будет просто определить, какие поля мне нужно установить, и использовать свойства для доступа к конкретным объектам имени / значения. Я думаю, что мог бы использовать наследование и свернуть свою собственную версию объекта HttpWebRequest, но я уверен, что у людей в Microsoft была причина для инкапсуляции коллекции, поэтому я, вероятно, просто оставлю вещи такими, какие они есть.
Спасибо за вашу помощь в этом.
Хотя это старый пост, мне нужно было сделать это недавно для HTTP-прокси, написанного на.NET, и вот как я скопировал заголовки между двумя разными запросами. Обратная связь приветствуется, и я надеюсь, что это кому-то поможет.
static void CopyHeaders (HttpRequest sourceRequest, HttpWebRequest targetRequest) {
foreach (string key in sourceRequest.Headers) {
var value = sourceRequest.Headers[key];
object objectValue = value;
var propName = key.Replace("-", string.Empty);
switch (key) {
case "Host":
case "Content-Length":
// Do not propogate Host and Content-Length.
continue;
case "Connection":
// Cannot set the following values ...
if (value == "Keep-Alive" || value == "Close") {
continue;
}
break;
case "If-Modified-Since":
objectValue = DateTime.Parse(value);
break;
}
var prop = targetRequest.GetType().GetProperty(propName, BindingFlags.Public | BindingFlags.Instance);
if (null != prop && prop.CanWrite) {
prop.SetValue(targetRequest, objectValue, null);
} else {
targetRequest.Headers[key] = Convert.ToString(value);
}
}
}