5

以下のコードは、 エラー メッセージを表示しています:「操作がタイムアウトしました」エラー ソース: System.Net.httpWebRequest.GetResponse() で

このメソッドは URL を呼び出し、応答オブジェクトを取得しています。

注:これは私の最後ではすべて正常に動作しています..しかし、同じコードを本番環境に送信すると..タイムアウトエラーが表示されます

public GetUpdatedInventoryUnitValues(Vehicle aeVehicle)
{
            WebRequest oWebRequest = null;
            StringBuilder oStringBuilder = null;
            StreamReader oStreamReader = null;
            dcDealerDetails = new Dictionary<string, string>();

            MSRP = string.Empty;
            NetPrice = string.Empty;
            string strLine = string.Empty;
            string strURL = GetUpdatedInventoryUnitValues.GetFormattedURL(aeVehicle);

            try
            {
                /* Open the requested URL */
                oWebRequest = WebRequest.Create(strURL);
                oWebRequest.Method = "GET";
                oWebRequest.ContentType = "application/xml";
                /* Get the stream from the returned web response */
                oStreamReader = new StreamReader(oWebRequest.GetResponse().GetResponseStream());
                /* Get the stream from the returned web response */
                oStringBuilder = new StringBuilder();
                /* Read the stream a line at a time and place each one into the stringbuilder  */
                while ((strLine = oStreamReader.ReadLine()) != null)
                {
                    /* Ignore blank lines */
                    if (strLine.Length > 0)
                        oStringBuilder.Append(strLine);
                }

                string[] tempArray = null;
                string[] tempNextArray = null;
                //Split string by semicolon as a separater
                tempArray = Data.SplitString(oStringBuilder.ToString(), new char[] { ';' });

                if (tempArray != null)
                {
                    foreach (string invUnits in tempArray)
                    {
                        //Split string by '=' as a separater
                        tempNextArray = Data.SplitString(invUnits, new char[] { '=' });

                        if (tempNextArray != null && tempNextArray.Length == 2)
                        {
                            switch (tempNextArray[0].ToLower())
                            {
                                //case "msrp":
                                //    MSRP = Data.RemoveDoubleCode(tempNextArray[1]);
                                //    break;
                                case "netprice":
                                    NetPrice = Data.RemoveDoubleCode(tempNextArray[1]);
                                    break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorLog.ErrorMessage = ErrorLog.Separator;
                ErrorLog.ErrorMessage = "Exception during posting data to another application .";
                ErrorLog.ErrorMessage = "ERROR MESSAGE : " + ex.Message;
                ErrorLog.ErrorMessage = "ERROR SOURCE: " + ex.StackTrace.ToString();

            }
            finally
            {
                if (oStreamReader != null)
                {
                    oStreamReader.Close();
                }
                if (oWebRequest != null)
                {
                    oWebRequest = null;
                }
            }
        }

私が間違っていることや欠けていることを提案してください。

4

3 に答える 3

18

おそらく、最初の 2、3 のリクエストは問題なく、その後タイムアウトになり始めていますか? もしそうなら、これが問題だと思います:

oStreamReader = new StreamReader(oWebRequest.GetResponse().GetResponseStream());

あなたは応答を取得していますが、それを破棄することはありません。以下を使用する必要があります。

using (var response = oWebRequest.GetResponse())
{
    ...
}

実際、ステートメント全体finallyを使用すると、ブロックを完全に取り除くことができます。using

余談ですが、これはかなり長いメソッドです - 77 行です! - さらに悪いことに、実際にはコンストラクターのように見えます。

  • より小さく、より理解しやすく、よりテストしやすいチャンクに分割してみてください
  • コンストラクターで多くの作業を行うことを避けるようにしてください
于 2012-09-20T12:59:54.243 に答える
2

経験を共有するだけです。

「操作がタイムアウトしました」という同じエラーが発生しました。

WebClient と WebRequest (タイムアウトも設定) の両方を使用してみましたが、まだエラーが発生していました。

理由は、私が応答を破棄していなかったためです。

だから私は上記のように使用しました:

using (var response = oWebRequest.GetResponse())

{
    ...
}

そして、それは問題を解決しました...

于 2013-04-04T09:13:47.403 に答える
1

私は自分のプログラムの 1 つにこのコードを個人的に使用しており、完璧に動作します。

    WebRequest webRequest = WebRequest.Create(requestUri);
    webRequest.Credentials = new NetworkCredential(login, password);
    WebResponse webResponse = webRequest.GetResponse();
    Stream response = webResponse.GetResponseStream();
    StreamReader reader = new StreamReader(response);

したがって、それはあなたのコードからではなく、本番プラットフォームからのものだと思います。

于 2012-09-20T13:05:55.260 に答える