2017-03-17 42 views
0

我已經構建了一個託管遊戲服務器的應用程序,並且希望添加一個用於外部控制的web API。該應用程序目前只是一個控制檯應用程序,但最終將成爲一個Windows服務。我已經添加了Web API並能夠響應請求。我還在控制檯應用程序中添加了TcpServer,在Web API中添加了TcpClient以允許Web API將命令發送到控制檯應用程序。如何通過web api實現服務交互

但是,由於Web API由託管遊戲服務器的同一控制檯應用程序託管,有沒有一種方法可以將命令從Web API控制器類直接發送到遊戲服務器主機類?目前,它看起來是這樣的(以下簡稱爲節省空間,普通TCP代碼):

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(); 
    } 
} 

的GameServiceManager在控制檯應用程序實例化,然後調用StartService()。在其他應用程序中,我使用Events在父類和子類之間來回傳遞命令,但我似乎沒有太多的控制web api部分的東西。

+0

你可以有你的遊戲服務器靜態和訪問它從你的Web API? – StfBln

+0

我不這麼認爲,但我不確定。它必須跟蹤幾個子進程並保持兩個其他外部API之間的同步。 – Cam

+0

您是否在使用命名管道進行通信? – NPhillips

回答

1

如果您不能像其他人所建議的那樣使您的GameServiceManager類爲靜態,那麼您可以應用單例模式。

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

現在,在你的代碼的其餘部分的任何地方,你可以很容易地通過使用靜態屬性GameServiceManager.Instance

+0

現在超級有趣!這需要一些時間,但我會測試它,謝謝! – Cam

+0

我沒有公開實例,而是將它私有,然後創建了幾個利用私有實例的公共靜態函數。非常好,謝謝! – Cam

+0

好吧,「受保護的設置」會阻止任何外部代碼將實例設置爲其他內容,所以我認爲它可能與您實現hehe的最終結果相同。很高興,這有助於你! –

0

我已經使用SignalR酒吧和亞這在正常工作得到你GameServiceManager對象的引用網頁界面。我已經有了在Prism中使用EventAgregator的經驗,並且我正在尋找在我的web api中實現相同的功能,並發現EventAggregator Proxy Signal R通過Anders。根據上述文章,我做了一個快速的HelloWorld應用程序,可以幫助你。這種模式可以在web,web api和windows應用程序之間工作。

這裏是code samplesAnders

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