2012-09-20 65 views
5

的下面一段代码是给予 错误消息:“该操作已超时” 错误水稻源:在System.Net.httpWebRequest.GetResponse()System.Net.WebRequest - 超时错误

这方法正在调用URL并获取响应对象。

注:这是我end..but所有工作正常,当我相同的代码发送到production..it显示时间oout错误

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; 
       } 
      } 
     } 

请建议我在做什么错误或丢失?

+0

你确定你的要求是好的,它不会超时出来的代码?我的意思是你是否试图直接在浏览器中启动它? – 2012-09-20 12:57:30

+0

这是所有工作正常在我的end..but当我发送相同的代码生产..它显示时间oout错误 –

+0

您的开发平台和您的生产平台之间有什么区别?有没有防火墙或类似的东西可以阻止你的请求? – 2012-09-20 13:01:59

回答

17

您是否也许发现第一对请求是好的,然后然后他们开始超时?如果是这样,我怀疑这是问题:

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

您正在提取响应,但从不处理它。您应该使用:

​​

事实上,你可以摆脱finally块的全部,如果你使用using陈述贯穿始终。

另外,这是一个相当长的方法 - 77行! - 更糟的是,它看起来像它实际上是一个构造函数:

  • 尝试它分割成更小,更容易理解,更容易测试块
  • 尽量避免做了很多工作,在构造函数中
+0

..这是工作正常,我的250个呼叫在循环..但在生产中,它几乎全部是超时...在代码部分..我应该这样做.. –

+0

@RatanSharma:你从生产中获取什么网址?它可能真的只是超时吗? –

+0

上面的函数是从生产站点中运行的工具...该函数正在调用一个URL来给出一些响应。当我在我的系统中运行该工具时,这是工作正常,但在生产服务器时我正在运行相同它正在调整.. –

1

我personnally使用此代码为我的程序之一,它完美的作品:

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

所以我认为它不是来自你的代码,但是从你的生产平台。

+4

如果你不处理回应,那么它不能完美运作 - 你只是幸运。 –

+0

通过在使用结束后使用您的发布代码来处理响应? – 2012-09-20 13:27:40

+1

是的。你应该使用'using'语句来实现'IDisposable',以确保清理。 –

2

只是分享经验。

我得到了同样的错误“操作超时”。

我已经尝试使用WebClient和WebRequest(设置超时也)但仍然出现错误。

原因是我没有处理响应。

所以我用上面提到:

using (var response = oWebRequest.GetResponse()) 

{ 
    ... 
} 

它解决了这个问题...