2016-11-16 4 views
0

SOAPを使用してAPIデータを取得するコンソールアプリケーションをリファクタリングしようとしています。元のコードがUSING文を使用していないことがわかりました。私はコードをリファクタリングしようと思っていましたが、 "Internal Server Error"が発生しました。私はこれを数回見てきましたが、なぜこれがうまくいかないのか分かりません。元のコードに戻すと、期待どおりに動作します。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(); 
    } 
} 

UPDATE:応答に基づく別の試み。 2回目のUSING文では、 "stream"がusingステートメントにあるため、stream = response.GetResponseStream();を使用することはできません。更新へ

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が指摘したように、新しいコードの 'request'に' doc'の内容を追加したことはありません。 – 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

関連する問題