Jabber.NETを使用してOpenFireサーバーに接続しています。クライアントは時々奇妙な例外を私に与えます(しかしほとんどの場合): jabber.connection.sasl.SASLException: Hash ist im angegebenen Status nicht gültig
、これは指定されたステータスに対してハッシュが無効であることを示すドイツ語のメッセージです。時々 (はい、知っていますが、影響を与えることはできません) jabber.connection.sasl.SASLException: Das SafeHandle wurde geschlossen
、 SafeHandle が閉じられたことを意味する Exception も取得します。
可能なすべてのセキュリティ設定をオフにしてみましたが、すべて効果がありません。これが私が接続する方法です:
private JabberClient _jabberClient = null;
public JabberClient XmppClient
{
get
{
if (_jabberClient == null)
_jabberClient = new JabberClient();
return _jabberClient;
}
}
// double checked: username and password are correct, servername is existing URL
public login(username,password,servername)
{
var jid = new JID(username, serverName, Guid.NewGuid().ToString());
bedrock.net.AsyncSocket.UntrustedRootOK = true;
XmppClient.RequiresSASL = false; // --> this seems to have no effect at all
//XmppClient[Options.SASL_MECHANISMS] = MechanismType.PLAIN; // setting this throws a NotImplementedException!!!
XmppClient.SSL = false;
XmppClient.AutoPresence = true;
XmppClient.AutoReconnect = 3.0f;
XmppClient.AutoLogin = true;
XmppClient.AutoStartTLS = true;
XmppClient.AutoStartCompression = false;
XmppClient.User = jid.User;
XmppClient.Password = password;
XmppClient.Resource = jid.Resource;
XmppClient.Server = serverName;
XmppClient.NetworkHost = serverName;
XmppClient.OnMessage += new MessageHandler(JabberClient_OnMessage);
XmppClient.OnDisconnect += new bedrock.ObjectHandler(JabberClient_OnDisconnect);
XmppClient.OnError += new bedrock.ExceptionHandler(JabberClient_OnError);
XmppClient.OnAuthError += new jabber.protocol.ProtocolHandler(JabberClient_OnAuthError);
XmppClient.OnAuthenticate += new bedrock.ObjectHandler(XmppClient_OnAuthenticate);
XmppClient.OnInvalidCertificate += new System.Net.Security.RemoteCertificateValidationCallback(XmppClient_OnInvalidCertificate);
XmppClient.OnWriteText += new bedrock.TextHandler(XmppClient_OnWriteText);
}
どうすれば問題を解決できますか? それを回避できるものは何ですか?私が今持っている唯一の可能性は、幸運にもうまくいくまで何度も認証することですが、それには時間がかかる可能性があり、私はそれに頼りたくありません.
編集: 以下の回答で答えが得られました。例外を特定してconnect()
再度呼び出すのと同じくらい簡単です。ライブラリがこれを自動的に行わない理由は私にとって謎です。また、非アクティブ化されたときにSASLを使用する理由もわかりませんが、まあ。ハッキング、動作します。ありがとう!