发布:2020/11/11 17:32:10作者:管理员 来源:本站 浏览次数:1273
我在Web应用程序通过使用.net远程处理与Windows服务通信的同一服务器上有一个Web应用程序和一个Windows服务. Windows服务检查与LDAP的连接是否正常,然后返回true,否则抛出异常. Windows服务的状态在网站上更新.
现在基础设施将会发生变化. Web应用程序将在Azure上运行,Windows服务将保留在客户端的计算机上(因为LDAP位于客户端).我需要像现在一样更新Web应用程序的状态.我已经介绍了Web API作为Web应用程序和Windows服务之间的中间层.
我无法找到更好的解决方案来实现这种情况.我考虑使用SignalR或Akka.remote.
我到目前为止所想的,如果我在Web API和Windows服务中使用SignalR并执行以下操作:
> Web应用程序使用Web API方法
> Web API方法使用SignalR并向Windows服务发送信号
> Windows服务检查LDAP连接并调用Web API方法以返回状态.
注意:我不知道如何将Windows服务作为客户端,并使其能够监听web api是否向其发送信号,因为我不需要为Windows服务使用自托管.我们可以使用web api,因为它已经托管了.
它可以实现吗?或者有更好的解决方案吗?请帮忙.
提前致谢.
解决方法:
我能够解决这个问题,并得到了解决方案.
Web API中startup.cs中的SignalR配置
public class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR("/signalr", new Microsoft.AspNet.SignalR.HubConfiguration()); } }
在Web API添加中心
public class ServiceStatusHub : Hub { private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<ServiceStatusHub>(); public static void GetStatus(string message) { hubContext.Clients.All.acknowledgeMessage(message); } }
在Web API操作方法中
public IEnumerable<string> Get() { // Query service to check status ServiceStatusHub.GetStatus("Please check status of the LDAP!"); return new string[] { "val1", "val2" }; }
在控制台应用程序中添加SignalR Client
public class SignalRMasterClient { public string Url { get; set; } public HubConnection Connection { get; set; } public IHubProxy Hub { get; set; } public SignalRMasterClient(string url) { Url = url; Connection = new HubConnection(url, useDefaultUrl: false); Hub = Connection.CreateHubProxy("ServiceStatusHub"); Connection.Start().Wait(); Hub.On<string>("acknowledgeMessage", (message) => { Console.WriteLine("Message received: " + message); /// TODO: Check status of the LDAP /// and update status to Web API. }); } public void SayHello(string message) { Hub.Invoke("hello", message); Console.WriteLine("hello method is called!"); } public void Stop() { Connection.Stop(); } }
在Program.cs类中
class Program { static void Main(string[] args) { var client = new SignalRMasterClient("http://localhost:9321/signalr"); // Send message to server. client.SayHello("Message from client to Server!"); Console.ReadKey(); // Stop connection with the server to immediately call "OnDisconnected" event // in server hub class. client.Stop(); } }
现在在postman中运行Web API并运行控制台应用程序.将建立双向通信.
注意:下面的代码是修复了控制台关闭时的问题,它没有立即触发OnDisconnected事件.
public void Stop() { Connection.Stop(); }
Check the image showing result.
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4