Podwójne żądanie podczas wywoływania POEST REST przy użyciu WCF z ustawieniem WebHttpBinding na Basic Authentication

Wystąpił problem podczas wykonywania wywołania REST POX przy użyciu WCF z zestawem WebHttpBinding do podstawowego uwierzytelniania (HttpClientCredentialType.Basic)

Zamiast jednego połączenia od klienta z „Autoryzacją: Podstawowa” określonego w Nagłówku HTTP, wykonywane są dwa połączenia. Pierwsze wywołanie bez uwierzytelnienia w ogóle, do którego odpowiedzi usługi z 401 Nieautoryzowanym błędem, drugie połączenie z prawidłowymi informacjami uwierzytelniającymi.

Wydaje się, że jest to obsługiwane przez usługę WCF bez żadnych problemów. Wywoływanie usług stron trzecich stwarza oczywiście problem, ponieważ natychmiast reagują na błędy.

Kod usługi:

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

Kod klienta:

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

}

Używanie TcpTrace Widzę, że to żądania z powrotem do tyłu:

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> 

Uwaga: tylko drugie połączenie zawiera:Autoryzacja: Basic dGVzdDp0ZXN0 Jak zatrzymać pierwsze żądanie (bez autoryzacji)?

Przykładowe rozwiązanie z narzędziem TcpTrace można pobrać tutaj:

WCF-BasicAuthenticationIssue.zip

questionAnswers(2)

yourAnswerToTheQuestion