Как добавить заголовок в HttpWebRequest в приложении Windows8?

Я разработал C # \ XAML metro-ui приложение. Я хочу позвонить в какой-нибудь сервис и собираюсь использоватьHttpWebRequest за это. Предыдущая реализацияHttpWebRequest содержитContentLength а такжеUserAgent свойства. Но реализация для WinRT не имеет его. Я пытался использовать подход, описанный в этомсообщение, Это работает дляUserAgent но не дляContentLength. I've tried to set Headers

request.Headers["Content-length"] = Length;
request.Headers["User-agent"] = UserAgent;

Но получено исключение «The Content-length» заголовок должен быть изменен с использованием соответствующего свойства или метода. & quot;

Горячее можно установитьHeaders вHttpWebRequest реализован в WinRT?

 RredCat10 июн. 2012 г., 11:53
@LarryOsterman Нет. Более того, мне нужно установитьContent-type имущество. Так что я тоже должен это прокомментировать. Для подхода, описанного по ссылке: я получаю400 Bad Request когда я прокомментировал эти свойства. Когда я прокомментировал это дляHttpWebRequest Я получаю исключениеThe underlying connection was closed: The connection was closed unexpectedly.
 JP Alioto11 июн. 2012 г., 05:43
Вот хорошая статья о том, как заставить Fiddler работать с приложением в стиле Metroblogs.msdn.com/b/fiddler/archive/2011/09/14/…
 Larry Osterman09 июн. 2012 г., 17:18
Если убрать настройку content-length, это работает? Возможно, что HttpWepRequest не позволит вам установить длину контента, потому что он рассчитывает его на основе контента, который вы отправляете.
 Larry Osterman10 июн. 2012 г., 16:15
Хммм. Я вижу, как HttpWebRequest блокирует настройку content-length (поскольку он может рассчитывать content-length). Плохой запрос подразумевает, что с отправляемым сообщением что-то не так, что Fiddler показывает, что вы отправили?

Ответы на вопрос(1)

Решение Вопроса

HttpWebRequest имеет полу-устаревший статус под WinRT. Некоторые значения заголовка, которые ранее могли быть изменены на более ранних платформах .NET, больше не могут быть изменены с ним.

Кажется, чтоHttpClient это новая и улучшенная замена HttpWebRequest с простым API и полной асинхронной поддержкой.

Поскольку вы хотите указать Content-Length, я предполагаю, что вы пытаетесь POST или PUT что-то на сервер. В этом случае вы захотите использовать PostAsync () или PutAsync () в зависимости от ситуации.

    var req = new HttpClient();
    req.DefaultRequestHeaders.Add("User-agent", UserAgent);
    req.DefaultRequestHeaders.Add("Content-length", Length);
    return await req.PostAsync(RequestURL, Body);

Возможно, вам действительно не нужно указывать заголовок Content-length, так как он будет автоматически включен этими методами на основе фактической длины Body, но вы можете попробовать его в любом случае.

 RredCat17 июн. 2012 г., 11:02
Я нашел это. Я только что закодировал строку параметров вASCII, Но это не полное решение. Я упомянул в комментарии @Larry Osterman, что у меня были проблемы с настройкойContentType, Я нашел способ сделать это - "content.Headers.ContentType = new MediaTypeHeaderValue (& quot; application / x-www-form-urlencoded & quot;);" Как бы то ни было, я отметил ваш пост как ответ, потому что вы довольно близки к ответу)
 RredCat16 июн. 2012 г., 18:55
Да .. Вы правы .. Спасибо за ваш ответ. Я играю с чем-то вроде ... Но, как я вижу,Body являетсяHttpContent типа, верно? И вы указали там свои параметры, не так ли? Не могли бы вы объяснить, как вы положили параметры в случаеHttpContent?

Ваш ответ на вопрос