Solicitação dupla ao fazer chamada POX REST usando WCF com WebHttpBinding definido como Autenticação básica

Tendo um problema ao fazer chamada POX REST usando o WCF com WebHttpBinding definido como Autenticação básica (HttpClientCredentialType.Basic)

Em vez de uma chamada do cliente com “Autorização: Básica” especificada no Cabeçalho HTTP, são feitas duas chamadas. Primeira chamada sem autenticação a todos os quais respostas de serviço com 401 Erro não autorizado, segunda chamada com informações de autenticação adequadas.

Isso parece ser tratado pelo serviço WCF sem nenhum soluço. Chamar serviços de terceiros, obviamente, cria um problema, uma vez que eles respondem com erro imediatamente.

Código de serviço:

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

Código do cliente:

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

}

Usando o TcpTrace, estou vendo esses pedidos de volta para trás:

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> 

Observe apenas segunda chamada contém:Autorização: Basic dGVzdDp0ZXN0 Como parar o primeiro pedido (sem autorização) a ser feito?

A solução de amostra com o utilitário TcpTrace pode ser baixada aqui:

WCF-BasicAuthenticationIssue.zip

questionAnswers(2)

yourAnswerToTheQuestion