5 votes

Asp.Net Core 2.0 Client WCF CustomBinding PlatformNotSupportedException : BuildChannelFactoryCore n'est pas pris en charge

Je dois pouvoir envoyer une autorisation dans mon Client en utilisant des liaisons personnalisées dans Asp.Net Core 2.0. Cela fonctionne en Asp.net 4.6.1 et ne fonctionne pas en Core 2.2. J'essaie de me connecter à un Service Web Public Workday dans notre Locataire. Comme j'ai réussi à le faire fonctionner en Asp.Net 4.6.1, j'ai terminé mon développement là-bas, mais j'aimerais comprendre cela pour un éventuel développement futur.

J'ai créé les liaisons personnalisées que j'ai utilisées dans le code. voir ci-dessous, cependant, je reçois toujours cette erreur: Message complet:

System.PlatformNotSupportedException : TransportSecurityBindingElement.BuildChannelFactoryCore n'est pas pris en charge.

Mon implémentation dans Asp.Net Core 2.0 MVC:

     public async Task ImportTimeEntryBlockAsync(TimeEntry item)
       {
           bool isValid = true;
           //Créer un objet de mise à jour pour mettre à jour le service web           

           //configuration de l'en-tête
           Workday_Common_HeaderType header = new Workday_Common_HeaderType
           {
               Include_Reference_Descriptors_In_Response = true
           };

           //configuration des données de blocs de temps rapporté à partir de l'élément
           Reported_Time_Block_DataType timeBlockData = new Reported_Time_Block_DataType();

           PopulateTimeBlock(item, ref timeBlockData);
           Reported_Time_Block_DataType[] timeBlocks = new Reported_Time_Block_DataType[1];
           timeBlocks[0] = timeBlockData;

           //configuration de la demande d'importation de blocs de temps rapportés
           Import_Reported_Time_Blocks_RequestType request = new Import_Reported_Time_Blocks_RequestType
           {
               version = "v29.0",
               Reported_Time_Block_Data = timeBlocks
           };
           Import_Reported_Time_BlocksInput timeBlock = new Import_Reported_Time_BlocksInput(header, request);

           //créer un objet de client
           Time_TrackingPortClient timeTracking = new Time_TrackingPortClient();
           timeTracking.ClientCredentials.UserName.UserName = IntegrationUser + @"@" + IntegrationDomain;
           timeTracking.ClientCredentials.UserName.Password = IntegrationPassword;

           SetupCustomBinding(timeTracking);

           //Définir l'adresse de l'endpoint
           Uri uri = new Uri(WorkdayHost + @"/Time_Tracking/v29.0");
           EndpointAddress endpoint = new EndpointAddress(uri);
           timeTracking.Endpoint.Address = endpoint;

           await timeTracking.OpenAsync();
           var result = await timeTracking.Import_Reported_Time_BlocksAsync(timeBlock);

           if (result == null)
               isValid = false;
           return isValid;
       }

       private static void SetupCustomBinding(Time_TrackingPortClient timeTracking)
       {
           // Créer une liaison personnalisée contenant deux éléments de liaison ; Sécurité, Encodage et Transport

           //Sécurité
           TransportSecurityBindingElement transportSecurity = SecurityBindingElement.CreateUserNameOverTransportBindingElement();
           transportSecurity.IncludeTimestamp = true;

           XmlDictionaryReaderQuotas readerQuotas = new XmlDictionaryReaderQuotas
           {
               MaxArrayLength = int.MaxValue,
               MaxBytesPerRead = int.MaxValue,
               MaxDepth = int.MaxValue,
               MaxNameTableCharCount = int.MaxValue,
               MaxStringContentLength = int.MaxValue
           };
           //encodage
           TextMessageEncodingBindingElement textEncoding = new TextMessageEncodingBindingElement
           {
               MessageVersion = MessageVersion.Soap11,
               ReaderQuotas = readerQuotas
           };

           // transport       
           HttpsTransportBindingElement httpsTransport = new HttpsTransportBindingElement
           {
               AuthenticationScheme = AuthenticationSchemes.Basic,
               MaxBufferSize = int.MaxValue,
               MaxReceivedMessageSize = int.MaxValue,
               TransferMode = TransferMode.Buffered
           };

           SynchronizedCollection coll = new SynchronizedCollection
           {
               transportSecurity,
               textEncoding,
               httpsTransport
           };

           //Définir la liaison personnalisée
           CustomBinding binding = new CustomBinding(coll);
           timeTracking.Endpoint.Binding = binding;
       }

J'espère qu'il me donnera une réponse, étant donné que j'ai réussi à le faire fonctionner en Asp.Net dans une configuration web.config:

Je ne pense pas l'avoir implémenté incorrectement, mais j'ai besoin de savoir si j'ai manqué quelque chose ou si BuildChannelFactoryCore n'est toujours pas supporté, alors quand le sera-t-il?

Liens de référence où cela est mentionné:

https://github.com/dotnet/wcf/issues/13

https://github.com/dotnet/wcf/issues/1257

Merci,

Paul

0voto

NSaban Points 1
Uri epUri = new Uri(_serviceUri);
CustomBinding binding = new CustomBinding();
SecurityBindingElement sbe = SecurityBindingElement.CreateUserNameOverTransportBindingElement();
sbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11;        
sbe.SecurityHeaderLayout = SecurityHeaderLayout.Strict;
sbe.IncludeTimestamp = false;
sbe.SetKeyDerivation(true);
sbe.KeyEntropyMode = System.ServiceModel.Security.SecurityKeyEntropyMode.ServerEntropy;
binding.Elements.Add(sbe);
binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, System.Text.Encoding.UTF8));
binding.Elements.Add(new HttpsTransportBindingElement());
EndpointAddress endPoint = new EndpointAddress(epUri);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X