如何使用'out'和'out'参数

时间:2012-07-05 07:20:32

标签: c# timeout using httpwebresponse out

我有一个像这样的方法

private bool VerbMethod(string httpVerb, string methodName, string url, string command, string guid, out HttpWebResponse response)

我像这样使用

  HttpWebResponse response;
  if (VerbMethod("POST", "TheMethod", "http://theurl.com", "parameter1=a", theGuid, out response))
  {
    using (StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
      string responseString = sr.ReadToEnd();
    }

返回bool以指定方法是否顺利,并在out参数中设置响应以获取数据。

我有时会超时,然后后续请求也会超时。我看到了这个 WebRequest.GetResponse locks up?

它会修改using关键字。问题是,用上面的方法签名我不知道该怎么做。

  • 我应该手动调用最终处理吗?
  • 还有一些方法可以将usingout参数一起使用吗?
  • 重写方法,因此不会公开HttpWebResponse

6 个答案:

答案 0 :(得分:6)

  

返回bool以指定方法是否顺利

那是你的问题。不要使用布尔成功值:如果出现问题则抛出异常。 (或者说,让异常泡沫化。)

只需更改方法即可返回响应。

答案 1 :(得分:3)

如果你想使用using(没有例外),只需交换bool和响应:

private HttpWebResponse VerbMethod(string httpVerb, string methodName, string url, string command, string guid, out bool canExecute);


bool canExecute = false;

using(HttpWebResponse response = VerbMethod("POST", "TheMethod", "http://theurl.com", "parameter1=a", theGuid, out canExecute))
{
  if (canExecute)
  {
    ..
  }
}

答案 2 :(得分:0)

在函数开头立即将out参数的默认值设为默认值,并在您已使用时继续使用using

答案 3 :(得分:0)

您也可以使用

    HttpWebResponse response;
    if (VerbMethod("POST", "TheMethod", "http://theurl.com", "parameter1=a", theGuid, out response))
    {
        using (response)
        {
            using (System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream()))
            {
                string responseString = sr.ReadToEnd();
            }
        }
    }

答案 4 :(得分:0)

您可以为回复添加另一个using

HttpWebResponse response; 
if (VerbMethod("POST", "TheMethod", "http://theurl.com", "parameter1=a", theGuid,
   out response)) 
{ 
  using(response)
  {
    using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
    { 
      string responseString = sr.ReadToEnd(); 
    } 
  }
}

答案 5 :(得分:0)

可以这样做:

private bool VerbMethod(string httpVerb, string methodName, string url, 
  string command, string guid, out HttpWebResponse response) {}

HttpWebResponse response = null;

if(VerbMethod(httpVerb, methodName, url, command, guid, out response) {
  using(response)
  {
    using (StreamReader sr = new StreamReader(response.GetResponseStream())) {
    }
  }
}

using语句不要求其中的表达式是new对象或方法返回 - 任何表达式都可以。

但是 - 通常在您致电GetResponseStream()之前请求不会触发,因此我无法看到您的bool返回实际上正在执行的操作除了确认已创建对象之外 - 还有单元测试运行时没有意义(!)。因此,最好的方法是让方法返回响应并将其放在using中。我从其他答案中可以看出,我并不孤单。

但是,同样的论点可以用来证明我上面列出的更改是合理的。