Вчера я начал проект POC для подключения к существующей службе WCF, и я использую приложение .Net Core 2.1 Web API и Swagger, чтобы публиковать свои тестовые сообщения с запросами. Я использую BasicHttpBinding и Transport для BasicHttpSecurityMode.
При отправке сообщения с тестовым запросом я получаю следующее исключение:
"HTTP-запрос не авторизован с помощью схемы аутентификации клиента« Anonymous ». Заголовок аутентификации, полученный от сервера, был« Basic Realm »."
Затем я создал проект Microsoft Web API с использованием .NET Framework 4.6.1 для вызова службы WCF, и мне удалось получить HTTP-ответ Status Code 200.
Мне кажется, это проблема с проектом веб-API .NET Core 2, подключающимся к службе WCF. Я провел некоторое исследование, и похоже, что эта архитектура дизайна определенно должна быть возможной.
Microsoft даже разработала инструмент провайдера, чтобы сделать именно это, вот ссылка на статью MS об инструменте их провайдера: https://docs.microsoft.com/en-us/dotnet/core/additional-tools/wcf-web-service-reference-guide
Я даже пытался заставить мой контроллер .NET Core Web API вызывать класс обработчика, который я построил в проекте библиотеки классов .NET 4.6.1, но безрезультатно, я все еще получал «HTTP-запрос не авторизован с помощью схемы аутентификации клиента. 'Basic'. Заголовок аутентификации, полученный от сервера, был исключением «Basic Realm».
private static System.ServiceModel.Channels.Binding GetBindingForEndpoint(EndpointConfiguration endpointConfiguration)
{
if ((endpointConfiguration == EndpointConfiguration.BasicHttpBinding_IInsuranceService))
{
System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
result.MaxBufferSize = int.MaxValue;
result.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
result.MaxReceivedMessageSize = int.MaxValue;
result.AllowCookies = true;
result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;
return result;
}
throw new System.InvalidOperationException(string.Format("Could not find endpoint with name \'{0}\'.", endpointConfiguration));
}
private static System.ServiceModel.EndpointAddress GetEndpointAddress(EndpointConfiguration endpointConfiguration)
{
if ((endpointConfiguration == EndpointConfiguration.BasicHttpBinding_IInsuranceService))
{
return new System.ServiceModel.EndpointAddress("https://myservicebaseURL\myservice.svc");
}
throw new System.InvalidOperationException(string.Format("Could not find endpoint with name \'{0}\'.", endpointConfiguration));
}