Azure 上的简单实现 websockets

Posted

技术标签:

【中文标题】Azure 上的简单实现 websockets【英文标题】:Simple implementation websockets on Azure 【发布时间】:2017-11-29 07:14:59 【问题描述】:

我有一个托管一些服务的天蓝色云服务项目(myService.svc,通过“添加新服务引用”从 wsdl 文件生成)。

这很好用,而且操作起来非常简单。

服务声明示例:

<service behaviorConfiguration="myBehaviour" name="myService">
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <endpoint address="" behaviorConfiguration="" binding="wsHttpBinding" bindingConfiguration="CentralSystemServiceSoap" contract="CentralSystemService" />
      </service>

[System.ServiceModel.ServiceContractAttribute("CentralSystemService")]
public interface CentralSystemService



但我的一些设备现在需要使用 JSON 的 websockets 协议。

我已经阅读了很多关于 websockets 工作原理的文章,并且我发现了很多不同的实现,这些实现似乎太复杂了,但主要是它们都完全不同。我一直在寻找更接近 WCF 服务的实现。但是所有的例子都不包括握手部分。

我的项目在 azure(云服务实例)上发布,我以前的所有 svc 必须仍在工作。

我可以将所有内容保存在同一个项目中并在同一个项目中创建我的 websockets JSON 服务吗? 我问这个问题是因为我发现的大多数示例都包含一个用于打开服务器侦听器的 Main 函数,而我无法在我的 Cloud 项目中设置启动 main 方法。

你会推荐我哪种实现方式?

谢谢,

【问题讨论】:

【参考方案1】:

当使用 NetHttpBinding 绑定时,我们可以通过回调协定通过 WebSockets 在 WCF 服务和客户端之间进行通信。以下步骤供您参考。

第一步,在web.config中,我们需要将NetHttpBinding配置为protocolMapping。

<protocolMapping>
  <add scheme="http" binding="netHttpBinding"/>
  <add scheme="https" binding="netHttpsBinding"/>
</protocolMapping>

第 2 步,创建带有回调的服务合约。

[ServiceContract]
public interface IServiceCallback

    [OperationContract(IsOneWay = true)]
    Task SendMessageBack(string message);


[ServiceContract(CallbackContract = typeof(IServiceCallback))]
public interface IService

    [OperationContract(IsOneWay = true)]
    Task DoSomething(string parameter);

第三步,在WCF服务中,我们可以获取服务回调的实例,并用它来向客户端发送消息。

public class MySocketService : IService

    public async Task DoSomething(string parameter)
    
        var callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>();
        var random = new Random();
        int randomNumber = 2;

        while (((IChannel)callback).State == CommunicationState.Opened)
        
            await callback.SendMessageBack("Call back message:" + randomNumber);
            randomNumber += random.Next(10);
            await Task.Delay(1000);
        
    

第四步,在客户端,我们需要实现服务回调接口,并使用它来接收来自服务的消息。

class Program

    static void Main(string[] args)
    
        var context = new InstanceContext(new CallbackHandler());
        var client = new ServiceClient(context);
        client.DoSomething("a message");
        Console.ReadLine();
    



public class CallbackHandler : IServiceCallback

    void IServiceCallback.SendMessageBack(string message)
    
        Console.WriteLine(message);
    

如需了解更多信息,请参考以下链接。

How to: Create a WCF Service that Communicates over WebSockets

【讨论】:

谢谢!但是我无权访问客户端,客户端是我必须与之通信的设备。 + 我不明白握手部分在您的代码/链接中是如何工作的。 如果您需要对数据传输进行更多控制,我建议您通过名为SuperSocket 的.NET 库创建一个websocket 服务器。它内置JSON支持,支持windows服务、控制台应用程序和网站等多种托管环境。

以上是关于Azure 上的简单实现 websockets的主要内容,如果未能解决你的问题,请参考以下文章

Azure DSVM 上的 Theano

如何为 Windows Azure Web 角色上的 PHP 项目配置 TFS 构建定义以实现持续集成?

Azure 数据库上的 Sqlite 已锁定

如何在任何分支上的每次新推送时触发 Azure Pipeline?

Windows Azure上的时钟同步质量?

Azure 中托管的节点服务器上的 Websocket 失败