Creating a ClickOnce Smart Client CAB Based (SCSF) application with Environment Overrides
My application is distributed via ClickOnce and a requirement is to be able to provide endpoint overrides for multiple environments. Here's what was done to create the solution
Smart Client Software Factory includes a service called EndpointCatalog. It allow for easy management of endpoints with environment overrides. Start by adding a
private void AddServices() { IEndpointCatalog catalog = WorkItem.RootWorkItem.Services.Get<IEndpointCatalog>(false); if (catalog == null) { IEndpointCatalogFactory catalogFactory = new EndpointCatalogFactory("Endpoints"); catalog = catalogFactory.CreateCatalog(); WorkItem.RootWorkItem.Services.Add<IEndpointCatalog>(catalog); }
This will read the endpoint catalog from the application.config file , section Endpoints. Here is a partial app.config
<configSections> <section name="Endpoints" type="Microsoft.Practices.SmartClient.EndpointCatalog.Configuration.EndpointSection, Microsoft.Practices.SmartClient.EndpointCatalog" /> </configSections> <Endpoints> <EndpointItems> <add Name="DataService.DataClient" Address="http://server/DataService.svc" UserName="default-user-name" Password="default-password" Domain="default-domain"> <NetworkItems> <add Name="QA" Address="http://qa.server/DataService.svc"/> <add Name="UAT" Address="http://uat.server/DataService.svc"/> </NetworkItems> </add> </EndpointItems> </Endpoints>
The endpoints section defines an endpoint, and an override for each environment. The catalog will return the override if it exists, or the original entry if it does not.
To create the WCF client, I created the following function.
T CreateWCFClient<T, Ti>() where T : ClientBase<Ti>, new() where Ti : class { try { T client = new T(); if (endpointCatalog.EndpointExists(typeof(T).FullName)) { client.Endpoint.Address = new EndpointAddress (endpointCatalog.GetAddressForEndpoint(typeof(T).FullName, Environment)); } return client; } catch (Exception) { throw; } }
_DataWebService = CreateWCFClient<DataService.DataClient, DataService.IDataClient>();
No comments:
Post a Comment