2009-07-13 47 views
27

Tôi có API dựa trên HTTP mà tôi có khả năng cần phải gọi nhiều lần. Vấn đề là tôi không thể nhận được yêu cầu để có ít hơn khoảng 20 giây, mặc dù cùng một yêu cầu được thực hiện thông qua một trình duyệt là gần tức thời. Đoạn mã sau minh họa cách tôi đã thực hiện nó cho đến nay.Cách thực hiện yêu cầu web nhanh trong C#

WebRequest r = HttpWebRequest.Create("https://example.com/http/command?param=blabla"); 
var response = r.GetResponse(); 

Một giải pháp sẽ là đưa ra yêu cầu không đồng bộ nhưng tôi muốn biết lý do mất quá nhiều thời gian và nếu tôi có thể tránh nó. Tôi cũng đã thử bằng cách sử dụng lớp WebClient nhưng tôi nghi ngờ nó sử dụng một WebRequest nội bộ.

Cập nhật:

Chạy đoạn mã sau mất khoảng 40 giây trong phiên bản Chế độ (đo bằng Stopwatch):

WebRequest g = HttpWebRequest.Create("http://www.google.com"); 
var response = g.GetResponse(); 

Tôi đang làm việc tại một trường đại học nơi có thể có những điều khác nhau trong cấu hình mạng ảnh hưởng đến hiệu suất, nhưng việc sử dụng trực tiếp trình duyệt minh họa rằng nó sẽ ở gần ngay lập tức.

Cập nhật 2:

Tôi đã tải lên mã đến một máy từ xa và nó làm việc tốt để kết luận phải được rằng mã NET làm điều gì đó thêm so với trình duyệt hoặc nó có vấn đề giải quyết địa chỉ thông qua mạng lưới đại học (vấn đề proxy hay gì đó ?!).

+6

Làm cách nào bạn xác định rằng đó là yêu cầu web cần có thời gian? Tôi thường không có bất kỳ vấn đề hiệu suất với lớp HttpWebRequest. Bạn đã thử ứng dụng thực hiện một số cuộc gọi chưa, và nếu có, mọi cuộc gọi có mất nhiều thời gian không? –

+1

Điều đó có xảy ra với tất cả các url, chẳng hạn như google.com không? Điều gì về việc sử dụng một url không ssl? – tbreffni

+0

Vâng, ý kiến ​​và đề xuất của Fredrik rất tốt. Không có lý do gì mà HttpWebRequest nên có hiệu năng kém trong bất kỳ cách nào (hãy để một mình * rằng * người nghèo) - sau khi tất cả nó sử dụng giao thức giống như trình duyệt. – Noldorin

Trả lời

3

Trang web của bạn có chứng chỉ SSL không hợp lệ không? Thử thêm

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AlwaysAccept); 

//... somewhere AlwaysAccept is defined as: 

using System.Security.Cryptography.X509Certificates; 
using System.Net.Security; 

public bool AlwaysAccept(object sender, X509Certificate certification, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
{ 
    return true; 
} 
27

Vấn đề này này cũng tương tự như một bài đăng trên StackOverflow: Stackoverflow-2519655(HttpWebrequest is extremely slow)

Hầu hết thời gian vấn đề là tài sản Proxy server. Bạn nên đặt thuộc tính này là null, nếu không đối tượng sẽ cố tìm kiếm một máy chủ proxy thích hợp để sử dụng trước khi chuyển trực tiếp đến nguồn. Lưu ý: thuộc tính này được bật theo mặc định, vì vậy bạn phải nói rõ đối tượng không thực hiện tìm kiếm proxy này.

request.Proxy = null; 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
} 
+1

upvoting, có vẻ như nó cũng đúng đối với HttpClient –

13

Tôi đã có thời gian trễ 30 giây cho lần thử 'đầu tiên' - tham chiếu của JamesR cho bài đăng khác đề cập đến việc đặt proxy thành vô hiệu hóa ngay lập tức!

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_site.url); 
request.Proxy = null; // <-- this is the good stuff 

... 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
1

Bạn không đóng Yêu cầu của mình. Ngay sau khi bạn nhấn số lượng kết nối được cho phép, bạn phải đợi những lần trước đó hết thời gian chờ. Hãy thử

using (var response = g.GetResponse()) 
{ 
    // do stuff with your response 
} 
Các vấn đề liên quan