【问题标题】:SignalR Self Hosting With WCF Service and Clients Would be Desktop UsersSignalR 自托管与 WCF 服务和客户端将是桌面用户
【发布时间】: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(); }

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

非常感谢。

【问题讨论】:

    标签: wcf signalr


    【解决方案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++ 客户端

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 2014-08-06
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多