从服务调用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 |
| |
|___________|
是的,您可以在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);
}
}
}
}