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 服务和客户端将是桌面用户的主要内容,如果未能解决你的问题,请参考以下文章
强大的自托管服务器的最佳选择:WCF 与 ASP.NET Web Api