我有一些ASP.NET网站和一个the服务,使用相同的代码“登录”到第三方网站。这包括使用WebRequest使用我的凭据对网站的登录页面进行HTTP,将产生的cookie存储在CookieContainer中,并在任何后续的WebRequests中使用该CookieContainer授权我的网站访问第三方网站上的页面。
该守则基本上如下:
public LoginResults Login()
{
// Create the webrequest
var request = CreateInitialWebRequest(LOGIN_URL);
request.AllowAutoRedirect = false;
// Set the cookiecontainer, which will be filled with the authentication cookies
this.cookieContainer = new CookieContainer();
request.CookieContainer = this.cookieContainer;
// Set the username and pw in a HTTP POST call
SetPostContent(request, string.Format(LOGIN_PARAMETERS, this.Username, this.Password));
// Read the response
using (var httpWebResponse = (HttpWebResponse)request.GetResponse())
{
using (var responseStream = httpWebResponse.GetResponseStream())
{
// Omitted:
// read response and determine if login was successful
}
}
}
private HttpWebRequest CreateInitialWebRequest(string uri)
{
var request = (HttpWebRequest)WebRequest.Create(uri);
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
return request;
}
private HttpWebRequest CreateWebRequest(string uri)
{
var request = this.CreateInitialWebRequest(uri);
request.CookieContainer = cookieContainer;
request.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/x-shockwave-flash, */*";
request.UserAgent = "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506; .NET CLR 3.5.21022)";
request.Method = "GET";
request.Timeout = 10000; // 10 sec
return request;
}
private static void SetPostContent(HttpWebRequest req, string postData)
{
req.Method = "POST";
byte[] bytes = new ASCIIEncoding().GetBytes(postData);
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = (long)bytes.Length;
((WebRequest)req).GetRequestStream().Write(bytes, 0, bytes.Length);
((WebRequest)req).GetRequestStream().Close();
}此代码已经运行了很长时间(几个月,半年以上)。从这个周末开始,它开始经常失败(我估计90%的时间,但不是100%的时间)。我一直看到的错误是:System.Net.WebException:基础连接已关闭:发送时发生了意外错误。-> System.IO.IOException:由于意外的数据包格式,握手失败。堆栈跟踪如下:
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. ---> System.IO.IOException: The handshake failed due to an unexpected packet format.
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Net.TlsStream.CallProcessAuthentication(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.ConnectStream.WriteHeaders(Boolean async)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
at iRacingForumService.HttpPost.SetPostContent(HttpWebRequest req, String postData)
at iRacingForumService.HttpPost.Login()当我搜索此错误时,我一直看到的唯一解决方案是禁用WebRequest的WebRequest属性和/或将ProtocolVersion设置为HttpVersion10。我尝试了这两种方法(在所有可能的组合中),但没有任何帮助。
错误并不总是出现,但当它出现时,我可以继续尝试我喜欢的一切,我会一次又一次地得到错误。如果我离开它几分钟,然后再试一次,我就有机会让它工作(一旦它成功了,它就会继续工作一段时间)。
奇怪的是,我没有在我的终端上更改任何东西;这段代码已经运行了几个月,没有出现问题。这是完全有可能的第三方网站改变在他们的一端,和/或我的网站托管提供商改变了一些东西。但万一我能做些什么来补救这个问题,我想问我是否做错了什么。
我可以联系第三方网站(可能不会得到回复)或我的网站托管,但我需要一个更好的想法,究竟是什么问题,因为只是把这个错误扔给他们可能不会有帮助。
那么,有什么我可以做的,或者有一个很好的理由,为什么我突然看到这个错误跨越我的所有网站(他们都连接到同一个第三方网站)?
谢谢
发布于 2013-04-17 18:37:49
由于这种情况时断时续地发生,您可能需要与服务器管理员联系,并了解发生了什么。服务器可能会因为负载、配置错误或其他网络问题而简单地拒绝或关闭连接。
https://stackoverflow.com/questions/16067361
复制相似问题