使用Jabber-Net连接到Openfire服务器时绑定资源时出错

时间:2011-06-15 22:01:55

标签: c# xmpp openfire

我在寻找C#xmpp库方面的努力仍在继续,因为我现在已经强制要求使用Soapbox Studio SDK和aggXmpp / Matrix SDK。我已经转移到Jabber-net剩下的少数剩余C#库中的一个,因此我无法连接到我的Openfire服务器。据我所知,这个库就像我迄今为止使用的大多数xmpp库一样异步执行所以我首先调用JabberClients的Connect方法并将一个登录到服务器的方法绑定到JabberClient的OnConnect处理程序。

下面是我的Connect方法,它连接到xmpp服务器并将jabberClient的OnConnect处理程序绑定到Logon方法。

public string Connect()
{
        try
        {
            jabberClient = new JabberClient();
            jabberClient.Connect();
            jabberClient.OnConnect += (o, e) => Logon();                
            jabberClient.OnAuthError += (o, e) => ThrowError("authError");
            jabberClient.OnStreamError += (o, e) => ThrowError("streamError");

            return "Connection Succesful";
        }
        catch (Exception ex)
        {
            _logger.LogError("SessionManager", "Connect", "Could not connect to Openfire Server", ex.ToString());
            return "Could not Connect to Openfire Server: " + ex;
        }
}

产生以下输出SRV:denjab2.jabber.com:5222, 但是当它到达jabberClinet的Connect方法时,会抛出类型为'System.FormatException'的第一个更改异常。然后输出'ExecuteConnect'

以下是登录方法

private void Logon()
{
        JID jid = new JID(OPENFIRE_USER_NAME, OPENFIRE_SERVER, "protoTest");
        jabberClient.User = jid.User;
        jabberClient.Server = jid.Server;
        jabberClient.Password = OPENFIRE_PASSWORD;
        jabberClient.AutoLogin = true;
        jabberClient.AutoPresence = true;
        jabberClient.Login();  
}

此方法不会引发异常。

此外,调用JabberClient的onStreamError处理程序并简单地处理一个异常,该异常读取“A Stream Error Occured”并且不提供内部异常。

我试图在网上和产品文档中研究这些错误,但似乎没有建立与服务器连接的指南。我必须假设我要么缺少一步,不提供所有必要的凭据,要么只是执行以错误的顺序登录服务器所需的步骤。

在查看Joe Hildebrand的回答中提到的示例应用程序之后,我将“Connect”方法修改为如下所示。

public void Connect()
{
        try
        {
            jabberClient = new JabberClient();              

            //Bind the JabberClient events to methods that handle those events.
            jabberClient.OnAuthError += (o, e) => ThrowError(ErrorType.AuthError);
            jabberClient.OnStreamError += (o, e) => ThrowError(ErrorType.StreamError);
            jabberClient.OnError += (o, e) => ThrowError(ErrorType.UnknownError);
            jabberClient.OnConnect += (o, e) => ConnectionComplete();

            //Set client settings
            jabberClient.AutoReconnect = 3f;

            JID jid = new JID(OPENFIRE_USER_NAME, OPENFIRE_SERVER, "gec2o");
            jabberClient.User = jid.User;
            jabberClient.Server = jid.Server;
            jabberClient.NetworkHost = null;
            jabberClient.Port = OPENFIRE_NOT_ENCRYPTED_PORT;
            jabberClient.Resource = jid.Resource;
            jabberClient.Password = OPENFIRE_PASSWORD;
            jabberClient.AutoStartTLS = false;
            jabberClient.AutoPresence = false;

            CapsManager cm = new CapsManager();
            cm.Stream = jabberClient;


            jabberClient.Connect();

        }
        catch (Exception ex)
        {
            _log.LogError("ConnectionManager", "Connect", "Could not connect to Openfire Server", ex.ToString());
            throw ex;
    }
}

然而,这似乎导致了同样的行为,在控制台中显示的额外错误表明'Sock errno:10061'并且抛出一个异常,说明'由于目标机器主动拒绝它而无法建立连接'这表明由于某种原因openfire服务器被拒绝我的连接请求。我发现This topic on the Jabber-net Google Group表示我使用服务器的IP地址而不是服务器名称,因为该错误可能与无法解决IPv4与IPv6问题有关。

使用完整的IP解决方案摆脱了'目标计算机主动拒绝'错误,但向我显示以下错误

 SEND: <iq id="JN_1" type="set" to="192.168.1.182"><bind 
xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>rsup</resource></ 
bind></iq> 
RECV: <iq type="error" id="JN_1" from="192.168.1.182" to="infotel/ 
bf18b431"><bind xmlns="urn:ietf:params:xml:ns:xmpp- 
bind"><resource>rsup</resource></bind><error code="400" 
type="modify"><bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/ 
></error></iq> 

ERROR: jabber.connection.sasl.AuthenticationFailedException: Error 
binding resource: <error code="400" type="modify" 
xmlns="jabber:client"><bad-request xmlns="urn:ietf:params:xml:ns:xmpp- 
stanzas" /></error> 

提及此错误但未在this thread of the Jabber-net Google Group

上完全解决

我能够根据Joe Hildebrand将设置AutoStartTLS的注释设置为true并为OnInvalidCertifcate创建事件处理程序并将其绑定到jabber客户端来摆脱此错误。

以下是修订后的'Connect'方法

public void Connect()
{
        try
        {
            jabberClient = new JabberClient();

            //Bind the JabberClient events to methods that handle those events.
            jabberClient.OnAuthError += (o, e) => ThrowError(ErrorType.AuthError);
            jabberClient.OnStreamError += (o, e) => ThrowError(ErrorType.StreamError);
            jabberClient.OnError += (o, e) => ThrowError(ErrorType.UnknownError);
            jabberClient.OnConnect += (o, e) => ConnectionComplete();
            jabberClient.OnInvalidCertificate += new System.Net.Security.RemoteCertificateValidationCallback(OnInvalidCertificate);

            //Set client settings
            jabberClient.AutoReconnect = 3f;

            JID jid = new JID(OPENFIRE_USER_NAME, OPENFIRE_SERVER, "gec2o");
            jabberClient.User = jid.User;
            //jabberClient.Server = jid.Server;
            jabberClient.Server = "192.168.97.26";

            jabberClient.NetworkHost = null;
            jabberClient.Port = OPENFIRE_NOT_ENCRYPTED_PORT;
            jabberClient.Resource = jid.Resource;
            jabberClient.Password = OPENFIRE_PASSWORD;
            jabberClient.AutoStartTLS = true;
            jabberClient.AutoPresence = false;

            CapsManager cm = new CapsManager();
            cm.Stream = jabberClient;


            jabberClient.Connect();

}

这是OnInvalidCertifcate事件处理程序

bool OnInvalidCertificate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
        Console.WriteLine("Invalid certificate ({0}):\n{1}", sslPolicyErrors.ToString(), certificate.ToString(true));
        return true;
}

这会导致以下异常。

Error binding resource 
<error type="modify" code="400"><bad-requestmlns="urn:ietf:params:xml:ns:xmpp-stanzas" /></error>

我还应该注意,jabber-net示例控制台应用程序对我来说也不起作用。

这是我尝试运行应用程序时的命令行输入。

ConsoleClient.exe /j 800802@palburtus/gec2o /r 800802 /p 800802 /o 5222 /t true /n null

这是我收到的输出

  Connecting
Connected
ERROR: System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it at System.Net.Sockets.Socket.EndConnect(IAsyncResult asy
   at bedrock.net.AsyncSocket.ExecuteConnect(IAsyncResult a
.0.710\bedrock\net\AsyncSocket.cs:line 782

希望有人可以帮助解释我做错了什么。

5 个答案:

答案 0 :(得分:1)

您是否尝试过ExampleConsoleClient申请?

在完全配置JabberClient实例之前,您正在调用Connect()。首先设置所有属性和回调,然后调用Connect()。最后,除非Login() AutoLoginFalse被解雇,否则您几乎不应致电OnAuthError

答案 1 :(得分:1)

我有完全相同的问题。我终于意识到我的网络主机使用了错误的IP地址(我使用的是localhost,而不是我实际的IP地址。我知道这不是您的确切问题,但现在我可以运行JabberNet并连接到我的本地OpenFire服务器。这就是我所拥有的:

Basic tab::
User: tony
Password: tony
Server: Server-Name (from the OpenFire Admin Console: / Server / Server Management page)

Network::
Port: 5222
Network Host: My IP Address

如果我从JabberNet运行Visual Studio 2010示例应用,

AutoLogin = true,
Resource = Jabber.Net

我只需点击(不可避免的)Allow Once对话框中的Invalid Certificate即可。

其他一切都是默认的。

我不知道这是否有帮助,但它(最终)对我有用。

答案 2 :(得分:0)

我在尝试连接到Openfire时也遇到了同样的错误。我设法摆脱了错误,但通过连接端口5223,这是Openfire的端口“用于客户端使用旧SSL方法连接到服务器的端口。”

答案 3 :(得分:0)

您的服务器是否有IPv6地址?那个目前还没有真正起作用。

答案 4 :(得分:0)

需要设置许多参数才能使用IP地址而不是DNS进行连接:

  1. NetworkHost - 又称服务器IP(如果配置了DNS或/ etc / host文件,则为主机名)
  2. 服务器 - 也称为XMPP服务器名称/域(通常与服务器的主机名相同)
  3. jabberClient = new JabberClient();
    jabberClient.NetworkHost = "192.168.0.2";
    jabberClient.Server = "xmppservername.domain.etc";
    

    如果设置了jabberClient.ServerjabberClient.NetworkHost未设置,则jabber-net会自动认为NetworkHostServer相同。