// // 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 one of three optional host programs for the Business Service Layer. In this case a Console // application. You can also optionally run the Windows host, as well as the IIS-hosted implementation. //====================================================================================================== //====================================================================================================== // 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.Text; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.Threading; using System.ServiceModel; using System.ServiceModel.Configuration; using System.ServiceModel.Channels; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; using System.ServiceModel.Activation; using System.Net; using Trade.BusinessServiceConfigurationSettings; using Trade.BusinessServiceImplementation; using Trade.BusinessServiceContract; using Trade.OrderProcessorContract; using Trade.OrderProcessorServiceConfigurationSettings; using Trade.Utility; using Trade.ConfigServiceContract; using Trade.ConfigServiceConfigurationSettings; using Trade.IDAL; using Trade.DALFactory; using Trade.ConfigClient; using Trade.ConfigServiceDataContract; using Microsoft.IdentityModel.Configuration; using Microsoft.IdentityModel.Tokens; namespace Trade.BusinessServiceConsole { class BusinessService_ConsoleHost { /// /// The program entry class. Note how this simply inherits from the provided base class. /// public class BusinessServiceConsoleHost : IDisposable { private ServiceHost serviceHost; /// /// This is the key call where you will define parameters for the Master host startup, and call /// the base 'startService' method. /// public void start() { PermissiveCertificatePolicy.Enact(); string shortHostName = System.Net.Dns.GetHostName(); IPHostEntry myEntry = System.Net.Dns.GetHostEntry(shortHostName); string myName = myEntry.HostName; // Initialize the Settings and Service var thisSettings = new Trade.BusinessServiceConfigurationSettings.Settings(); var thisOPSSettings = new Trade.OrderProcessorServiceConfigurationSettings.Settings(); TradeServiceWcf.Initialize(); Uri TradeServiceUriBase = new Uri("http://" + myName + ":9000/tradebusinessservice"); //Create a ServiceHost for the Orderprocessor service. Type serviceType = typeof(TradeServiceWcf); serviceHost = new ServiceHost(serviceType, TradeServiceUriBase); // Configure the service host to use the Geneva Framework ServiceConfiguration configuration = new ServiceConfiguration(); configuration.AudienceRestriction.AudienceMode = System.IdentityModel.Selectors.AudienceUriMode.BearerKeyOnly; configuration.IssuerNameRegistry = new SimpleIssuerNameRegistry(); FederatedServiceCredentials.ConfigureServiceHost(serviceHost, configuration); StockTraderUtility.DescribeService(serviceHost); serviceHost.Open(); } public void Dispose() { if (serviceHost != null) { serviceHost.Abort(); serviceHost.Close(); } } } [STAThread] static void Main(string[] args) { Console.Clear(); Console.SetWindowSize(Console.LargestWindowWidth - 30, Console.LargestWindowHeight - 30); Console.Title = ".NET StockTrader Business Services Host"; bool restart = true; while (restart) { using (var serviceHost = new BusinessServiceConsoleHost()) { try { serviceHost.start(); //Test to see what the database specifies as the Order Processing Mode var configClient = new ConfigServiceClient(); var bsRequest = new BSConfigRequest(); bsRequest.BSName = Trade.BusinessServiceConfigurationSettings.Settings.BS_LABEL; var bsConfig = configClient.GetBSConfig(bsRequest); if (bsConfig == null) throw new Exception("No DB Entry for " + Trade.BusinessServiceConfigurationSettings.Settings.BS_LABEL + ". Run SetupActions.sln to set up the database correctly"); Console.WriteLine(" ORDER_PROCESSING_MODE is currently = {0}\n", bsConfig.OPSName); Console.WriteLine(" {0} is started\n", Console.Title); } 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; } } } } }