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