从服务调用SignalR服务器端方法

本文关键字:服务器端 方法 SignalR 调用 服务 | 更新日期: 2023-09-27 17:57:56

我的体系结构与下图类似。我想知道如何从我的服务(也是独立的应用程序-windows service)调用SignalR server(它是独立的IIS应用程序)上的集线器操作。换句话说,我想通过SignalR server将通知从我的services推送到WebClients。在服务中使用.NET SignalR clients是唯一的方法吗?如果我想在Hub方法上使用[Authorize]属性,该怎么办?之后,我将不得不为我的服务创建单独的用户?

 ___________             ___________              ___________
|           |           |           |            |           |
|           |---------->|           |            |           |
| WebClient |           |  SignalR  |<-----------| Service1  |
|           |<----------|           |            |           |
|___________|           |___________|            |___________|
                             .
                            /|'
                             |
                             |
                         ___________             
                        |           |
                        |           |
                        | Service2  |           
                        |           |           
                        |___________|           

从服务调用SignalR服务器端方法

是的,您可以在windows服务中使用.NET客户端库。他们的行为方式与任何其他SignalR客户端相同。

在asp.net/SignalR.上有许多SignalR的综合示例

.NET客户端的身份验证选项

进行身份验证的一种方法是有一个单独的页面来设置身份验证cookie,然后从Response中获取cookie,然后在对用[Authorize]装饰的Hub上的方法执行调用时,在运行的windows服务实例中使用该cookie。

文档中的代码片段:

static void Main(string[] args)
    {
        var connection = new HubConnection("http://www.contoso.com/");
        Cookie returnedCookie;
        Console.Write("Enter user name: ");
        string username = Console.ReadLine();
        Console.Write("Enter password: ");
        string password = Console.ReadLine();
        var authResult = AuthenticateUser(username, password, out returnedCookie);
        if (authResult)
        {
            connection.CookieContainer = new CookieContainer();
            connection.CookieContainer.Add(returnedCookie);
            Console.WriteLine("Welcome " + username);
        }
        else
        {
            Console.WriteLine("Login failed");
        }    
    }
    private static bool AuthenticateUser(string user, string password, out Cookie authCookie)
    {
        var request = WebRequest.Create("https://www.contoso.com/RemoteLogin") as HttpWebRequest;
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.CookieContainer = new CookieContainer();
        var authCredentials = "UserName=" + user + "&Password=" + password;
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(authCredentials);
        request.ContentLength = bytes.Length;
        using (var requestStream = request.GetRequestStream())
        {
            requestStream.Write(bytes, 0, bytes.Length);
        }
        using (var response = request.GetResponse() as HttpWebResponse)
        {
            authCookie = response.Cookies[FormsAuthentication.FormsCookieName];
        }
        if (authCookie != null)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

的代码段https://www.contoso.com/RemoteLogin(用于上述示例):

namespace SignalRWithConsoleChat
{
    public partial class RemoteLogin : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string username = Request["UserName"];
            string password = Request["Password"];
            bool result = Membership.ValidateUser(username, password);
            if (result)
            {
                FormsAuthentication.SetAuthCookie(username, false);
            }
        }
    }
}