2017-03-17 3 views
0

Ich habe eine Anwendung zum Hosten eines Gameservers erstellt und möchte eine Web-API für die externe Kontrolle hinzufügen. Die Anwendung ist derzeit nur eine Konsolen-App, wird aber letztendlich ein Windows-Dienst sein. Ich habe die Web-API hinzugefügt und kann auf Anfragen antworten. Ich habe auch einen TcpServer zur Konsolen-App und einen TcpClient zur Web-API hinzugefügt, damit die Web-API Befehle an die Konsolen-App senden kann.Wie Service-Interaktion über eine Web-API zu ermöglichen

Da die Web-API jedoch von der gleichen Konsolen-App gehostet wird, die den Spieleserver hostet, gibt es eine Möglichkeit, Befehle direkt von der Web-API-Controller-Klasse an die Host-Klasse des Host-Servers zu senden. Es sieht derzeit so etwas wie dieses (gemeinsame TCP-Code abgekürzt Platz zu sparen):

public class GameServiceManager 
{ 
    private IDisposable _restApi; 
    GameServer _gameServer; 

    public void StartService(NameValueCollection appSettings) 
    { 
     _restApi = WebApp.Start<MyHttpHostController>(url: restApiUrl); 
     _gameServer = new GameServer(); 
     // also starts TCP Server stuff to receive command 
    } 
} 

public class MyHttpHostController 
{ 
    public void Configuration(IAppBuilder appBuilder) 
    { 
     HttpConfiguration config = new HttpConfiguration(); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{action}/{id}", 
      defaults: new { controller = "RestApi", id = RouteParameter.Optional } 
     ); 

     appBuilder.UseWebApi(config); 
    } 
} 

public class RestApiController : ApiController 
{ 
    [HttpGet] 
    public IHttpActionResult resetGameServer() 
    { 
     // creates TCP Client to send command 
     return Ok(); 
    } 
} 

Die GameServiceManager in der Konsolenanwendung instanziiert wird, und ruft dann Startservice(). In anderen Anwendungen habe ich Events verwendet, um Befehle zwischen Eltern- und Kind-Klassen hin- und herzuübertragen, aber ich habe anscheinend nicht viel Kontrolle über die Web-API-Teile der Dinge.

+0

Können Sie Ihre Gameserver als statische und greifen Sie von Ihrem Web-api haben? – StfBln

+0

Ich glaube nicht, aber ich bin mir nicht sicher. Es muss einige untergeordnete Prozesse nachverfolgen und die Synchronisation zwischen zwei anderen externen APIs aufrechterhalten. – Cam

+0

Sie haben mit Named Pipes für die Kommunikation gesucht? – NPhillips

Antwort

1

Wenn Sie Ihre GameServiceManager-Klasse nicht statisch machen können, wie es jemand anderes vorgeschlagen hat, könnten Sie vielleicht ein Singleton-Muster darauf anwenden.

public class GameServiceManager 
{ 
    public static GameServiceManager Instance { get; protected set; } 

    public GameServiceManager() 
    { 
    if (GameServiceManager.Instance != null) 
     throw new Exception("singleton has already been created"); 

    GameServiceManager.Instance = this; 
    } 
} 

nun überall im Rest des Codes, können Sie einfach einen Verweis auf Ihr GameServiceManager Objekt erhalten, indem die statische Eigenschaft GameServiceManager.Instance mit

+0

Das ist jetzt super interessant! Es wird eine Weile dauern, aber ich werde es ausprobieren, danke! – Cam

+0

Anstatt die Instanz öffentlich zu machen, habe ich sie privat gelassen und dann ein paar statische statische Funktionen erstellt, die die private Instanz verwenden. Funktioniert gut, danke! – Cam

+0

Nun, das "geschützte Set" hätte verhindert, dass irgendein externer Code jemals Instanz auf etwas anderes setzt, also denke ich, dass es wahrscheinlich das gleiche Endergebnis ist, wie Sie hehe implementiert haben. Schön, dass dir das geholfen hat! –

0

Ich habe SignalR Pub und Unter verwendet, die in gut funktioniert Web-Interface. Ich hatte bereits Erfahrung mit EventAgregator in Prism und ich wollte es in meiner Web-API implementieren und EventAggregator Proxy Signal R By Anders finden. Basierend auf dem obigen Artikel habe ich eine schnelle HelloWorld Anwendung, die Ihnen helfen kann. Dieses Muster kann zwischen Web-, Web-API- und Windows-Anwendungen funktionieren.

Hier sind code samples von Anders

[HttpPost] 
    [Route("GenericEvent")] 
    public void GenericEvent([FromBody] string text) 
    { 
     eventAggregator.Publish(new GenericEvent<string>(text)); 
    } 
Verwandte Themen