如何在Xamarin.Forms中处理WCF Duplex?

时间:2017-01-22 05:41:53

标签: c# wcf xamarin xamarin.ios xamarin.android

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

我的代理PCL库目标:

  • .NET Framework 4.5
  • ASP.NET Core 1.0
  • Windows 8
  • Windows Phone Silverlight 8
  • Xamarin.Android
  • Xamarin.iOS
  • Xamarin.iOS(经典)

我的问题是:我如何制作基于事件的服务架构(使用回调进行WCF双工通信) - 所以我可以在Xamarin.Forms中使用它?

此时人们的语气可能想要回答这个问题(或已经完成了),所以我展示了已经做过的事情:

我找到了票here和很多抱怨(在那里和其他地方),Xamarin对wcf双工通信一无所知。这看起来并不乐观。但也许你有一个很好的解决方法来解决这个问题?

至于现在,我这样做了:

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

所以,我正在异步调用一个服务,基本上等到它返回。因为它是异步的,所以客户端的屏幕不会被冻结。我不确定这是最好的解决方案......

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

谢谢,

1 个答案:

答案 0 :(得分:2)

WCF开发已多次暂停和恢复。鉴于REST服务(或者像Service Stack一样构建在其上的框架)是现代方法而不是WCF,我不相信你会看到在这个领域完成的工作。

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

至于你的问题,有很多方法可以通过现代服务来实现回合制游戏。一个简单的例子可能是使用为此构建的框架。 Xamarin.Android有一个与Google Play服务一起提供的回合制多人游戏广告资料包:

https://developers.google.com/games/services/common/concepts/turnbasedMultiplayer(您可以向下滚动到Client Implementations以支持Android以外的其他内容)

还有SignalR https://github.com/SignalR/SignalR之类的内容,您可以在其中创建基于回合制的机制。

最后,您也可以使用REST服务执行相同的操作。但是,使用REST服务,您无法真正捕获会话状态,但您可以建立一个基于回合的游戏,具有以下含义:

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

因此,您可以为游戏建模,以及玩家的状态基于turnID。这真的取决于你的回合制游戏的复杂性,但对于像Chess / Tic Tac Toe / Rock Paper Scissors这样的简单事物,这绝对是可能的。

在等待转弯的例子中,您可以抓住最新的转弯并返回哪个玩家转过来或者在这些线路上的东西。