базовое соединение закрыто по HttpWebRequest POST на рабочем сервере - PullRequest
3 голосов
/ 23 ноября 2010

Я получаю «Основное соединение было закрыто: соединение было неожиданно закрыто».Ошибка при попытке POST с использованием класса HttpWebRequest на рабочем сервере, на моем компьютере разработчика он работает нормально.

Первоначально я пытался использовать класс WebClient, но я переключился на HttpWebRequest, чтобы попробовать некоторые из советов, которые я обнаружил при исследовании проблемы (например, установить KeepAlive в false, PreAuthenticate true и ProtocolVersion в 1.0).

Так как это происходит только на рабочем сервере, я предполагаю, что это может иметь какое-то отношение к IIS.

Вот мой код

        HttpWebRequest HttpWReq =
        (HttpWebRequest)WebRequest.Create(webURL);

        ASCIIEncoding encoding=new ASCIIEncoding();
        Byte[] postbytes = Encoding.ASCII.GetBytes(data);

        HttpWReq.Headers.Add("Authorization",
                  String.Format("Basic {0}", authstring));
        HttpWReq.KeepAlive = false;
        HttpWReq.PreAuthenticate = true;  
        HttpWReq.Credentials = CredentialCache.DefaultCredentials;
        HttpWReq.UseDefaultCredentials = true;
        HttpWReq.ProtocolVersion = HttpVersion.Version10;


        HttpWReq.Method = "POST";
        HttpWReq.ContentType = "application/x-www-form-urlencoded";
        HttpWReq.ContentLength = postbytes.Length;

        Stream newStream = HttpWReq.GetRequestStream();
        newStream.Write(postbytes, 0, postbytes.Length);
        newStream.Close();

И код, который я изначально пробовалиспользуя класс WebClient

  /*  WebClient client = new WebClient();
    client.Headers.Add("Authorization",
              String.Format("Basic {0}", authstring));
    client.Headers.Add("Content-Type",
                       "application/x-www-form-urlencoded");
    client.UseDefaultCredentials = true;
    System.Net.ServicePointManager.Expect100Continue =  false;

     Byte[] postbytes = Encoding.ASCII.GetBytes(data);

    byte[] resp = client.UploadData(webURL, "POST", postbytes); */

Спасибо, любая помощь будет оценена.

РЕДАКТИРОВАТЬ:

Использование Fidler для проверки заголовка я получил этоinfo

POST [MyWebSite] HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-            flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Referer: [MyWebSite]
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; GTB6.5; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: [MyHost]
Content-Length: 188
Connection: Keep-Alive
Pragma: no-cache
Cookie: __utma=62854692.1254171006.1276438746.1289273298.1289317993.21; __utmz=62854692.1277743505.3.3.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=yeled; ASPSESSIONIDQQQRCRAT=ANNHGGNBNOFNFCLHPBEJIMLC

__VIEWSTATE=%2FwEPDwUKMjA0OTM4MTAwNGRktZi0IsIUo6MOCYTxun8p8Po4AWeTtipGZ4L9%2FkY3KZU%3D&__EVENTVALIDATION=%2FwEWAgLHhsXtBwK14deQBbiFCpWBnsp%2BicqBy%2FNXAkhuVDX9WF1jZayRuTgPc3Ov&btnTest=Test

EDIT2

Если установить для Target Framework (я использовал новый проект для тестирования) значение 2.0 (я не тестировал каждую версию фреймворка) оно работает.Я предполагаю, что .net по-разному обрабатывает безопасность в .net 4.0.Это не решение, но я надеюсь, что кто-нибудь сможет использовать эту информацию, чтобы помочь мне решить эту проблему.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

Это классический пример поддержания активности и продолжения 100.Все случаи, которые я видел до сих пор, были связаны с этой проблемой, поэтому я бы сказал, что вы на правильном пути.

Прежде всего, используйте Fiddler, чтобы получить представление необработанного запроса, чтобы увидеть, как выглядит ваш запрос.Бьюсь об заклад, у вас там Expect:100-continue.поэтому попробуйте HttpWReq.Expect="";

Похоже, что вы используете проверку подлинности Windows, попробуйте отключить ее, чтобы посмотреть, могут ли это вызывать проблемы - очевидно, вы не можете отключить это все время, просто посмотрите, как это происходит.

ОБНОВЛЕНИЕ

Прежде всего, я почти уверен, что это не тот запрос, который вы отправляете.Это пользовательский агент, который сообщает мне, что это не ваш HttpWebRequest:

Mozilla / 4.0 (совместимый; MSIE 7.0; Windows NT 5.1; Trident / 4.0; GTB6.5; InfoPath.2; .NETCLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)

Также существует состояние просмотра, которое заставляет меня верить, что это просто еще один запрос отпросматривать.Также не протокол, который 1.1.

Я также заметил, что вы не получаете ответ, который может быть связан с ним.Вам нужно вызвать request.GetResponseStream и прочитать его.

0 голосов
/ 24 ноября 2010

Похоже, проблема с разрешениями. Если я изменю учетную запись пула приложений в IIS с ASP.net на NTService, она будет отправлена ​​правильно. Я попытаюсь выяснить, какое конкретное разрешение требуется, и посмотреть, смогу ли я предоставить его учетной записи asp.net.

UPDATE

Я не уверен, что именно это сделал, но после изменения некоторых разрешений на запись для учетной записи пользователя, которая работает на сервере, и перезапуска, она теперь работает.

В конце концов я смог использовать класс-оболочку WebClient.

    WebClient client = new WebClient();

    client.Headers.Add("Authorization",
                          String.Format("Basic {0}", authstring));
    client.Headers.Add("Content-Type",
                       "application/x-www-form-urlencoded");
    client.UseDefaultCredentials = true;

    byte[] resp = client.UploadData(url, "POST", postbytes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...