0

我有这样的方法

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 参数中设置响应以获取数据。

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

它推荐using关键字。问题是,使用上述方法签名我不知道该怎么做。

  • 我应该在finally中手动调用dispose吗?
  • 有没有办法仍然使用using参数out
  • 重写方法,所以它不会暴露HttpWebResponse?
4

6 回答 6

6

它返回一个布尔值以指定方法是否运行良好

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

只需更改您的方法以返回响应。

于 2012-07-05T07:24:00.813 回答
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)
  {
    ..
  }
}
于 2012-07-05T07:24:05.853 回答
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();
            }
        }
    }
于 2012-07-05T07:27:00.953 回答
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(); 
    } 
  }
}
于 2012-07-05T07:27:35.247 回答
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。我可以从其他答案中看出我并不孤单。

然而,同样的论点可以用来证明我在上面列出的改变是合理的。

于 2012-07-05T07:28:01.300 回答
0

out在函数的开头立即为参数分配默认值,并继续使用using你已经使用过的参数。

于 2012-07-05T07:24:54.610 回答