首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jabber.NET SASL异常/8月错误

Jabber.NET SASL异常/8月错误
EN

Stack Overflow用户
提问于 2012-10-22 08:16:48
回答 1查看 1.3K关注 0票数 0

我使用Jabber.NET连接到OpenFire服务器。客户端有时会给我一个奇怪的例外(但大多数情况下):jabber.connection.sasl.SASLException: Hash ist im angegebenen Status nicht gültig,这是一条德国消息,声明指定状态的哈希无效。有时(是的,我知道,但我无法影响),我也得到了异常jabber.connection.sasl.SASLException: Das SafeHandle wurde geschlossen,这意味着SafeHandle已经关闭。

我试着关闭所有可能的安全设置,但都没有效果。我就是这样联系的:

代码语言:javascript
复制
    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时使用SASL,但是很好。黑了,工作了。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-22 08:46:49

我不认为有问题,但这是我的工作代码。希望能帮上忙。

代码语言:javascript
复制
    private JabberClient _client;
    private JabberClient client
    {
        get {
            if (_client == null)
            {
                _client = new JabberClient();
                ConfigureClient(_client);
            }
            return _client; 
        }
        set
        {
            _client = value;
            RegisterOnEvents(_client);
        }
    }      

    public MiddleMan()
    {
        jabber.connection.ConferenceManager c = new jabber.connection.ConferenceManager();

        client = new JabberClient();

        ConfigureClient(client);
    }  

    private void ConfigureClient(JabberClient jc)
    {
        JID jid = new JID(LoginInformation.UserName);

        jc.User = jid.User;
        jc.Server = jid.Server;
        if (!String.IsNullOrEmpty(LoginInformation.NetworkHost))
        {
            jc.NetworkHost = LoginInformation.NetworkHost;
        }
        jc.Port = 5222;
        jc.AutoReconnect = 3f;
        jc.AutoLogin = true;
        jc.AutoPresence = true;
        jc.Resource = LoginInformation.Resource;
        jc.Password = LoginInformation.Password;
        jc.KeepAlive = 10;
    }

    private void RegisterOnEvents(JabberClient jc)
    {
        //Messaging
        //jc.OnMessage += new MessageHandler(OnMessageReceived);

        //Login
        jc.OnLoginRequired += (sender) =>
        {
           //code
        };

        jc.OnAuthenticate += (sender) =>
        {
            //code
        };

        jc.OnAuthError += (sender, rp) =>
        {
            //code
            this.Connect();
        };

        //Connection
        jc.OnConnect += (sender, stream) =>
        {
            //code
        };

        jc.OnDisconnect += (sender) =>
        {
            //code
            this.Connect();
        };

        jc.OnError += (sender, ex) =>
        {
            //code
            this.Connect();
        };

        //jc.OnPresence += new PresenceHandler(OnPresence);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13007387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档