2012-01-10 7 views
2

私はVS2010、FrameWork 4.0でC#を使用しています。 私は2つのHttp-Postコールを順番に行うコンソールアプリケーションを作成しました。 2番目の呼び出しは、最初の呼び出しによって返されるものを入力に使用します。 まあ、アプリケーションをデバッグモードで、ブレークポイントを使って段階的に(F10)実行すると、すべて正常に動作します。 しかし、ブレークポイントを削除して "F5"を押すと、エラーが約60秒かかるため、タイムアウトのために、コードが "webRequest.getResponse()"をSECOND Http-Post呼び出しで実行すると例外が発生します現れる。HttpPostで "getResponse()"を2回使用すると、ステップバイステップでしかデバッグできません

例外: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

あなたが本当に 'webRequest.Abort()を呼び出すことする必要がありますか;'? –

答えて

0

あなたがイベントログにエラーがないかどうかを確認しようとしたことがありますか?サービスのTracingを有効にして、正確な理由を確認してください。上記のエラーが発生すると、次の説明が表示されます。

ピアによって接続がリセットされました。 既存の接続がリモートホストによって強制的に閉じられました。これは通常、リモートホスト上のピアアプリケーションが突然停止した場合、ホストが再起動した場合、ホストまたはリモートネットワークインターフェイスが無効な場合、またはリモートホストがハードクローズを使用している場合に発生します(リモートのSO_LINGERオプションの詳細についてはsetsockoptを参照)ソケット)。このエラーは、1つ以上の操作の進行中にキープアライブ動作が障害を検出したために接続が切断された場合にも発生する可能性があります。進行中の操作はWSAENETRESETで失敗します。その後の操作はWSAECONNRESETで失敗します。

参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx

+0

答えをありがとう。 –

+0

トレースを使用しましたが、余分な情報はありませんでした。 WSAECONNRESETを避けるために、私は "HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters \ MaxUserPort = 50000(10進)"を設定しましたが、何も解決しませんでした。 その他のアイデアですか? –

+0

誰も私の問題を解決するための任意のアイデアを持っていますか? –