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:

WCF-BasicAuthenticationIssue.zip

Antworten auf die Frage(2)

Ihre Antwort auf die Frage