//
// 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;
}
}
}
}
}