J'ai un problème lors de l'ajout de WCF dans le projet principal .NET . Lorsque j'utilisais auparavant .net, je pouvais ajouter plusieurs environnements dans web.config afin de pouvoir charger le service Web approprié à l'exécution (Dev, Rec, Prod) .
Le problème rencontré dans le projet principal .net lorsque j'ai ajouté une référence de mon service WCF en tant que service connecté, il créait un fichier ConnectedService.json contenant une URL pour le service WCF.
{
"ProviderId": "Microsoft.VisualStudio.ConnectedService.Wcf",
"Version": "15.0.20406.879",
"GettingStartedDocument": {
"Uri": "https://go.Microsoft.com/fwlink/?linkid=858517"
},
"ExtendedData": {
"Uri": "*****?singleWsdl",
"Namespace": "Transverse.TokenService",
"SelectedAccessLevelForGeneratedClass": "Public",
"GenerateMessageContract": false,
"ReuseTypesinReferencedAssemblies": true,
"ReuseTypesinAllReferencedAssemblies": true,
"CollectionTypeReference": {
"Item1": "System.Collections.Generic.List`1",
"Item2": "System.Collections.dll"
},
"DictionaryCollectionTypeReference": {
"Item1": "System.Collections.Generic.Dictionary`2",
"Item2": "System.Collections.dll"
},
"CheckedReferencedAssemblies": [],
"InstanceId": null,
"Name": "Transverse.TokenService",
"Metadata": {}
}
}
Ma question, comment puis-je charger le bon service en fonction de l'environnement utilisé.
Remarque.
Dans mon projet, je n'avais ni appsettings ni web config. Il s’agit d’une bibliothèque de classes .net principale appelée dans l’application principale ASP.NET en tant que middleware.
Pour qui est intéressé par la solution J'ai ajouté un point de terminaison pour mon service dans chaque application. {Environment} .json et dans la classe de service, j'injecte une nouvelle instance de mon service basée sur la variable d'environnement ASPNETCORE_ENVIRONMENT
services.AddTransient<Transverse.TokenService.ITokenService>(provider =>
{
var client = new Transverse.TokenService.TokenServiceClient();
client.Endpoint.Address = new System.ServiceModel.EndpointAddress(Configuration["Services:TokenService"]);
return client;
});
Peut-être n'est pas le meilleur mais cela fonctionne bien.
D'après ce que j'ai compris de cet article , voici la recommandation de Microsoft:
ConfigureEndpoint()
en définissant une nouvelle valeur pour le point de terminaison Exemple:
namespace Your_Reference_Service_Namespace
{
public partial class Your_Reference_Service_Client
{
static partial void ConfigureEndpoint(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials)
{
serviceEndpoint.Address =
new System.ServiceModel.EndpointAddress(new System.Uri("http://your_web_service_address"),
new System.ServiceModel.DnsEndpointIdentity(""));
}
}
}
Ici, vous pouvez prendre la valeur du fichier appsettings.json
new System.Uri (configuration.GetValue ("yourServiceAddress")
Utilisez une ChannelFactory
pour consommer votre service . WCF ChannelFactory vs générateur de proxy
Une ChannelFactory
vous permet de définir une EndpointAddress
. Comment: utiliser ChannelFactory
L'URL du noeud final peut être chargée à partir d'un fichier de configuration. Dans une configuration plus avancée, une recherche de répertoire pour le service peut être effectuée pour récupérer l'URL de l'environnement dans lequel l'application est déployée. https://en.wikipedia.org/wiki/Service_provider_interface
https://github.com/jolmari/netcore-wcf-service-proxy
Exemple d'utilisation de plusieurs services WCF à l'aide d'un proxy implémentation dans une application Web ASP.NET Core.