2017-01-22 31 views
2

小背景: 我正在构建一个简单的回合制游戏。有一台托管WCF服务的服务器和使用Xamarin.Forms(使用PCL库)构建的客户端。所以我想用双工通道构建一个非常简单的“请求 - 响应”服务器 - 做出动作并等待响应(捕获事件中的响应/回调)。但是...问题是,我看不到netTcp绑定或任何双工/双绑定那里。只有BasicHttpBinding如何处理Xamarin.Forms中的WCF Duplex?

我的代理PCL库目标:

  • .NET框架4.5
  • ASP.NET 1.0的核心
  • 的Windows 8
  • 的Windows Phone 8的Silverlight
  • Xamarin.Android
  • Xamarin .iOS
  • Xamarin.iOS(经典)

我的问题是:我如何使基于事件的服务体系结构(与Callback的WCF双工通信) - 所以我可以在Xamarin.Forms中使用它?

在人这一点上的色调可能要downvote这个问题(或者已经做到了),所以我给搞什么名堂已经完成:

我发现票here和大量的抱怨(有和其他地方),Xamarin没有采取任何关于wcf双工通信。这看起来并不乐观。但是,也许你有一些很好的解决方法这个问题?

至于现在,我已经做了这样的:

public async Task<MyResponse> Start(int id) 
{ 
    MyResponse response; 
    // doing stuff... 
    return await Task.Factory.StartNew(() => response); 
} 

所以,我打电话异步服务,基本上等到返回。由于它是异步的,客户端的屏幕不会被冻结。我不知道这是最好的解决方案...

最好的解决方案是基于事件的架构(使用回调,因为你必须等待你的对手)。但我不知道该怎么做?它甚至有可能吗?

谢谢,

+0

有一个关于它的讨论:[你们可以让一些团队成员去更新Xamarin.Android和Xamarin.iOS的WCF吗?](https://github.com/dotnet/wcf/issues/1688 ) – qakmak

回答

2

WCF开发已被暂停和恢复多次。我不认为你会看到在这方面完成的工作,因为REST服务(或者像它构建的框架,比如服务栈)是现代方法而不是WCF。

您可以阅读没有计划支持此项目的列表:http://www.mono-project.com/docs/web/wcf/#components-with-no-plan-to-support(整篇文章提供了更多的历史到这个为好)

至于你的问题,有许多方法来接近了转向基于游戏的现代服务。一个简单的例子可能是使用为此构建的框架。Xamarin.Android有一个回合制多人游戏包,他们与谷歌播放服务运做:

https://developers.google.com/games/services/common/concepts/turnbasedMultiplayer(您可以向下滚动到Client Implementations支持不仅仅是Android的更多)

也有东西像SignalRhttps://github.com/SignalR/SignalR在您可以创建基于回合的机制。

最后,您还可以对REST服务执行相同的操作。然而,随着REST服务,您将无法真正捕捉会话状态,但你可以在有enpoints如意义上的回合制游戏模式:

/game/<gameID>/turn/<turnID>

因此,你可以一个博弈模型以及玩家轮到的状态是基于turnID。这真的取决于你基于回合的游戏的复杂性,但对于象棋/井字棋/岩石剪刀这样的简单事物来说,这绝对是可能的。

在等待转弯的例子中,您可以抓住最近的转弯并返回轮到它的位置或者这些线上的某个东西。

+0

Thx,问题..当你说“REST”时,你的意思是WCF的BasicHttpBinding?就像我在示例中显示的异步服务一样?或者一些ASP网络服务。我不熟悉什么科技是今天最现代化的宁静服务? –

+0

此外,我想保持相同的代码为iOS和Android(我使用xamarin.forms)。我已经分离了每个xamarin.forms客户端使用的pcl。所以,只适用于一个平台的解决方案对我来说并不好 –

+0

@MarvinLaw Google的'Play Games Services'可以在'iOS'上使用本地帮助包装(https://developers.google.com/games/services/ios/turnbasedMultiplayer) ,但所有Google的API都可以通过'Rest' apis(所有他们的“本机”包装器使用)并且可以跨平台(iOS,Android,Browser,Unity,...)使用:https://开发人员。 google.com/games/services/web/gettingstarted – SushiHangover