2012-07-05 5 views
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(); 
    } 

Он возвращает логическое значение, чтобы указать, если метод прошел хорошо , и ответ задается в параметре out для получения данных.

Иногда я получаю тайм-аут, а затем последующие запросы также выходят из строя. Я видел это SO WebRequest.GetResponse locks up?

Он рекомендует ключевое слово using. Проблема в том, что с указанной выше сигнатурой метода я не уверен, как это сделать.

  • Должен ли я вручную вызвать утилизацию в конце?
  • Есть ли способ использовать using с параметром out?
  • Перепишите метод, чтобы он не отображал номер HttpWebResponse?

ответ

6

возвращает логическое значение, чтобы указать, если метод прошел хорошо

Это ваша проблема. Не используйте значение Boolean success: генерируйте исключение, если что-то пойдет не так. (Или, скорее, пусть пузырь пузыря вверх.)

Просто измените свой метод, чтобы вернуть ответ.

3

Если вы хотите использовать using (без исключений), просто поменять логическое значение и ответ:

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) 
    { 
    .. 
    } 
} 
0

значение Assigne по умолчанию для out параметр сразу в начале функции, и по-прежнему использовать using как вы уже используют его.

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(); 
      } 
     } 
    } 
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(); 
    } 
    } 
} 
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 заявление не требуют, чтобы выражение (и) hin это/new объекты или метод возвращает - любое выражение будет делать.

Однако, как правило, запрос не срабатывает до тех пор, пока вы не позвоните по номеру GetResponseStream(), поэтому я не вижу, что ваш возврат bool фактически выполняет что-либо, кроме подтверждения того, что объект был создан - и нет смысла в модульном тестировании времени выполнения (!). Поэтому лучше всего заставить метод вернуть ответ и поместить его в using. Я вижу из других ответов, что я не один в этом.

Этот же аргумент, однако, можно использовать, чтобы оправдать внесение изменений, перечисленных выше.

 Смежные вопросы

  • Нет связанных вопросов^_^