1

I have a number of ASP.NET websites and a webservice that use the same code to "login" to a third party website. This includes basically using a WebRequest to do a HTTP POST to the login page of the website with my credentials, storing the resulting cookie in a CookieContainer and using that CookieContainer in any following WebRequests to authorize my website to pages on the third party website.

The code is basically as follows:

    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();
    }

This code has been working for a LONG time (months, over half a year). Since this weekend it has started failing very often (90% of the time I estimate, but not 100% of the time). The error I keep seeing is: 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. The stack-trace is as follows:

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()

When I google this error the only solution I keep seeing is to disable the KeepAlive property of the WebRequest and/or setting the ProtocolVersion to HttpVersion10. I tried both (in every combination possible) and nothing helps.

The error does not appear always, but when it does appear I can keep trying all I like, I will keep getting the error again and again and again. If I leave it for a few minutes and try again, I have a chance that it will work (and once it does, it will keep working for a while).

The strange part is that I did not change anything on my end; this code has been running for months without problems. It is entirely possible that the third party website changed something on their end, and/or my webhosting provider changed something. But just in case I can do something to remedy this problem I wanted to ask if I am doing something wrong.

I could contact the third party website (will probably not get a response) or my webhosting, but I'd need a better idea of what exactly is going wrong because just throwing this error to them will probably not help them.

So, is there anything I can do, or is there a good reason why I am suddenly seeing this error across all of my websites (they are all connecting to the same third party site)?

Thanks

Nick Thissen
  • 1,802
  • 4
  • 27
  • 38
  • Try to figure this out using a sniffer (like Wireshark - http://www.wireshark.org/) – Maxim Apr 17 '13 at 19:02
  • 1. Are you behind a proxy or firewall? 2. Can you use Fiddler to sniff the packet requests in between the 2 servers? – Pure.Krome Jun 11 '13 at 11:11
  • 1. I have no clue, I'm talking about running this code on the webserver (which I rent) so I assume there is a firewall involved. I don't have enough access to the server (apart from a web control panel) so I cannot check (I can ask support though). 2. I have no clue how to use Fiddler, I've tried it a couple times but got nowhere especially communication between two servers outside of my control. – Nick Thissen Jun 11 '13 at 14:45

1 Answers1

0

Since this happens intermittently you might need to contact the server administrator and find out whats going on. It's possible the server simply rejects or closes off the connection due to load, misconfiguration or some other network issue.