2013-03-04 12 views
8

Bir HttpRequestBase, tüm üstbilgilerin kopyalanmasını gerektiren HttpRequestMessage olarak kaydırıyorum. Ancak, HttpRequestMessage, istek nesnesine karşı Content nesnesine hangi başlıkların uygulanacağı konusunda özel olduğundan, bazen httpRequest.Headers.Add satırı InvalidOperationException öğesini atar.HttpRequestBase, HttpRequestMessage ile başlık adlarını dikkate alarak nasıl dönüştürülür?

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; 
} 

Açıkçası ben istisnalar atmak değil, uygun uygun nesneye her başlık uygulanmaz için kodumu istiyorum. Bunu nasıl tahmin edebilirim? İstisnalar oluşturan ve yakalayan bir başlık kısaluğunun uygulanabilirliğini test etmek için kullanabileceğim herhangi bir yöntem var mı?

+0

Gerçekten de sadece başlık yerleştirme daha zor olduğunu öğrendim. Bazı başlıklar (İçerik Türü gibi) hiç eklenemez, ancak yalnızca ContentType özelliği kullanılarak ayarlanabilir. 'Accept', görünüşe göre daha zengin objeleri kullanarak ayrıştırıp geçmem gereken başka bir başlık. Şüphesiz bu çalışma çoktan yapıldı ve burada tekrar yapmak zorunda değilim? –

+0

Kodunuzda ya talebi okuduğunuzu gördüm.Form veya request.Content. Bir HttpRequestBase nesnesinin hem önemli içeriğe sahip olup olmadığını bilmek isterim merak ediyorum: – StackOverflowVeryHelpful

+0

@StackOverflowVeryHelpful: Hayır. Form verileri İçerikte gelir. Dolayısıyla, Form boş değilse, istek, istek girdi akışının veri oluşturduğunu ve ASP.NET'in bizim için ayrıştırdığını belirten bir HTTP üstbilgisini taşıdığı anlamına gelir; bu durumda, InputStream öğesinden hiçbir şey kalmaz. –

cevap

13

Oldukça basit. Bu snippet, ASP.NET's own open sourced source code'dan büyük ölçüde ilham aldı.

/// <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); 
     } 
    } 
} 
İlgili konular