Hallo zusammen,
wir kriegen von Dienstleistern Soap Requests rein.
Für eine neue Schnitstelle nutzen wir nun WCF
hierfür wird eine Nachricht gesendet:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:app="http://unsererAPP" xmlns:unserns="http://unserwww">
<soapenv:Header>
<unserns:AuthenticationHeader>
<unserns:Username>A</unserns:Username>
<unserns:Password>B</unserns:Password>
</unserns:AuthenticationHeader>
</soapenv:Header>
Dazu gibt es einen MessageInsepctor :
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
var authenticationHeader = request.Headers.GetHeader<AuthenticationHeader>("AuthenticationHeader",
"http://unserwww");
if (this.authenticator.ValidateCredentials(authenticationHeader.Username, authenticationHeader.Password))
{
return request;
}
throw new FaultException("Unknown Username or Incorrect Password");
}
Und der header :
public class AuthenticationHeader
{
/// <summary>
/// Gets or sets the Password
/// </summary>
[DataMember(Name = "Password")]
public string Password { get; set; }
/// <summary>
/// Gets or sets the Username
/// </summary>
[DataMember(Name = "Username")]
public string Username { get; set; }
}
Der Header wird nur zum Teil ausgelesen : Das Object selber ist da, nur die beiden propertys sind NULL.
Ich kann mir nicht erklären warum.
Jmd ne Idee ?
Grüße
Hallo zusammen,
mitlerweile habe ich es nun gelöst, auch wenn ich der Meinung bin das schön was anderes ist 😦
Man liest einfach den XML Subtree aus :
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
var headerIndex = request.Headers.FindHeader("AuthenticationHeader", "http://unserwww");
if (headerIndex >= 0)
{
var headerReader = request.Headers.GetReaderAtHeader(headerIndex).ReadSubtree();
var headerData = XElement.Load(headerReader);
var usernameElement = headerData.Element("Username");
var passwordElement = headerData.Element("Password");
if (usernameElement != null && passwordElement != null)
{
if (this.authenticator.ValidateCredentials(usernameElement.Value, passwordElement.Value))
{
return request;
}
}
}
throw new FaultException("Unknown Username or Incorrect Password");
}