How to convert HttpRequestBase to HttpRequestMessage, considering header names?
我将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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; } |
显然,我希望代码不引发异常,而是将每个标头适当地应用于适当的对象。 我该如何预测? 我可以使用任何方法来测试标头的适用性,该标头是否会生成并捕获异常?
事实证明,这很简单。 此代码段的灵感来自ASP.NET自己的开源代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /// <summary> /// Clones an <see cref="HttpWebRequest" /> in order to send it again. /// </summary> /// <param name="message">The message to set headers on.</param> /// <param name="request">The request with headers to clone.</param> internal static void CopyHeadersFrom(this HttpRequestMessage message, HttpRequestBase request) { Requires.NotNull(request,"request"); Requires.NotNull(message,"message"); foreach (string headerName in request.Headers) { string[] headerValues = request.Headers.GetValues(headerName); if (!message.Headers.TryAddWithoutValidation(headerName, headerValues)) { message.Content.Headers.TryAddWithoutValidation(headerName, headerValues); } } } |
您应该能够使用TryAddWithoutValidation而不是Add来避免抛出该异常。 您需要注意是否调用GetBufferlessStream,这取决于您是否要缓冲请求。 请参阅以下类中的ConvertRequest方法:http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/4764b0111b91#src/System.Web.Http.WebHost/HttpControllerHandler.cs