2016-11-16 68 views
0

我在尝试重构使用SOAP获取一些API数据的控制台应用程序。我看到原始代码没有使用任何USING语句。我想我会尝试重构代码,但是,我得到一个“内部服务器错误”。我已经看了几次,我不明白为什么这不起作用。如果我切换回原来的代码,它按预期工作。使用USING语句处理SOAP请求不起作用?

这是工作的原代码:

public static string ProcessSOAPRequest(string xml, string endPoint) 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xml); 

     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(endPoint); 
     req.Timeout = 100000000; 
     req.Method = "POST"; 

     Stream objStream = req.GetRequestStream(); 
     doc.Save(objStream); 
     objStream.Close(); 

     WebResponse resp = req.GetResponse(); 
     objStream = resp.GetResponseStream(); 

     StreamReader r = new StreamReader(objStream); 
     string data = r.ReadToEnd(); 

     return data; 
    } 

这是我在与使用重构的尝试。

public static string ProcessSOAPRequest(string xml, string endPoint) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(xml); 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint); 
    request.Timeout = 100000000; 
    request.Method = "POST"; 

    using (WebResponse response = request.GetResponse()) 
    using (Stream stream = response.GetResponseStream()) 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     return reader.ReadToEnd(); 
    } 
} 

更新:另一个基于响应的尝试。这次在第二个USING语句中,它说我不能使用stream = response.GetResponseStream();,因为“stream”在using语句中。

var data = string.Empty; 
using (Stream stream = request.GetRequestStream()) 
{ 
    doc.Save(stream); 

    using (WebResponse response = request.GetResponse()) 
    { 
     stream = response.GetResponseStream(); 

     using (StreamReader reader = new StreamReader(stream)) 
     { 
      data = reader.ReadToEnd(); 
     } 
    } 
}    

return data; 
+1

隐式返回可能不会帮助你。您是否尝试分配结果并返回使用范围之外? – BradleyDotNET

+1

GetRequestStream()方法发生了什么? – jdweng

+0

正如@jdweng指出的那样,您从来没有在新代码中将'doc'的内容添加到'request'中。 – Eris

回答

1

回答到更新:

在using语句中声明的变量被视为只读。我建议你声明一个新的变量并将响应分配给该变量。为什么? - Why is a variable declared in a using statement treated as readonly?

var data = string.Empty; 
using (Stream stream = request.GetRequestStream()) 
{ 
    doc.Save(stream); 

    using (WebResponse response = request.GetResponse()) 
    { 
     var responseStream = response.GetResponseStream(); 
     if (responseStream != null) 
     { 
      using (StreamReader reader = new StreamReader(responseStream)) 
      { 
       data = reader.ReadToEnd(); 
      } 
     } 
    } 
}    

return data; 

应该工作。

+0

我认为这是行得通的。谢谢! – Caverman