using ChatRoomContract;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.Extensions.Logging;
using SimpleRpc.Serialization.Hyperion;
using SimpleRpc.Transports;
using SimpleRpc.Transports.Http.Client;
using System.Diagnostics;
using System.Net;
using NLog;
namespace GrpcToSimpleRPCAdapter;
public class Server
{
public static void Main(string[] args)
{
var self = new Server();
self.Run(args);
}
///
/// Logger for this class.
///
Logger log = LogManager.GetCurrentClassLogger();
///
/// Configures logging subsystem.
///
private void ConfigureLogging()
{
var config = new NLog.Config.LoggingConfiguration();
var console =
new NLog.Targets.ConsoleTarget("console")
{
Layout = @"${date:format=HH\:mm\:ss}|${level}| ${message} ${exception}"
};
config.AddTarget(console);
config.AddRuleForAllLevels(console);
LogManager.Configuration = config;
}
///
/// Program body.
///
/// Command line arguments.
private void Run(string[] args)
{
//configure logging
ConfigureLogging();
//indicate server is about to start
log.Info("Server is about to start");
//start the server
StartServer(args);
}
public IChatRoomService getSimpleRPCService()
{
//connect to the server, get service client proxy
var sc = new ServiceCollection();
sc
.AddSimpleRpcClient(
"chatRoomService", //must be same as on line 86
new HttpClientTransportOptions
{
Url = "http://127.0.0.1:5000/simplerpc",
Serializer = "HyperionMessageSerializer"
}
)
.AddSimpleRpcHyperionSerializer();
sc.AddSimpleRpcProxy("chatRoomService"); //must be same as on line 77
var sp = sc.BuildServiceProvider();
var chatRoom = sp.GetService();
Debug.Assert(chatRoom != null);
return chatRoom;
}
///
/// Starts integrated server.
///
/// Command line arguments.
private void StartServer(string[] args)
{
//create web app builder
var builder = WebApplication.CreateBuilder(args);
//configure integrated server
builder.WebHost.ConfigureKestrel(opts => {
opts.Listen(IPAddress.Loopback, 5002, opts =>
{
opts.Protocols = HttpProtocols.Http2;
});
});
//add support for GRPC services
builder.Services.AddGrpc();
//add the actual services
builder.Services.AddSingleton(getSimpleRPCService());
//build the server
var app = builder.Build();
//turn on request routing
app.UseRouting();
//configure routes
app.MapGrpcService();
//run the server
app.Run();
// app.RunAsync(); //use this if you need to implement background processing in the main thread
}
}