如何在Windows 8应用程序中为HttpWebRequest添加头信息?

5
我正在开发C#\XAML metro-ui应用程序。我想调用一些服务并使用HttpWebRequest来实现。之前的HttpWebRequest实现包含ContentLengthUserAgent属性。但是WinRT实现没有这些属性。我试图使用此帖子中描述的方法。它可以用于UserAgent,但无法用于ContentLength。我尝试设置Headers
request.Headers["Content-length"] = Length;
request.Headers["User-agent"] = UserAgent;

但是遇到了异常:“必须使用适当的属性或方法修改'Content-length'标头。”

在WinRT中实现的HttpWebRequest中如何设置Headers


如果您删除设置内容长度,它是否可以工作?这可能是因为HttpWepRequest不允许您设置内容长度,因为它基于您发送的内容进行计算。 - Larry Osterman
@LarryOsterman 不是的。此外我需要设置“Content-type”属性。所以我也应该把它注释掉。对于链接描述的方法,当我注释了这些属性时,我得到了“400错误请求”。当我为“HttpWebRequest”注释了这些内容时,我得到了WebException:“底层连接被关闭:连接意外地关闭了。” - RredCat
嗯,我可以看到HttpWebRequest阻止设置content-length(因为它可以计算content-length)。坏请求意味着发送的消息有问题,Fiddler显示你发送了什么? - Larry Osterman
1
这是一篇关于如何让Fiddler与Metro风格应用程序配合使用的好文章。http://blogs.msdn.com/b/fiddler/archive/2011/09/14/fiddler-and-windows-8-metro-style-applications-https-and-private-network-capabilities.aspx - JP Alioto
1个回答

12

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报头。这是因为根据正文的实际长度,这些方法将自动包含它。但您可以无论如何尝试一下。


是的,你说得对。谢谢你的回答。我正在尝试做一些类似的东西。但是我看到BodyHttpContent类型,对吗?你把参数放在那里了,是吗?你能解释一下如何将参数放入HttpContent实例中吗? - RredCat
我找到了。我刚刚将参数字符串编码为ASCII。但这并不是完整的解决方案。我在评论中提到了对@Larry Osterman的问题,我在设置ContentType时遇到了问题。我找到了解决方法 - 'content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");' 无论如何,我将你的帖子标记为答案,因为你离答案很近) - RredCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接