Во второй раз, когда я использую «getResponse ()» в HttpPost, он работает только пошаговая отладка - PullRequest
2 голосов
/ 10 января 2012

Я использую C # на VS2010, FrameWork 4.0.Я написал консольное приложение, которое последовательно выполняет два вызова Http-Post.Второй вызов использует на входе то, что возвращается первым.Хорошо, когда я запускаю приложение в режиме отладки, шаг за шагом (F10), используя точки останова, все работает нормально.Но если я удаляю точки останова и нажимаю «F5», я получаю исключение, когда мой код выполняет «webRequest.getResponse ()» во ВТОРОМ вызове Http-Post, вероятно из-за тайм-аута, потому что ошибка занимает около 60 секунд, чтобы появиться.

Исключение составляет: ErrorCode 10054 - удаленное хостовое соединение было принудительно закрыто.

Это класс, используемый моим приложением (консольное приложение вызывает метод «Поиск»):

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Net;
using System.IO;

namespace MyNamespace
{
    public class MyClass
    {
        private string SearchId { get; set; }
        private string XmlOutputSearch { get; set; }

        public MyClass()
        {
            SearchId = "";
            XmlOutputSearch = "";
        }

        public string Search()
        {
            StartSearch();
            CheckResults();
            return XmlOutputSearch;
        }

        public void StartSearch()
        {
            string sInput = "[myStartSearchXmlRequest]";
            string sOutput = HttpPost(sInput);

            XmlDocument myXmlDoc = new XmlDocument();
            myXmlDoc.LoadXml(sOutput);
            SearchId = myXmlDoc.SelectSingleNode("//SearchId").InnerXml;
        }

        public void CheckResults()
        {
            string sInput = "[myCheckResultsXmlRequest using SearchId]";
            XmlOutputSearch = HttpPost(sInput);
        }

        private string HttpPost(string parameters)
        {
            try
            {
                HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create("[myURI]");

                webRequest.ContentType = "text/xml";
                webRequest.Method = "POST";

                byte[] bytes = Encoding.ASCII.GetBytes(parameters);
                Stream os = null;
                try
                { // send the Post
                    webRequest.ContentLength = bytes.Length;   //Count bytes to send
                    os = webRequest.GetRequestStream();
                    os.Write(bytes, 0, bytes.Length);         //Send it
                }

                catch (WebException ex)
                {
                    throw ex;
                }
                finally
                {
                    if (os != null)
                    {
                        os.Close();
                    }
                }

                try
                { // get the response

                    // Here I get the exception, on webRequest.GetResponse(), when HttpPost is called 
                    // by CheckResults, if not in Step-By-Step mode
                    using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) 
                    {
                        if (webResponse == null)
                        { return null; }
                        StreamReader sr = new StreamReader(webResponse.GetResponseStream());
                        string sReturn = sr.ReadToEnd().Trim();
                        sr.Close();
                        webResponse.Close();
                        webRequest.Abort();

                        return sReturn;
                    }
                }
                catch (WebException wex)
                {
                    // This exception will be raised if the server didn't return 200 - OK  
                    // Try to retrieve more information about the network error  
                    if (wex.Response != null)
                    {
                        using (HttpWebResponse errorResponse = (HttpWebResponse)wex.Response)
                        {
                            Console.WriteLine(
                                "The server returned '{0}' with the status code {1} ({2:d}).",
                                errorResponse.StatusDescription, errorResponse.StatusCode,
                                errorResponse.StatusCode);
                        }
                    }
                }
            }
            catch (Exception excep)
            {
                Console.WriteLine("Exception in WebResponse. " + excep.Message + " - " + excep.StackTrace);
            }
            return null;
        } // end HttpPost 
    }
}

1 Ответ

0 голосов
/ 10 января 2012

Вы пытались увидеть, есть ли какие-либо ошибки в журнале событий? Попробуйте включить Tracing в своем сервисе, чтобы узнать точную причину. Вышеуказанная ошибка имеет следующее описание:

Сброс соединения по пиру. Существующее соединение было принудительно закрыто удаленным хостом. Обычно это происходит, если одноранговое приложение на удаленном хосте внезапно останавливается, хост перезагружается, хост или удаленный сетевой интерфейс отключается, или удаленный хост использует жесткое закрытие (см. Setsockopt для получения дополнительной информации о параметре SO_LINGER на удаленном компьютере). разъем). Эта ошибка также может произойти, если соединение было разорвано из-за активности активности активности, обнаруживающей сбой во время выполнения одной или нескольких операций. Операции, которые выполнялись, терпят неудачу с WSAENETRESET. Последующие операции завершаются неудачно с WSAECONNRESET.

Ссылка: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx

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