2009-09-12 22 views
6

Tôi đang tạo một chương trình kết nối với một trang web và tải xuống XML từ đó. Sau đó, nó sẽ hiển thị thông tin cho người dùng.Thời gian dài để tải kết nối đầu tiên trong C# .NET

Sự cố tôi gặp phải là khi lần đầu tiên tôi mở chương trình và bắt đầu tải xuống thông tin XML phải mất một thời gian rất dài. Khi tôi tải một trang khác từ trang web với chương trình vẫn mở, phải mất khoảng nửa giây để tải xuống. Tôi đã tự hỏi liệu có cách nào để tránh điều này không.

Tôi hiện đang sử dụng HttpWebRequest để tải xuống luồng và StreamReader để đọc. Sau đó, tôi đi qua và phân tích cú pháp XML bằng XLINQ.

+1

Sự chậm trễ chỉ lần đầu tiên truy cập trang web phân phát XML - tức là, trên lần truy cập tiếp theo có truy xuất nhanh XML không? Nếu nó có thể là thời gian khởi động ban đầu của ứng dụng web phục vụ XML ... –

+0

Điều đó cũng xảy ra với máy chủ cập nhật của tôi trong khi tôi đang kiểm tra các bản cập nhật, tôi cũng đã thử kết nối với http://google.com và nó vẫn làm điều tương tự. Cùng một kết quả với một WebClient thay vì một HttpWebRequest cũng. – Christian

+0

Ồ, đồng thời, khi tôi kết nối với BẤT CỨ máy chủ, tất cả các máy chủ khác đều tải nhanh. – Christian

Trả lời

14

Hãy thử đặt proxy một cách rõ ràng. Nếu bạn chưa xác định proxy, lớp HttpRequest sẽ dành thời gian tìm kiếm một proxy. Một khi nó đã (hoặc chưa) tìm thấy một, nó sẽ sử dụng thông tin đó cho cuộc sống của ứng dụng, tăng tốc các yêu cầu tiếp theo.

//internally sets "ProxySet" to true, so won't search for a proxy 
request.Proxy = null; 

Bạn cũng có thể định nghĩa này trong .config:

<system.net> 
    <defaultProxy 
    enabled="false" 
    useDefaultCredentials="false" > 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 
+2

Dựa trên những gì anh ta nói cho đến nay, điều này nghe có vẻ giống như lời giải thích tốt nhất. Tò mò để xem những gì Christian tìm thấy. – JoshBerke

+4

Điều này đã hiệu quả! Cảm ơn bạn rất nhiều :) – Christian

+1

@Rex M: Cảm ơn rất nhiều vì điều này, vấn đề này đã khiến tôi phát điên và cuối cùng đã được sắp xếp với tinh chỉnh này .. +1 .. –

0

Có thể bạn sẽ phải thực hiện thêm một số nghiên cứu để tìm ra phần nào của yêu cầu mất nhiều thời gian hơn trên thẻ đầu tiên. Bản năng đầu tiên của tôi nói rằng yêu cầu DNS để lấy địa chỉ IP cho tên miền bạn chỉ định mất nhiều thời gian hơn, vì nó không được lưu trong bộ nhớ cache khi nó chạy lần đầu tiên. Nó cũng có thể là máy chủ web ở đầu bên kia mà phải chạy một số kịch bản khởi động trong lần đầu tiên bạn truy vấn nó. Bạn đã đề cập rằng yêu cầu đầu tiên mất một thời gian dài, nhưng bạn không nói bao lâu. Điều này gây ra một vấn đề lớn mà phải mất quá lâu để thực hiện yêu cầu đầu tiên, hoặc nó chỉ là một ít phiền toái?

+0

Xem nhận xét của tôi ở trên để trả lời Guy Starbuck. Đối với bao lâu, nó thay đổi nhưng thường là bất cứ nơi nào từ 15 đến 45 giây. Nó không phải là một vấn đề lớn nhưng nó là một sự khó chịu, đặc biệt là khi tôi chuyển chương trình sang Windows Mobile. – Christian

+1

"15 đến 45 giây", hầu như không có cách nào mà tra cứu DNS mất nhiều thời gian mỗi khi ứng dụng của bạn khởi động. –

1

Việc chậm trễ lần đầu tiên có thể là do sự kết hợp giữa các nội dung sau:

  1. Thời gian để giải quyết các máy chủ DNS nhập
  2. Thời gian để tải xuống mã số tự động định cấu hình, biên dịch và thực hiện để xác định hiệu quả Proxy
  3. độ trễ mạng từ ứng dụng của bạn đến máy chủ proxy (nếu có một máy chủ proxy trong môi trường của bạn)
  4. độ trễ mạng từ máy chủ proxy để máy chủ đích thực sự.
  5. Độ trễ trên máy chủ để phân phối tài liệu XML . Nếu nó phải đi qua một biểu tượng đối tượng trong bộ nhớ và tạo tài liệu XML, thì có thể mất chút thời gian. Ngoài ra, nếu nó là sử dụng các kỹ thuật như XML Serialization để tạo ra các tài liệu , sau đó tùy thuộc vào cách serializer được cấu hình, các cuộc gọi đầu tiên để serialize/deserialize luôn mất một thời gian dài, do thực tế rằng một bộ phận trung gian cần để được tạo và biên dịch.
  6. Phân tích cú pháp XML ở phía máy khách có thể mất thời gian, đặc biệt nếu cấu trúc tài liệu XML rất phức tạp.
  7. Nếu XLinq (như XMLSerializer) tạo lắp ráp tạm thời cho XML phân tích & truy vấn, sau đó các yêu cầu đầu tiên sẽ mất thời gian nhiều hơn những người tiếp theo.

Để tìm ra một phần là dành thời gian, chèn một số thời gian đăng nhập vào mã của bạn sử dụng System.Diagnostics.Stopwatch():

// this is the time to get the XML doc from the server, including the time to resolve DNS, get proxy etc. 
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); 
timer.Start(); 
HttpWebResponse resp = (HttpWebResponse)request.GetResponse(); 
timer.Stop(); 
Console.WriteLine("XML download took: " + timer.ElapsedMilliseconds); 

timer.Start(); 
// now, do your XLinq stuff here... 
timer.Stop(); 
Console.WriteLine("XLinq took: " + timer.ElapsedMilliseconds); 

Bạn có thể chèn một vòng xung quanh này, và xem những gì sự khác biệt cho các thành phần khác nhau giữa yêu cầu đầu tiên và các yêu cầu tiếp theo là.

Nếu bạn thấy rằng sự khác biệt trong quá trình tải xuống và không phải là truy vấn, thì bạn có thể điều tra thêm bằng cách sử dụng tính năng dò tìm mạng bằng cách sử dụng Wireshark.

Hy vọng điều này sẽ hữu ích.

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