对于我正在开发的项目,我们有一个桌面程序,可以联系商店的在线服务器。因为它在学校中使用,所以正确设置代理是很棘手的。我们所要做的是允许用户指定代理详细信息以供他们使用,否则它将使用IE中的代理。我们还试图绕过放入不正确的详细信息,因此代码会尝试用户指定的代理,如果失败则是默认代理,如果失败,则使用凭据,如果失败则为null。
我遇到的问题是,在代理设置需要连续更改的地方(例如,如果他们的注册因代理错误而失败,他们会改变一件小事再试一次,需要几秒钟。)我最终调用了HttpRequests .GetResponse()超时,导致程序冻结一段时间。有时如果我在更改之间留下一两分钟,它就不会冻结,但不会每次都冻结(现在在10分钟之后再次尝试,再次超时)。
我无法在代码中发现可能导致此问题的任何内容 - 尽管它看起来有点乱。我不认为可能是服务器拒绝请求,除非它是通用的服务器行为,因为我已经尝试过对我们的服务器和google.co.uk等其他人的请求。
我发布的代码是希望有人能够发现一些错误的东西,或者知道一种更简单的方式来做我们正在努力的事情。
我们运行的测试没有任何代理,因此通常会跳过第一部分。第一次运行ApplyProxy,它工作正常并完成第一个try块中的所有内容,第二个,它可以在第一个try块中的GetResponse上超时,然后遍历其余代码,或者它可以在那里工作对注册的实际请求超时。
代码:
void ApplyProxy() {
Boolean ProxySuccess = true;
String WebRequestURI = @"http://www.google.co.uk";
if (UseProxy)
{
try
{
String ProxyUrl = (ProxyUri.ToLower().Contains("http://")) ?
ProxyUri :
"http://" + ProxyUri;
WebRequest.DefaultWebProxy = new WebProxy(ProxyUrl);
if (!string.IsNullOrEmpty(ProxyUsername) && !string.IsNullOrEmpty(ProxyPassword))
WebRequest.DefaultWebProxy.Credentials = new NetworkCredential(ProxyUsername, ProxyPassword);
HttpWebRequest request = HttpWebRequest.Create(WebRequestURI) as HttpWebRequest;
request.Method = "GET";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
}
catch
{
ProxySuccess = false;
}
}
if(!ProxySuccess || !UseProxy)
{
try
{
WebRequest.DefaultWebProxy = WebRequest.GetSystemWebProxy();
HttpWebRequest request = HttpWebRequest.Create(WebRequestURI) as HttpWebRequest;
request.Method = "GET";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
}
catch (Exception e)
{ //try with credentials
//make a new proxy from defaults
WebRequest.DefaultWebProxy = WebRequest.GetSystemWebProxy();
String newProxyURI = WebRequest.DefaultWebProxy.GetProxy(new Uri(WebRequestURI)).ToString();
if (newProxyURI == String.Empty)
{ //check we actually get a result
WebRequest.DefaultWebProxy = null;
return;
}
//continue
WebProxy NewProxy = new WebProxy(newProxyURI);
NewProxy.UseDefaultCredentials = true;
NewProxy.Credentials = CredentialCache.DefaultCredentials;
WebRequest.DefaultWebProxy = NewProxy;
try
{
HttpWebRequest request = HttpWebRequest.Create(WebRequestURI) as HttpWebRequest;
request.Method = "GET";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
}
catch
{
WebRequest.DefaultWebProxy = null;
}
}
}
}
答案 0 :(得分:0)
是不是只需要设置HttpWebRequest的Timeout属性?可能是正在建立连接,但没有服务(例如,错误类型的代理服务器或停滞的服务器),在这种情况下,请求可能是在放弃之前等待超时时间 - 更短的超时可能在这里更喜欢。
答案 1 :(得分:0)
似乎是我的编程错误。请求保持打开状态,显然程序或服务器都不喜欢这样。只需关闭HttpWebRequests一次就可以解决这个问题。