【发布时间】:2013-03-04 19:17:04
【问题描述】:
我将HttpRequestBase 包装为HttpRequestMessage,这需要复制所有标题。但是由于HttpRequestMessage 对哪些标头适用于请求对象和内容对象比较特别,所以下面的httpRequest.Headers.Add 行有时会抛出 InvalidOperationException。
public static HttpRequestMessage AsHttpRequestMessage(this HttpRequestBase request) {
Requires.NotNull(request, "request");
var httpRequest = new HttpRequestMessage(new HttpMethod(request.HttpMethod), request.Url);
foreach (string header in request.Headers) {
httpRequest.Headers.Add(header, request.Headers.GetValues(header));
}
if (request.Form != null) {
// Avoid a request message that will try to read the request stream twice for already parsed data.
httpRequest.Content = new FormUrlEncodedContent(request.Form.AsKeyValuePairs());
} else if (request.InputStream != null) {
httpRequest.Content = new StreamContent(request.InputStream);
}
return httpRequest;
}
显然,我希望我的代码不抛出异常,而是将每个标头适当地应用于适当的对象。我怎么能预测这个?有没有什么方法可以用来测试没有生成和捕获异常的标头的适用性?
【问题讨论】:
-
我实际上发现它甚至比标题放置更难。某些标头(如 Content-Type)根本不能是
Added,但只能使用 ContentType 属性进行设置。Accept是另一个标题,显然我必须使用更丰富的对象解析和传递。确定这项工作已经完成了,我不必在这里重做? -
在您的代码中,我看到您阅读 request.Form 或 request.Content 。我很想知道 HttpRequestBase 对象是否可以同时具有重要内容
-
@StackOverflowVeryHelpful:不。表单数据来自内容。所以如果Form不为null,则表示请求携带了一个HTTP头,表示请求输入流携带了表单数据,ASP.NET为我们解析了,此时InputStream就没有了。
标签: asp.net httpclient