2015-01-06 5 views
0

this library을 사용하여 Windows Phone 8.1에서 XMPP 채팅 클라이언트를 구현하려고합니다. 이 라이브러리는 새로운 사용자 등록을 지원하지 않으므로이 코드를 소스 코드에 포함하려고합니다. 나는 ServerFeaturesState을 등록 용으로 사용했고 RegisterServerFeaturesState으로 명명했다. 내가 등록 연을 보낼 때 지금, 나는 오류 코드 다음은 400
을 내가 보내고 무엇을 얻을 -XMPP 등록이 400 개의 잘못된 요청 오류를 생성 중입니다.

<iq id="U4" type="set" xmlns="jabber:client"> 
    <query xmlns="jabber:iq:register"> 
    <username>[email protected]/RESOURCE</username> 
    <password>password1234</password> 
    </query> 
</iq> 

을 여기에 내가 답례로 무엇입니까 무엇 -

<iq from="domain.lt" id="U5" type="error" xmlns="jabber:client"> 
    <query xmlns="jabber:iq:register"> 
    <username>[email protected]/RESOURCE</username> 
    <password>password1234</password> 
    </query> 
    <error code="400" type="modify"> 
    <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" /> 
    </error> 
    <!--[TS]1/6/2015 4:45:37 PM--> 
</iq> 

나는 다음과 같은 코드를 사용하고 내 상태의 실행 방법 - 여기

public override void Execute(Tag data = null) 
     { 
#if DEBUG 
      Manager.Events.LogMessage(this, LogType.Debug, "Starting RegisterServerFeaturesState Execution "+data); 
#endif 
      tags.streams.features features = null; 
      tags.jabber.client.iq iqRoot = null; 

      if (data is tags.streams.stream) 
      { 
       tags.streams.stream stream = data as tags.streams.stream; 
       if (!stream.version.StartsWith("1.")) 
       { 
        Manager.Events.Error(this, ErrorType.XMPPVersionNotSupported, ErrorPolicyType.Deactivate, "Expecting stream:features from 1.x server"); 
        return; 
       } 
       features = stream.features; 
#if DEBUG 
       Manager.Events.LogMessage(this, LogType.Debug, "RegisterServerFeaturesState stream"); 
#endif 
      } 
      else if (data is tags.streams.error) 
      { 
       var error = data as tags.streams.error; 
       string message = string.Empty; 

       if(error.HasElements) 
       { 
        var text = error.Element<tags.xmpp_streams.text>(tags.xmpp_streams.Namespace.text); 
        if (text != null) 
        { 
         message = text.Value; 
        } 
        else if(error.Elements().Count() > 0) 
        { 
         var element = error.Elements().First(); 
         if(element != null) 
          message = element.Name.LocalName; 
        } 
       } 

       Manager.Events.Error(this, ErrorType.ServerError, ErrorPolicyType.Reconnect, message); 
       return; 
      } 
      else if (data is tags.streams.features) 
      { 
       features = data as tags.streams.features; 
      } 
      else if (data is tags.jabber.client.iq) 
      { 
       iqRoot = data as tags.jabber.client.iq; 
      } 

      if (features != null) 
      { 
       if (features.starttls != null && Manager.Settings.SSL) 
       { 
        Manager.State = new StartTLSState(Manager); 
        tags.xmpp_tls.starttls tls = new tags.xmpp_tls.starttls(); 
        Manager.Connection.Send(tls); 
#if DEBUG 
        Manager.Events.LogMessage(this, LogType.Debug, "RegisterServerFeaturesState starttls"); 
#endif 
        return; 
       } 

       if (!Manager.IsRegistrationFeatureRequested) 
       { 
        var iq = new tags.jabber.client.iq(); 
        iq.type = tags.jabber.client.iq.typeEnum.get; 
        var query = new tags.jabber.iq.register.query(); 
        iq.Add(query); 
        Manager.Connection.Send(iq); 
        Manager.IsRegistrationFeatureRequested = true; 
        registrationRequestID = iq.id; 
        return; 
       } 
      } 
      else if (iqRoot != null) 
      { 
       if (Manager.IsRegistrationFeatureRequested) 
       { 
        if (iqRoot.type == tags.jabber.client.iq.typeEnum.result) 
        { 
#if DEBUG 
         Manager.Events.LogMessage(this, LogType.Debug, "Registration Instructions: Step 1"); 
#endif 
         var query = iqRoot.Element<tags.jabber.iq.register.query>(tags.jabber.iq.register.Namespace.query); 
         if (query != null) 
         { 
#if DEBUG 
          Manager.Events.LogMessage(this, LogType.Debug, "Registration Instructions: Step 2"); 
#endif 
          var instruction = query.Element<tags.jabber.iq.register.instructions>(tags.jabber.iq.register.Namespace.instructions); 
          if (instruction != null) 
          { 
#if DEBUG 
           Manager.Events.LogMessage(this, LogType.Debug, "Registration Instructions: " + instruction.Value); 
#endif 
           var username = query.Element<tags.jabber.iq.register.username>(tags.jabber.iq.register.Namespace.username); 
           var password = query.Element<tags.jabber.iq.register.password>(tags.jabber.iq.register.Namespace.password); 
           if (username != null && password != null) 
           { 
            var iq = new tags.jabber.client.iq(); 
            iq.type = tags.jabber.client.iq.typeEnum.set; 
            iq.to = iqRoot.from; 
            var requestQuery = new tags.jabber.iq.register.query(); 
            var userTag = new tags.jabber.iq.register.username(); 
            userTag.Value = Manager.Settings.Id; 
            var passTag = new tags.jabber.iq.register.password(); 
            passTag.Value = Manager.Settings.Password; 
            requestQuery.Add(userTag); 
            requestQuery.Add(passTag); 
            iq.Add(requestQuery); 
            Manager.Connection.Send(iq); 
            Manager.IsRegistrationRequestSent = true; 
            return; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

등록 지시를 점점

,691을 알려줍니다 무엇
<iq from="domain.lt" id="U3" type="result" xmlns="jabber:client"> 
    <query xmlns="jabber:iq:register"> 
    <instructions>Choose a username and password to register with this server</instructions> 
    <username></username> 
    <password /> 
    </query> 

오류 코드 400의 의미가 확실하지 않습니다. 나는 등록 연에서 무언가를 잊고 있니?

<username>[email protected]/RESOURCE</username> 

그러나, 서버는 대개 사용자 이름이 예상 그래서 대신이 시도 : 등록 요청, 당신은 전체 JID (사용자 이름, 서버 및 자원)를 지정에서

+0

일반적으로 서버는 username @ server/resource가 아닌 ''요소의 사용자 이름만을 요구합니다. ' user'만 지정하십시오. – legoscia

+0

@legoscia 젠장! 나는 이것에 3 시간을 낭비했고, 이것은 간단했다. 고마워. 내가 받아 들일 수 있도록 대답 해 줄 수 있니? – noob

답변

1

<username>user</username> 

이것이 명시 적으로 XEP-0077에 나와있는 것을 볼 수는 없지만 적어도 예제가 보여주는 것입니다.