在Windows服务上调用客户端方法

时间:2014-02-11 15:29:06

标签: asp.net-mvc windows-services signalr

我在Windows服务中有一个SignalR客户端,可以在MVC应用程序中成功调用Server方法。首先是服务器代码:

 public class AlphaHub : Hub
    {
        public void Hello(string message)
        {
            // We got the string from the Windows Service 
            // using SignalR. Now need to send to the clients
            Clients.All.addNewMessageToPage(message);

            // Send message to Windows Service

        }

public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.MapSignalR("/signalr", new HubConfiguration());
        }
    }

Windows服务客户端是:

protected override async void OnStart(string[] args)
        {
            eventLog1.WriteEntry("In OnStart");
            try
            {
                var hubConnection = new HubConnection("http://localhost.com/signalr", useDefaultUrl: false);
                IHubProxy alphaProxy = hubConnection.CreateHubProxy("AlphaHub");

                await hubConnection.Start();

                await alphaProxy.Invoke("Hello", "Message from Service");
            }
            catch (Exception ex)
            {
                eventLog1.WriteEntry(ex.Message);
            }
        }

它向MVC服务器发送消息。现在我想从服务器到客户端调用另一种方式。 “客户端编程指南”具有以下代码示例,这些代码示例不起作用,因为它不是桌面。

WinRT Client code for method called from server without parameters (see WPF and Silverlight examples later in this topic)
var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHub.On("notify", () =>
    // Context is a reference to SynchronizationContext.Current
    Context.Post(delegate
    {
        textBox.Text += "Notified!\n";
    }, null)
);
await hubConnection.Start();

如何在客户端上调用方法?

2 个答案:

答案 0 :(得分:4)

.NET客户端代码似乎很好。您可以简单地删除Context.Post,因为您的客户端在Windows服务中运行并且不需要SyncContext:

protected override async void OnStart(string[] args)
{
    eventLog1.WriteEntry("In OnStart");
    try
    {
        var hubConnection = new HubConnection("http://localhost.com/signalr", useDefaultUrl: false);
        IHubProxy alphaProxy = hubConnection.CreateHubProxy("AlphaHub");

        stockTickerHub.On("Notify", () => eventLog1.WriteEntry("Notified!"));

        await hubConnection.Start();

        await alphaProxy.Invoke("Hello", "Message from Service");
     }
     catch (Exception ex)
     {
            eventLog1.WriteEntry(ex.Message);
     }
}

您可以从服务器上的AlphaHub内部调用“Notify”回调,如下所示:

public class AlphaHub : Hub
{
    public void Hello(string message)
    {
        // We got the string from the Windows Service 
        // using SignalR. Now need to send to the clients
        Clients.All.addNewMessageToPage(message);

        // Send message to the Windows Service
        Clients.All.Notify();
    }

由于我们使用的是Clients.All,因此任何客户都可以收听这些通知。如果您想避免这种情况,您需要一些方法来验证Windows服务并获取其ConnectionId。完成后,您可以特别发送到Windows服务:

Clients.Client(serviceConnectionId).Notify();

答案 1 :(得分:0)

希望这会有所帮助。

具有自托管SignalR的Windows服务

public partial class MyWindowsService : ServiceBase
    {
        IDisposable SignalR { get; set; }

        public class SignalRStartup
        {
            public static IAppBuilder App = null;

            public void Configuration(IAppBuilder app)
            {
                app.Map("/signalr", map =>
                {
                    map.UseCors(CorsOptions.AllowAll);
                    var hubConfiguration = new HubConfiguration()
                    {
                        // EnableDetailedErrors = true
                    };

                    map.RunSignalR(hubConfiguration);
                });

            }


        }       

        public MyWindowsService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args) { Start(); }

        protected override void OnStop() { Stop(); }

        public void Start()
        {
            SignalR = WebApp.Start<SignalRStartup>("http://localhost:8085/signalr");
            CallToMvcJavascript();
        }

        public new void Stop()
        {
            SignalR.Dispose();
        }

    private void CallToMvcJavascript(){
      GlobalHost.ConnectionManager.GetHubContext<MyHub>().Clients.All.addNotice(// object/data to send//);
     }
}

Windows服务中的集线器

public class MyHub : Hub
{
    public void Send()
    {
        Clients.All.confirmSend("The service received the client message");
    }
}

Javascript

  $.connection.hub.logging = true;
   $.connection.hub.url = "http://localhost:8085/signalr";
   var notices = $.connection.myHub;

notices.client.addNotice = function(notice) {
    console.log(notice);
};

notices.client.confirmSend = function(msg) {
    alert(msg);
};

$.connection.hub.start().done(function() {
    $('#myTestBtn').on('click', function() {
        notices.server.send();
    });
});