gpt4 book ai didi

c# - SignalR 2.0 更改 Json Serializer 以支持派生类型对象

转载 作者:可可西里 更新时间:2023-11-01 03:02:11 25 4
gpt4 key购买 nike

请注意,我在这里明确引用了 SignalR 2.0 ...我已经看到一些(令人讨厌的)方法用于 SignalR 1.1/1.2 ...但还没有用于 2.0。

有没有人成功更改 SignalR 2.0 默认 json 序列化程序以启用派生类型的发送?根据我对 SignalR 2.0 的了解,这应该是可能的,但是,我没有任何运气,也没有在任何地方找到完整的示例。

我是这样开始的……如有任何帮助,我们将不胜感激。

我的 Startup.cs

    [assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{

public class Startup
{
public void Configuration(IAppBuilder app)
{
// this should allow the json serializer to maintain the object structures
var serializer = new JsonSerializer()
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
TypeNameHandling = TypeNameHandling.Objects,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
};

// register it so that signalr can pick it up
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer);

app.MapSignalR();
}
}
}

Hub 上的方法

    public void AddStock(Stock stock)
{
string stockType = stock.GetType().ToString();
Console.WriteLine("The type of stock we got was: " + stockType);
}

我的控制台测试应用程序(发布到中心)

    myDataHub.Invoke("AddStock", new NyseStock()
{
Company = "Microsoft",
NyseSymbol = "MSFT"
});

myDataHub.Invoke("AddStock", new DaxStock()
{
Company = "Microsoft",
DaxSymbol = "DMSFT"
});

只是为了好的措施 Stock.cs

    namespace Messages
{
public class Stock
{
public string Company
{
get;
set;
}
public decimal Price
{
get;
set;
}
}

public class NyseStock : Stock
{
public string NyseSymbol
{
get;
set;
}
}

public class DaxStock : Stock
{
public string DaxSymbol
{
get;
set;
}
}
}

我的第一个倾向是我忽略了在客户端中设置序列化程序。所以我在创建连接之后但在创建集线器代理之前添加了以下内容:

    myConnection = new HubConnection("http://localhost:64041/");
// Update the serializer to use our custom one
myConnection.JsonSerializer = new JsonSerializer()
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
TypeNameHandling = TypeNameHandling.Objects,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
};

//Make proxy to hub based on hub name on server
myDataHub = myConnection.CreateHubProxy("DataHub");

然而,这只会在 myDataHub.Invoke(..) 调用期间导致 InvalidOperationException(无法发送数据,因为连接处于断开状态。在发送任何数据之前调用开始。)。

最佳答案

问这个问题已经有一段时间了。为了将来引用,需要在创建代理后调用 myConnection.Start() 方法,如下所示

myConnection = new HubConnection(endpoint);

proxy = _conn.CreateHubProxy("DataHub");
proxy.On<string>("ServerEvent", ClientHandler);

myConnection.Start();

proxy.Invoke("hubMethod", ...);

关于c# - SignalR 2.0 更改 Json Serializer 以支持派生类型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19473337/

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