Проект .NET Core не может вызвать метод библиотеки классов .NET 4.6, который использует NTLM

#c# #.net #asp.net-core

#c# #.net #asp.net-core

Вопрос:

У меня есть проект .NET Core 2.1, который использует AutoFAC для DI. У меня есть проект библиотеки классов в решении, в котором работает .NET Framework 4.6. Я использую wsdl из конечной точки, для которой требуются определенные учетные данные для аутентификации NTLM. В автономном проекте .NET 4.6 мой код работает, но когда я вызвал метод проекта .NET 4.6 из кода .NET Core 2.1, я получаю следующую ошибку:

 Authentication failed because the connection could not be reused.

at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(HttpRequestException requestException, HttpRequestMessage request, HttpAbortReason abortReason)
at System.ServiceModel.Channels.HttpChannelFactory`1.HttpClientRequestChannel.HttpClientChannelAsyncRequest.SendRequestAsync(Message message, TimeoutHelper timeoutHelper)
at System.ServiceModel.Channels.RequestChannel.RequestAsync(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.RequestChannel.RequestAsyncInternal(Message message, TimeSpan timeout)
at System.Runtime.TaskHelpers.WaitForCompletionNoSpin[TResult](Task`1 task)
at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(MethodCall methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(MethodInfo targetMethod, Object[] args)
--- End of stack trace from previous location where exception was thrown ---
at System.Reflection.DispatchProxyGenerator.Invoke(Object[] args)
at generatedProxy_1.SO(SORequest )
at PM.xpSvc.xpWSSoapClient.PM.xpSvc.xpWSSoap.SO(SORequest request)
at PM.xpSvc.xpWSSoapClient.SO(IPackets pPacketsIn)
at PM.Services.xpService.CreditCardSubmitPayment(CreditCardSubmitPaymentRequestModel request)
  

Вот часть кода в методе .NET 4.6, который передает аутентификацию NTLM конечной точке:

 EndpointAddress myEndpoint = new EndpointAddress("https://secret.com/ws.asmx");
BasicHttpsBinding myBinding = new BasicHttpsBinding();

myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
myBinding.Security.Mode = BasicHttpsSecurityMode.Transport;

var xpService = new xpWSSoapClient(myBinding, myEndpoint);
xpService.ClientCredentials.Windows.ClientCredential.Domain =   "domain";
xpService.ClientCredentials.Windows.ClientCredential.UserName = "user";
xpService.ClientCredentials.Windows.ClientCredential.Password = "pass";

response = xpService.SO(requestModelHere);
  

Я бы заставил этот запрос работать, если бы я добавил это непосредственно перед вызовом:

 AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
  

Однако это приводит к тому, что остальная часть проекта .NET Core не функционирует должным образом при других вызовах. Существуют ли какие-либо другие способы заставить это работать, не вытаскивая этот проект из решения и не превращая его в автономный сервис?

Комментарии:

1. Причина .библиотека DLL библиотеки классов Net4.6 не переносима и не может быть использована

2. NTLM зависит от Windows .. вы не можете использовать его в кроссплатформенных приложениях .NET Core

3. Есть ли способ выполнить это в коде .NET Core 2.1? Я попытался использовать ConfigureServices (службы ISerivceCollection) { … } но, возможно, моя реализация была неправильной.

4. Попробуйте обходной путь из https://github.com/dotnet/wcf/issues/2923

5. Это исправлено в 2.2.7 или 2.1.13