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: