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