SignalR 自托管与 WCF 服务和客户端将是桌面用户

Posted

技术标签:

【中文标题】SignalR 自托管与 WCF 服务和客户端将是桌面用户【英文标题】:SignalR Self Hosting With WCF Service and Clients Would be Desktop Users 【发布时间】:2013-12-22 19:14:14 【问题描述】:

我的场景是我需要一个 SignalR 自托管 WCF 服务,该服务响应并向来自 Winform 或 WPF 的所有连接用户发送消息。

我已经尝试了很多如下:

我已经使用如下 SignalR 自托管代码创建了 WCF 服务,其中包含 3 个类和 1 个接口。 命名空间 SignalRServiceClass [服务合同] 公共接口 ISignalRServiceClass [运营合同] 字符串 GetsMessage(字符串名称); [运营合同] 无效配置(IAppBuilder 应用程序); [运营合同] 无效发送(字符串名称,字符串消息); 命名空间 SignalRServiceClass 公共类 SignalRServiceClass : ISignalRServiceClass 公共字符串 GetsMessage(字符串名称) 返回“来自服务的消息”+名称+“!”; 命名空间 SignalRServiceClass 类 ClassHub : 集线器 公共无效发送(字符串名称,字符串消息) Clients.All.addMessage(name, message); 命名空间 SignalRServiceClass 类启动 公共无效配置(IAppBuilder 应用程序) // app.UseCors(CorsOptions.AllowAll); // app.MapSignalR(); app.Map("/signalr", 地图 => map.UseCors(CorsOptions.AllowAll); var hubConfiguration= 新的 HubConfiguration EnableDetailedErrors=true, EnableJSONP=真 ; map.RunSignalR(hubConfiguration); );

其次是 Winform 客户端。我在这里很困惑如何在这里管理客户端代码,但我放了一些代码进行测试,如下所示。

私人无效按钮1_Click(对象发送者,EventArgs e) //MessageBox.Show(test.GetsMessage("这是测试消息")); var hubConnection = new HubConnection("http://localhost:50172/"); var serverHub = hubConnection.CreateHubProxy("MessageRecievingHub"); serverHub.On("broadCastToClients", message => MessageBox.Show(message)); hubConnection.Start().Wait();

请以这种方式指导我。 您的帮助将不胜感激。我已经尝试并搜索了很多但徒劳无功。

非常感谢。

【问题讨论】:

【参考方案1】:

你不需要 SignalR,你需要 XSockets WCF sample

【讨论】:

非常感谢您提供的链接。但你能告诉我吗? XSockets 可以在不同的 WinForm/WPF 客户端之间工作..?因为我不需要网络聊天,我实际上需要桌面应用程序到桌面应用程序,就像 Skype 或其他人一样...... 我的第二个问题是:XSockets 能否在具有不同解决方案的两个项目之间工作???? 是的,XSockets 可以在任何具有 .NET4 或 Mono 和 TCP/IP 的设备之间进行通信。 XSockets 是客户端/服务器,机器 2 机器,对等 2 对等。【参考方案2】:

SignalR 和 WCF 不会以这种方式进行互操作,也不需要这样做。如果您使用 SignalR,则没有理由使用 WCF——您可以在 IIS 或自托管上发布您的集线器(请参阅 asp.net/signalr 上的入门教程和自托管教程),并使用桌面或 javascript/html 客户端。

【讨论】:

感谢您的回复,但正如我在不同的示例中看到的那样。 SignalR 无法与具有不同解决方案的两个项目进行通信。如果我在一个解决方案中创建桌面并在另一个解决方案中创建 Web,那么它就无法相互通信。你能帮我解决这个问题吗?指南和教程链接将不胜感激.. 没有理由不能在多种应用程序类型中托管 SignalR 客户端 - SignalR 公开其端点并且不关心连接到它的客户端类型。我们的教程仅涉及 Web 客户端,但您可以在此处阅读有关创建 .NET 客户端的信息:asp.net/signalr/overview/signalr-20/hubs-api/…【参考方案3】:

您可以轻松地创建一个 .NET 客户端应用程序来与 SignalR 服务器进行通信 - 下面是一个简单的 WinForm .NET C# 客户端,用于发送和接收 SignalR 消息:

namespace SignalrTestClient

public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();
    

    async void Form1_Load(object sender, EventArgs e)
    
        var hubConnection = new HubConnection("http://localhost:8080/");
        IHubProxy hubProxy = hubConnection.CreateHubProxy("MyHub");
        await hubConnection.Start();
        hubProxy.On("addMessage", message => onData(message));
        await hubProxy.Invoke("Send", "Hello SignalR Server!");
    

    private void onData(string msg)
    
        Console.WriteLine(msg);
    


在您的 SignalR 服务器中,您只需要以下集线器类:

public class MyHub : Hub

    public void Send(string message)
    
        Console.WriteLine("Received a message from a client");
        if (message.Contains("Hello")) 
            Clients.All.addMessage("Well hello there client!");
        
    

也可以为 SignalR 创建 C++ 客户端

【讨论】:

以上是关于SignalR 自托管与 WCF 服务和客户端将是桌面用户的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 服务中使用自托管托管 SignalR

WCF 服务中的 SignalR 用于更新网站客户端

OWIN 自托管静态网站

强大的自托管服务器的最佳选择:WCF 与 ASP.NET Web Api

连接到 Windows 服务中自托管的 SignalR 的问题

使用 SignalR、WCF 双工服务和 ASP.Net 通用处理程序向客户端推送通知?