Laden...

WCF Soap Header auslesen schlägt fehl

Erstellt von Ahrimaan vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.413 Views
A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 9 Jahren
WCF Soap Header auslesen schlägt fehl

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

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 9 Jahren

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");
        }