Нужна помощь с объектом 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);
        }
    }
}
Другие вопросы по тегам