Двойной запрос при вызове POX REST с использованием WCF с WebHttpBinding, установленным на базовую аутентификацию

Возникла проблема при выполнении вызова POX REST с использованием WCF с WebHttpBinding, для которого установлена базовая аутентификация (HttpClientCredentialType.Basic)

Вместо одного вызова от клиента с «Авторизация: Базовая», указанная в заголовке HTTP, выполняется два вызова. Первый звонок вообще без аутентификации, на который служба отвечает 401 Несанкционированная ошибка, второй звонок с правильной информацией аутентификации.

Похоже, что это обрабатывается службой WCF без каких-либо проблем. Обращение к сторонним службам, очевидно, создает проблему, поскольку они немедленно отвечают с ошибкой.

Сервисный код:

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

Код клиента:

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

}

Используя TcpTrace, я вижу их для запросов спина к спине:

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> 

Обратите внимание, что только второй звонок содержит:Авторизация: базовая dGVzdDp0ZXN0 Как остановить первый запрос (без авторизации)?

Пример решения с утилитой TcpTrace можно скачать здесь:

WCF-BasicAuthenticationIssue.zip

Ответы на вопрос(2)

Ваш ответ на вопрос