2016-11-16 71 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