2009-08-06 19 views
6

का उपयोग कर SSL अनुरोधों के लिए होस्ट शीर्षलेख मान कैसे सेट करें मैं वेब अनुप्रयोगों के लिए एक विशिष्ट वेब सर्वर पर HTTP GET अनुरोध करने के लिए System.Net.HttpWebRequest क्लास का उपयोग करने का प्रयास कर रहा हूं, जिसे हमने कई सर्वरों पर संतुलित लोड किया है। इसे प्राप्त करने के लिए, मुझे अनुरोध के लिए होस्ट हेडर मान सेट करने में सक्षम होना चाहिए, और मैं System.Net.WebProxy क्लास का उपयोग करके इसे प्राप्त करने में सक्षम हूं।HttpWebRequest

हालांकि, जब मैं एसएसएल का उपयोग कर जीईटी करने की कोशिश करता हूं तो यह सब टूट जाता है। जब मैं ऐसा करने का प्रयास करता हूं, तो HttpWebRequest.GetResponse पर कॉल 400. (HTTP अनुरोध) के HTTP स्थिति कोड के साथ System.Net.WebException फेंकता है।

क्या मैं HttpWebRequest के साथ संभव हासिल करने की कोशिश कर रहा हूं, या क्या मुझे यह करने के लिए एक वैकल्पिक तरीका तलाशना चाहिए?

using System; 
using System.Web; 
using System.Net; 
using System.IO; 

namespace UrlPollTest 
{ 
    class Program 
    { 
     private static int suffix = 1; 
     static void Main(string[] args) 
     { 
      PerformRequest("http://www.microsoft.com/en/us/default.aspx", "www.microsoft.com"); 
      PerformRequest("https://www.microsoft.com/en/us/default.aspx", ""); 
      PerformRequest("https://www.microsoft.com/en/us/default.aspx", "www.microsoft.com"); 

      Console.WriteLine("Press any key to continue"); 
      Console.ReadKey(); 
     } 

     static void PerformRequest(string AUrl, string AProxy) 
     { 
      Console.WriteLine("Fetching from {0}", AUrl); 
      try 
      { 
       HttpWebRequest request = WebRequest.Create(AUrl) as HttpWebRequest; 
       if (AProxy != "") 
       { 
        Console.WriteLine("Proxy = {0}", AProxy); 
        request.Proxy = new WebProxy(AProxy); 
       } 

       WebResponse response = request.GetResponse(); 
       using (Stream httpStream = response.GetResponseStream()) 
       { 
        using (StreamReader reader = new StreamReader(httpStream)) 
        { 
         string s = reader.ReadToEnd(); 
         File.WriteAllText(string.Format("D:\\Temp\\Response{0}.html", suffix++), s); 
        } 
       } 
       Console.WriteLine(" Success"); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(" " + e.Message); 
      } 
     } 
    } 
} 
+0

वास्तविक प्रश्न: आप कैसे जानते हैं कि आपको होस्ट-हेडर की आवश्यकता है? "जब आप एसएसएल का उपयोग करते हैं तो HTTP 1.1 होस्ट हेडर समर्थित नहीं हैं" http://support.microsoft.com/kb/187504। – russau

+0

दूसरा विचार: क्या आप ब्राउज़र में एसएसएल पर फ़ाइल प्राप्त कर सकते हैं? – russau

+1

मुझे होस्ट हेडर सेट करने की आवश्यकता है, इसलिए यदि वेब अनुप्रयोग एकाधिक सर्वरों पर संतुलित होता है तो मैं हिट करने के लिए सटीक सर्वर निर्दिष्ट कर सकता हूं। यह कोड एक वेब निगरानी और परीक्षण ढांचे का हिस्सा है जिसे मैं लिख रहा हूं। और हाँ, एसएसएल अनुरोध है कि मैं ब्राउज़र में काम करने का प्रयास कर रहा हूं, इसलिए समस्या कहीं भी है जो मैं कोड में समान कार्यक्षमता को लागू करने का प्रयास कर रहा हूं। आपके द्वारा लिंक किया गया आलेख बताता है कि SSL अनुरोधों के लिए होस्ट हेडर समर्थन Windows Server 2003 SP1 में उपलब्ध कराया गया था, और हमारे सभी सर्वर पूरी तरह से पैच किए जाने चाहिए। – Cleggy

उत्तर

2

मैंने पहले एक hacky दृष्टिकोण का उपयोग किया है - - एक परीक्षण exe कि मेरी "मेजबान" को संशोधित होने के:

यहाँ कोड मैं सभी काम करने के लिए कोशिश करते हैं और इसे पाने के लिए प्रयोग कर रहे है फ़ाइल, फार्म नाम के लिए विशिष्ट सर्वर के पते पर प्रविष्टि इंजेक्शन (और ipconfig /flushdns जारी करना)। इसके बाद, अनुरोध सही सर्वर पर रूट किए जाने चाहिए जैसे कि यह केवल एक ही था।

स्पष्ट रूप से इसके लिए व्यवस्थापक पहुंच की आवश्यकता है ... मैं इसे स्वचालित हिट-टेस्ट के हिस्से के रूप में उपयोग करता हूं ताकि खेत को मारने के लिए यह व्यक्तिगत मशीनें हों।

दूसरी चीज जो आप कोशिश कर सकते हैं वह एनएलबी पर कुछ है, शायद टीसीएल (एफ 5 के मामले में) - शायद एनएलबी समझने वाले कस्टम हेडर को जोड़ सकता है? (मान लीजिए कि यह एसएसएल पुनः हस्ताक्षर कर रहा है)।

+0

सुझाव के लिए धन्यवाद, लेकिन यह हमारे लिए काम नहीं करेगा। हम एक ही समय में कई धागे चलाएंगे, और निश्चित रूप से उस परिदृश्य में HOSTS प्रविष्टि विवाद हो सकते हैं। –

0

.NET 4.0 में होस्ट हेडर को यूआरएल से स्वतंत्र रूप से सेट किया जा सकता है कि अनुरोध करने जा रहा है, इसलिए मैं आपको सलाह दूंगा कि आप अपनी समस्या को हल करने के लिए HttpwebRequest.Host का उपयोग करें। यह (मुझे लगता है) .NET 4.0 बीटा 2 के हिस्से के रूप में शिप करेगा। WebRequest के अपने स्वयं के कस्टम उप-वर्ग को लागू किए बिना नेट के पिछले संस्करणों के तहत अलग होने के लिए होस्ट हेडर को फिर से लिखने का कोई तरीका नहीं है (मेरा विश्वास है, यह कोशिश की गई है)।