我有一个像这样的方法
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
关键字。问题是,用上面的方法签名我不知道该怎么做。
using
与out
参数一起使用吗? HttpWebResponse
?答案 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
中。我从其他答案中可以看出,我并不孤单。
但是,同样的论点可以用来证明我上面列出的更改是合理的。