Doppelte Anforderung beim Ausführen eines POX-REST-Aufrufs mit WCF, wobei WebHttpBinding auf Standardauthentifizierung festgelegt ist
Problem beim Ausführen eines POX-REST-Aufrufs mit WCF, wobei WebHttpBinding auf Standardauthentifizierung (HttpClientCredentialType.Basic) festgelegt ist
Anstelle eines Aufrufs vom Client mit der in HTTP-Header angegebenen Berechtigung "Basic" werden zwei Aufrufe getätigt. Erster Anruf ohne Authentifizierung, auf den der Dienst mit 401 Unauthorized error antwortet, zweiter Anruf mit den richtigen Authentifizierungsinformationen.
Dies scheint vom WCF-Dienst ohne Schluckauf überhaupt gehandhabt zu werden. Das Anrufen von Diensten von Drittanbietern verursacht offensichtlich ein Problem, da diese sofort mit Fehlern reagieren.
Service code:
[ServiceContract]
public interface IService
{
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Xml,
UriTemplate = "")]
Message SendData(Message message);
}
public class Service : IService
{
public Message SendData(Message message)
{ return Message.CreateMessage(MessageVersion.None, String.Empty, "test");
}
}
Kundencode:
public class Client: WebChannelFactory<IService>, IService
{
public Client(Uri baseUri, string userName, string password)
: base(CreateBinding(),
baseUri)
{
Credentials.UserName.UserName = userName;
Credentials.UserName.Password = password;
}
public Message SendData(Message requestMessage)
{
var channel = CreateChannel();
Message responseMessage = channel.SendData(requestMessage);
return responseMessage;
}
private static Binding CreateBinding()
{
var binding = new WebHttpBinding();
binding.Security.Mode = WebHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
return binding;
}
}
Wenn ich TcpTrace verwende, werden folgende Anforderungen hintereinander angezeigt:
POST / HTTP/1.1
Content-Type: application/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo2lH6p+lUOdFmrqDKGWYeQkAAAAA7+Y4QR6wNUWZmwCaasMx7xrfcJZxph9NocstwCh8NQsACQAA
Host: localhost:9090
Content-Length: 89
Expect: 100-continue
Connection: Keep-Alive
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">test request</string>
POST / HTTP/1.1
Content-Type: application/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo2lH6p+lUOdFmrqDKGWYeQkAAAAA7+Y4QR6wNUWZmwCaasMx7xrfcJZxph9NocstwCh8NQsACQAA
Authorization: Basic dGVzdDp0ZXN0
Host: localhost:9090
Content-Length: 89
Expect: 100-continue
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">test request</string>
Beachten Sie, dass nur der zweite Anruf Folgendes enthält:Berechtigung: Basic dGVzdDp0ZXN0 Wie stoppe ich die erste Anfrage (ohne Berechtigung)?
Eine Musterlösung mit dem Dienstprogramm TcpTrace kann hier heruntergeladen werden: