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 (사용자 이름, 서버 및 자원)를 지정에서
일반적으로 서버는 username @ server/resource가 아닌 ''요소의 사용자 이름만을 요구합니다. ' user '만 지정하십시오. –
legoscia
@legoscia 젠장! 나는 이것에 3 시간을 낭비했고, 이것은 간단했다. 고마워. 내가 받아 들일 수 있도록 대답 해 줄 수 있니? – noob