Неожиданный EOF в HTTPS-запросе - PullRequest
0 голосов
/ 30 ноября 2009

У меня есть следующая функция, которая отправляет XML с помощью запроса Https

public WebResponse SendXmlPost(string url, string xml)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.KeepAlive = false;
    request.ProtocolVersion = HttpVersion.Version11;
    request.Method = "POST";

    if (this.UseBasicAuthentication)
    {
        string usernamePassword = this.Login + ":" + this.Password;
        request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));
        NetworkCredential cred = new NetworkCredential(this.Login, this.Password);
        request.Credentials = cred;
    }

    if (this.desactivateCertificateChecking)
    {
        System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        };
    }

    byte[] postBytes = Encoding.UTF8.GetBytes(xml);

    request.ContentType = "text/xml";
    request.ContentLength = postBytes.Length;
    Stream requestStream = request.GetRequestStream(); //error occurs here

    requestStream.Write(postBytes, 0, postBytes.Length);
    requestStream.Close();

    WebResponse response = request.GetResponse();

    return response;
}

Когда я вызываю этот метод, у меня возникает исключение "неожиданный EOF":

System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count) +7067555
   System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) +116
   System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) +123
   System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) +7243141
   System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) +217
   System.Threading.ExecutionContext.runTryCode(Object userData) +376

Любая подсказка?

Спасибо

1 Ответ

0 голосов
/ 30 ноября 2009

Я думаю, что ваша проблема в кодировке UTF8. По умолчанию кодировка UTF-8 добавляет спецификацию (ByteOrderMark), и ваш ContentLength не синхронизирован с передаваемыми данными. Попробуйте создать кодировку UTF8 без спецификации (используйте другую перегрузку), и это должно решить проблему.

Кроме того, я бы сам не добавил Basic auth header. Я просто установил бы crdentials в запросе и позволил HttpWebRequest сделать авторизацию для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...