// // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // .Net StockTrader Sample WCF Application for Benchmarking, Performance Analysis and Design Considerations for Service-Oriented Applications //====================================================================================================== // This is the host program for the Configuration Service - a console application //====================================================================================================== //====================================================================================================== // Code originally contributed by Microsoft Corporation. // This contribution to the Stonehenge project is limited strictly // to the source code that is submitted in this submission. // Any technology, including underlying platform technology, // that is referenced or required by the submitted source code // is not a part of the contribution. // For example and not by way of limitation, // any systems/Windows libraries (WPF, WCF, ASP.NET etc.) // required to run the submitted source code is not a part of the contribution //====================================================================================================== using System; using System.Collections.Generic; using System.Data; using System.Text; using System.Threading; using System.Net; using System.Diagnostics; using System.ServiceModel; using System.ServiceModel.Configuration; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; using System.ServiceModel.Activation; using Trade.ConfigServiceConfigurationSettings; using Trade.ConfigServiceContract; using Trade.ConfigServiceDataContract; using Trade.ConfigServiceImplementation; using Trade.Utility; namespace Trade.ConfigServiceConsoleHost { class ConfigService_ConsoleHost { /// /// The program entry class. Note how this simply inherits from the provided base class. /// class ConfigHost : IDisposable { private ServiceHost host; public void startUp() { string shortHostName = System.Net.Dns.GetHostName(); IPHostEntry myEntry = System.Net.Dns.GetHostEntry(shortHostName); string myName = myEntry.HostName; Settings thisSettings = new Settings(); Uri TradeServiceUriBase = new Uri("http://" + myName + ":7000/tradeconfigservice"); //Create a ServiceHost for the configservice service. Type serviceType = typeof(ConfigService); host = new ServiceHost(serviceType, TradeServiceUriBase); //Describe for Console output StockTraderUtility.DescribeService(host); host.Open(); } //private ServiceHost addEndpointsAndBehaviors(ServiceHost host, Uri uri) //{ // ServiceMetadataBehavior mexbehavior = new ServiceMetadataBehavior(); // mexbehavior.HttpGetEnabled = true; // mexbehavior.HttpGetUrl = uri; // host.Description.Behaviors.Add(mexbehavior); // Binding mexHttpBinding = MetadataExchangeBindings.CreateMexHttpBinding(); // ServiceEndpoint sepMex = host.AddServiceEndpoint(typeof(IMetadataExchange), mexHttpBinding, uri.AbsoluteUri + "/mex"); // BasicHttpBinding httpBinding = new BasicHttpBinding(); // host.AddServiceEndpoint(typeof(IConfigService), httpBinding, ""); // //Describe for Console output // StockTraderUtility.DescribeService(host); // return host; //} public void Dispose() { if (host != null) { host.Abort(); host.Close(); } } } /// /// The program entry class. Note how this simply inherits from the provided base class. /// class ConfigTestClient { private Uri GetUri() { string shortHostName = System.Net.Dns.GetHostName(); IPHostEntry myEntry = System.Net.Dns.GetHostEntry(shortHostName); string myName = myEntry.HostName; return new Uri("http://" + myName + ":7000/tradeconfigservice"); } //tests the config service by returning the uri of the Business Service that the DOTNET_CLIENT //currently points to in the database public void RunClientTest() { try { var client = new ChannelFactory(); client.Endpoint.Binding = new BasicHttpBinding(); var proxy = client.CreateChannel(new EndpointAddress(GetUri())); var request = new ClientConfigRequest(); request.ClientName = Settings.CLIENT_LABEL; var response = proxy.GetClientConfig(request); if (response == null) throw new Exception("No DB Entry for " + Settings.CLIENT_LABEL + ". Run SetupActions.sln to set up the database correctly"); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Test Success"); Console.WriteLine(" Current DOTNET_CLIENT-> BS = {0}", response.BSName); Console.ForegroundColor = ConsoleColor.Gray; } catch (Exception ex) { //Debugger.Break(); StockTraderUtility.Logger.WriteErrorMessage("Error running tests: " + ex.ToString()); } } //tests the config service by returning the uri of the Order Processing Service that the DOTNET_BS //currently points to in the database public void RunBsTest() { try { var client = new ChannelFactory(); client.Endpoint.Binding = new BasicHttpBinding(); var proxy = client.CreateChannel(new EndpointAddress(GetUri())); var request = new ClientConfigRequest(); request.ClientName = Settings.CLIENT_LABEL; var response = proxy.GetClientConfig(request); if (response == null) throw new Exception("No DB Entry for " + Settings.CLIENT_LABEL + ". Run SetupActions.sln to set up the database correctly"); var bsrequest = new BSConfigRequest(); bsrequest.BSName = response.BSName; var bs = proxy.GetBSConfig(bsrequest); if (bs == null) throw new Exception("No DB Entry for " + Settings.BS_LABEL + ". Run SetupActions.sln to set up the database correctly"); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Test Success"); Console.WriteLine(" Current {0}-> OPS = {1}", response.BSName, bs.OPSName); Console.WriteLine(" Current {0}-> DBHost = {1}", response.BSName, bs.DBHostName); Console.ForegroundColor = ConsoleColor.Gray; } catch (Exception ex) { //Debugger.Break(); StockTraderUtility.Logger.WriteErrorMessage("Error running tests: " + ex.ToString()); } } } [STAThread] static void Main(string[] args) { // Start Host Console.SetWindowSize(Console.LargestWindowWidth - 30, Console.LargestWindowHeight - 30); Console.Title = ".NET StockTrader Configuration Service Host"; bool restart = true; while (restart) { using (ConfigHost configHost = new ConfigHost()) { try { configHost.startUp(); Console.WriteLine(" {0} is started.", Console.Title); Console.WriteLine(); // Run Tests Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(" Running Tests for {0}", Console.Title); Console.WriteLine(); ConfigTestClient client = new ConfigTestClient(); client.RunClientTest(); client.RunBsTest(); Console.WriteLine(); } catch (Exception ex) { StockTraderUtility.Logger.WriteException(ex); } Console.WriteLine("Press Enter to quit or Ctrl+R to restart"); restart = WaitForRestart(); } } } private static bool WaitForRestart() { while (true) { // clear users input Console.CursorLeft = 0; Console.Write(' '); Console.CursorLeft = 0; // read users input var key = Console.ReadKey(); if ((key.Modifiers & ConsoleModifiers.Control) != 0 && key.Key == ConsoleKey.R) { return true; } if (key.Key == ConsoleKey.Enter || key.Key == ConsoleKey.Escape) { return false; } } } } }