将您的Xamarin应用程序与SignalR保持联系

pexels-photo-292426

无论是使用XAMARIN表单还是本机XAMARIN.IOS / XAMARIN.ANDROID都会写入移动应用程序有时需求要求您的应用程序在服务器上更改时尽快更新。这可能是聊天应用程序,股票代码或任何监视应用程序,将实时数据显示为当前在后端运行的进程的用户。

假设我们想创建一个简单的聊天应用程序。如果我们将沿着HTTP的传统创建读取更新删除(CRUD)应用程序的路径,我们可能会选择每隔几秒或以便读取最新值的服务器。虽然这种方法提供了结果,但它具有一些缺点。为了命名一些:即使没有改变任何改变的要求,也没有改变,攀登电池用法类别加上你的服务器只能用请求敲击,只能告诉他们:“对不起没有新闻......” - 所以如果没有轮询,则推动。这就是WebSockets进来的地方。

WebSockets唯一的问题是.NET的实现靠近金属。这导致开发人员必须完成额外的实施努力。幸运的是,对于.NET开发人员来说,有SignalR,您需要在WebSockets周围的所有样板代码附带。 Web开发人员还将告诉您归还归还Singalr的倒退选项。作为Xamarin开发人员,您将永远不会使用这些功能。但是很好,您将很高兴通过易于处理连接,渠道或写入特定的连接客户端。

signalr是很长一段时间;它已被移植到 .NET核心 并且是.NET标准兼容。这是一个很好的消息,因为我们可以直接将信号客户端添加到我们的Xamarin表单应用程序 - 没有必需的平台/包装代码。但在我们开始实施客户之前,我们将首先必须创建一个启用信号的后端。

如果您是MICHINERR的新方法,请注意信号R和SIGNALR CORE之间存在相当大的区别。如果您今天正在使用ASP.NET核心或Azure函数正在编写新应用程序。你将想使用 信号核心 否则你将继续使用掌上攻击的令人讨厌的错误狩猎,而你的额头 - ♂️

服务器

实现后端时,我们可以选择两个选项。要么我们使用ASP.NET核心实现SignalR,或者我们决定使用zzes SignalR核心服务。稍后可以集成到ASP.NET核心或Azure函数应用程序中。 Azure选项还具有缩放功能 - 换句话说,您可以使用框中的SignalR获得高达100万个同时连接。

有关如何设置Azure函数和SignalR组合的更多详细信息,您将在官方中找到说明 文件.

对于我们的简单聊天应用程序,我们将为客户提供一种方式发送和接收消息。为此,我们必须创建一个SignalR集线器,提供一种发送消息的方法:

[FunctionName("SendMessage")]
public static Task SendMessage(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")]string message,
    [SignalR(HubName = "SignalRDemo")]IAsyncCollector<SignalRMessage> signalRMessages)
{
    return signalRMessages.AddAsync(
        new SignalRMessage
        {
            Target = "NewMessage",
            Arguments = new[] { message }
        });
}

在调用时,该方法将消息发送给所有连接的客户端。这将我们带到了我们的下一点。每个聊天参与者都将首先连接到集线器,以便可以收到消息。因此,让我们实现注册方法:

[FunctionName("Negotiate")]
public static SignalRConnectionInfo Negotiate(
[HttpTrigger(AuthorizationLevel.Anonymous)]HttpRequest req,
[SignalRConnectionInfo(HubName = "SignalRDemo")] SignalRConnectionInfo connectionInfo)
{
    // connectionInfo contains an access key token with a name identifier claim set to the authenticated user
    return connectionInfo;
}

The naming of the method is a convention from SignalR. In other words, you must name the method Negotiate, or your code will not work. No, I do not want to elaborate on how I found this one out the hard way 😉

通过功能和信号服务,我们现在可以将焦点转向客户端。

移动客户端

在移动客户端上,我们希望能够接收对该组的消息并键入响应。我们的简单应用程序必须居住在连接时仅接收消息。至少目前。但这是在所有荣耀中运行的聊天。

serightrchat.

Now let’s have a look at the ChatService which connects us to the backend and receives messages:

public async Task Connect()
{
    if (_connection.State == HubConnectionState.Connected) return;

    _connection.On<string>("NewMessage", (messageString) =>
    {
        var message = JsonConvert.DeserializeObject<Message>(messageString);
        _newMessage.OnNext(message);
        Debug.WriteLine(messageString);
    });

    await _connection.StartAsync();
}

请注意,我们在连接到后端之前注册接收器方法。这样,我们一旦连接到SignalR服务就开始接收更新。现在在实现Receiver方法时,必须确保类型签名与我们在服务器上之前定义的方法匹配。如果类型或名称不匹配,则永远不会收到任何消息。

自从阅读只有一半的乐趣,让我们实现发送消息:

public async Task Send(Message message)
{
    var serializedPayload = JsonConvert.SerializeObject(message);

    var response = await _httpClient.PostAsync("//gnabbersignalr.azurewebsites.net/api/SendMessage", new StringContent(serializedPayload));
    Debug.WriteLine(await response.Content.ReadAsStringAsync());
}

如果你从消息流中够了,但想要放弃你的眼睛,这里盯着裸露的应用程序是断开的方法:

public async Task Disconnect()
{
    await _connection.DisposeAsync();

    _connection = new HubConnectionBuilder()
        .WithUrl(backendUrl)
        .Build();
}

我希望您可以看到使用SignalR它是一个微风来实现向服务器的双向通信层。这将允许您的(移动)客户在接近实时发送和接收数据。使用SignalR的另一个副作用是您可以使用Web客户端轻松扩展应用程序。由于您最喜欢的JavaScript框架将允许您使用 SignalR客户端。如果您准备好开始使用SignalR,请务必查看 译文.

您可以找到整个示例,包括所有UI代码 GitHub..

这个博客是其中的一部分 十月Xamarin挑战。因此,请务必在编写Xamarin应用程序时查看其他帖子以获取更多最佳实践。

Hth.

Updated: