Попытка подключить приложение веб-API ASP.NET CORE 2 к службе WCF. - PullRequest
0 голосов
/ 26 марта 2019

Вчера я начал проект 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));
        }

1 Ответ

0 голосов
/ 01 апреля 2019

Спасибо за всеобщее мнение. Я смог решить свою проблему, выполнив действия, описанные в этой статье .

Пожалуйста, прочтите ниже мой обновленный код для вызова службы WCF из моего .NET Core 2 Web Api:

 public async Task<DataFetchServiceResponseUsingPatient> FetchEntity(String ID)
    {
      var userName = _authenticationSettings.Value.UserName;
      var password = _authenticationSettings.Value.Password;
      var url = _authenticationSettings.Value.Url;

      var basicHttpBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);

      basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
      ChannelFactory<IMyService> factory = null;
      factory = new ChannelFactory<IMyService>(basicHttpBinding, new EndpointAddress(new Uri(url)));
      factory.Credentials.UserName.UserName = userName;
      factory.Credentials.UserName.Password = password;
      var serviceProxy = factory.CreateChannel();
      ((ICommunicationObject)serviceProxy).Open();
      var opContext = new OperationContext((IClientChannel)serviceProxy);
      var prevOpContext = OperationContext.Current;
      OperationContext.Current = opContext;

      var result = await serviceProxy.MyWCFServiceMethod(ID);

      //Cleanup Factory Objects
      factory.Close();
      ((ICommunicationObject)serviceProxy).Close();
      return result;    
    }
...