gpt4 book ai didi

c# - SignalR 我可以传递数据集吗

转载 作者:太空宇宙 更新时间:2023-11-03 18:31:24 24 4
gpt4 key购买 nike

我有一个分为两部分的 SignalR 应用程序。我在 MVC 应用程序(SignalR 服务器)和 Windows 服务(SignalR 客户端)之间来回传递基本消息。 Windows 服务位于具有 AdventureWork2012 数据库的后端计算机上。管理层希望 Windows 服务 - SignalR 客户端查询数据库并通过 SignalR 发回数据集。 SignalR 可以传递数据集吗?我收到一个异常“无效的 URI:Uri 字符串太长。”在我调用服务器方法时的事件日志中。

这是 MVC 服务器中心:

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);

// Call Windows Service
string message1 = System.Environment.MachineName;
Clients.All.Notify(message1);


}
public void Register(string registrationID,string connectionID)
{
// We got the string from the Windows Service
// using SignalR. Now need to send to the clients
System.Web.HttpContext.Current.Application["registrationID"] = registrationID + "|" + connectionID;
}

public void RecieveDataSet(DataSet ds)
{
Clients.All.addNewMessageToPage("Data Set recieved");
}

下面是抛出异常的Windows服务代码:

await alphaProxy.Invoke("RecieveDataSet", employees);

代码是:

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

await hubConnection.Start();
string cid = hubConnection.ConnectionId.ToString();
eventLog1.WriteEntry("ConnectionID: " + cid);
// Invoke method on hub

await alphaProxy.Invoke("Hello", "Message from Service - ConnectionID: " + cid + " - " + System.Environment.MachineName.ToString() + " " + DateTime.Now.ToString());
await
alphaProxy.Invoke("Register", "81577f58-0e05-43f4-b322-fbf0d9d1e79e",
hubConnection.ConnectionId.ToString());


alphaProxy.On("addNewMessageToPage", () => eventLog1.WriteEntry("Notified!"));

DataSet employees = new DataSet();
string connString = "...";
SqlConnection conn = new SqlConnection(connString);
string queryString = "SELECT * FROM [HumanResources].[Employee]";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, conn);
adapter.Fill(employees, "HumanResources.Employee");

await alphaProxy.Invoke("RecieveDataSet", employees);
}
catch (Exception ex)
{
eventLog1.WriteEntry(ex.Message);
}
}

是否可以传递数据集?如果不是,我是否必须序列化/反序列化?如果是这样,您可以显示执行此操作的代码吗?

最佳答案

出于多种原因(尤其是通过背板进行横向扩展),您希望使用 SignalR 使消息非常轻量级,因此我个人不会通过 SignalR 消息传递像 DataSet 这样的大东西。对于较大的有效负载,我通常建议您发送一条特定消息,告诉浏览器它应该更新该数据,然后通过使用传统的 GET 下载到某种基于 REST 的服务来更新数据。通过这种方式,您可以获得实时更新通知,但您使用的是传统的 HTTP GET 来传输实际负载。

关于c# - SignalR 我可以传递数据集吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21761486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com