1

私は多くの人が経験した問題を抱えていますが、オンラインで利用できる解決策はすべて、そのシナリオに固有のものです。私は利用可能な提案を試しましたが、私が試したのはまだ運がありません:

1.) req.KeepAlive = false;
2.) req.ProtocolVersion = HttpVersion.Version10; (this solved a different exception that I was getting)

XML文字列をサーバーに渡し、応答を取得する2つのメソッドがあります。2つのメソッドは次のとおりです。

public string userDeviceQuery(string userID)
    {
        string query = "xml=<query>";
        query += "<appInfo>";
        query += "<appID>" + appID + "</appID>";
        query += "<appCertificate>" + appCertificate + "</appCertificate>";
        query += "</appInfo>";
        query += "<userDevicesQuery>";
        query += "<userID>";
        query += userID;
        query += "</userID>";
        query += "</userDevicesQuery>";
        query += "</query>";

        using (Stream str = req.GetRequestStream())
        {
            str.Write(System.Text.Encoding.ASCII.GetBytes(query), 0, query.Length);
        }

        WebResponse res = req.GetResponse();

        string stringResponse;
        using (StreamReader reader = new StreamReader(res.GetResponseStream()))
        {
            stringResponse = reader.ReadToEnd();
        }

        string result = parseDeviceQueryRes(stringResponse);
        return result;
    }

public void logoutOfEM(string deviceName)
    {
        string lgRequest = "xml=<request>";
               lgRequest += "<appInfo>";
               lgRequest += "<appID>" + appID + "</appID>";
               lgRequest += "<appCertificate>" + appCertificate + "</appCertificate>";
               lgRequest += "</appInfo>";
               lgRequest += "<logout>";
               lgRequest += "<deviceName>";
               lgRequest += deviceName;
               lgRequest += "</deviceName>";
               lgRequest += "</logout>";
               lgRequest += "</request>";

         using (Stream str = req.GetRequestStream())
        {
            str.Write(System.Text.Encoding.ASCII.GetBytes(lgRequest), 0, lgRequest.Length);
        }

        WebResponse res = req.GetResponse();

        using (StreamReader reader = new StreamReader(res.GetResponseStream()))
        {
            stringResponse = reader.ReadToEnd();
        }
        string stringResponse = reader.ReadToEnd();
    }

どちらも EMAPI と呼ばれるクラスの一部です。両方のメソッドを別々に使用することはできますが、EMAPI を表す同じオブジェクトでそれらを連続して使用しようとすると、上記の例外が発生します。接続が閉じられる原因がわかりません。可能であれば、デコンストラクターを使用して接続を開いたままにして閉じることができるようにしたいと考えています。

このコードが Cisco エクステンション モビリティ API を扱っていることに興味がある人のために、最初のメソッドはサーバにクエリを実行してログインしているデバイスを取得し、2 番目のメソッドはユーザをそのデバイスからログアウトさせます。

助けてくれてありがとう。

4

2 に答える 2

1

最初にすべての IDisposables の周りに「using」キーワードを使用します。次に、StreamReaders を開いたままにしているようです。

編集

キーワードの使用についてのコメントに答えるために。

これの代わりに:

Stream str = req.GetRequestStream();
str.Write(System.Text.Encoding.ASCII.GetBytes(lgRequest), 0, lgRequest.Length);
str.Close();

次のように書きます。

using(Stream str = req.GetRequestStream())
{
    str.Write(System.Text.Encoding.ASCII.GetBytes(lgRequest), 0, lgRequest.Length);
}

using キーワードは、すべての IDisplosable タスクを自動的に処理します。

あなたのコードと、あなたが閉じていないと思った理由に気付きました。close を呼び出してから、回線を準備しようとしています。これは、'using' キーワードを使用する習慣を身に付ける理由の良い例です。

StreamReader reader = new StreamReader(res.GetResponseStream());
reader.Close(); //Calling CLOSE before trying to use the reader
string stringResponse = reader.ReadToEnd();

別の編集

public void logoutOfEM(string deviceName)
    {
        string lgRequest = "xml=<request>";
               lgRequest += "<appInfo>";
               lgRequest += "<appID>" + appID + "</appID>";
               lgRequest += "<appCertificate>" + appCertificate + "</appCertificate>";
               lgRequest += "</appInfo>";
               lgRequest += "<logout>";
               lgRequest += "<deviceName>";
               lgRequest += deviceName;
               lgRequest += "</deviceName>";
               lgRequest += "</logout>";
               lgRequest += "</request>";
     using (Stream str = req.GetRequestStream())
    {
        str.Write(System.Text.Encoding.ASCII.GetBytes(lgRequest), 0, lgRequest.Length);
    }

    WebResponse res = req.GetResponse();

    var response = string.Empty;
    using(StreamReader reader = new StreamReader(res.GetResponseStream()))
    {
        response = reader.ReadToEnd();
    }


}
于 2013-07-24T21:31:45.633 に答える