2010-01-21 42 views
6

Tôi muốn tạo các yêu cầu HTTP tùy chỉnh của riêng mình. Lớp WebClient rất tuyệt, nhưng nó tự động tạo ra các yêu cầu HTTP. Tôi nghĩ rằng tôi cần phải tạo một kết nối mạng với máy chủ web và chuyển dữ liệu của tôi qua luồng đó, nhưng tôi không quen thuộc với các lớp thư viện có thể hỗ trợ loại điều đó.Làm cách nào để tạo Yêu cầu HTTP theo cách thủ công trong .Net?

(Context, tôi đang làm việc trên một số mã cho một lớp học lập trình web mà tôi đang giảng dạy. Tôi muốn học sinh của mình để hiểu những điều cơ bản về những gì đang xảy ra bên trong "hộp đen" của HTTP.)

Trả lời

17

Để thực sự hiểu được bên trong của giao thức HTTP bạn có thể sử dụng TcpClient lớp:

using (var client = new TcpClient("www.google.com", 80)) 
{ 
    using (var stream = client.GetStream()) 
    using (var writer = new StreamWriter(stream)) 
    using (var reader = new StreamReader(stream)) 
    { 
     writer.AutoFlush = true; 
     // Send request headers 
     writer.WriteLine("GET/HTTP/1.1"); 
     writer.WriteLine("Host: www.google.com:80"); 
     writer.WriteLine("Connection: close"); 
     writer.WriteLine(); 
     writer.WriteLine(); 

     // Read the response from server 
     Console.WriteLine(reader.ReadToEnd()); 
    } 
} 

Một khả năng khác là để activate tracing bằng cách đặt như sau vào số app.config và chỉ sử dụng WebClient để thực hiện yêu cầu HTTP:

<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.Net" tracemode="protocolonly"> 
     <listeners> 
      <add name="System.Net"/> 
     </listeners> 
     </source> 
    </sources> 
    <switches> 
     <add name="System.Net" value="Verbose"/> 
    </switches> 
    <sharedListeners> 
     <add name="System.Net" 
      type="System.Diagnostics.TextWriterTraceListener" 
      initializeData="network.log" /> 
    </sharedListeners> 
    <trace autoflush="true"/> 
    </system.diagnostics> 
</configuration> 

Sau đó, bạn có thể thực hiện một cuộc gọi HTTP:

using (var client = new WebClient()) 
{ 
    var result = client.DownloadString("http://www.google.com"); 
} 

Và cuối cùng phân tích lưu lượng mạng trong tạo network.log tập tin. WebClient cũng sẽ thực hiện theo các chuyển hướng HTTP.

+0

Ví dụ tuyệt vời, tôi rất mong được dùng thử. Đây là một cách tuyệt vời để hình dung những gì đang xảy ra. Cảm ơn – Jeff

4

Sử dụng các lớp học WebRequest hoặc WebResponse, theo yêu cầu.

Nếu bạn cần xuống cấp thấp hơn những cung cấp này, hãy xem System.Net.Sockets khác. * Lớp khách hàng như TcpClient.

2

Khám phá System.Net.Sockets.TcpClient nếu bạn muốn viết ứng dụng khách cấp thấp của riêng mình. Đối với HTTP GET và POST, bạn có thể sử dụng các lớp HttpWebRequestHttpWebResponse.

Nếu bạn thực sự bạo dâm, bạn có thể xuống thấp hơn TcpClient và triển khai Socket của riêng bạn, xem Socket class.

+0

Yikes. Đường dài, dài để yêu cầu web. –

+1

Sử dụng TcpClient cũng sẽ yêu cầu anh ta hiểu giao thức TELNET mà Http được xây dựng trên đó. –

+1

@John: Còn một phần thưởng khác! –

2

Trong phản hồi của tôi đối với bài đăng SO này SharePoint 2007, how to check if a folder exists in a document library Tôi đã bao gồm các khái niệm cơ bản về việc tạo HttpWebRequest và phản hồi đọc.

Edit: thêm một ví dụ mã từ bài viết ở trên

System.Net.HttpWebRequest oReq; 
string sUrl = "http://yoursite/sites/somesite/DocumentLibrary"; 
oReq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(sUrl); 

oReq.Method = "GET"; 
oReq.Credentials = System.Net.CredentialCache.DefaultCredentials; 
oReq.AllowAutoRedirect = true; 

//now send the request 
using (System.IO.StreamWriter oRequest = 
     new System.IO.StreamWriter(oReq.GetRequestStream())) { 
    oRequest.WriteLine(); 
} 

//and read all the response 
using (System.Net.HttpWebResponse oResponse = oReq.GetResponse()){ 
    using (System.IO.StreamReader oResponseReader = 
     new System.IO.StreamReader(oResponse.GetResponseStream())){ 
    string sResponse = oResponseReader.ReadToEnd(); 
    } 
} 
+0

-1: Thiếu các khối 'sử dụng' cho StreamReader/Writer và cho phản hồi. –

+1

@John Saunders: Tôi biết rằng "sử dụng" là một mô hình tốt cho mã hóa, tuy nhiên - gọi close() trên trình streamreader KHÔNG đóng luồng cơ bản và "giải phóng mọi tài nguyên hệ thống liên quan đến trình đọc" (xem MSDN để biết tài liệu). Vì vậy, bạn là sai nếu bạn nghĩ rằng tôi đang leeking một cái gì đó ở đây. – naivists

+0

Bạn đang bị rò rỉ nếu một số công cụ inbetween ném một ngoại lệ. – nos

1

Sử dụng WFetch để trình diễn.

Đối với lập trình, HttpWebRequest phép bạn kiểm soát khá một chút thông tin về yêu cầu - một lần nữa nếu đó là cho một cuộc biểu tình tôi muốn sử dụng Wireshark để sniff gì đang xảy ra trong vòng dây khi bạn làm nhiệm vụ khác nhau với HttpWebRequest

Các vấn đề liên quan