请注意,我在这里明确地引用了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");
然而,这只是导致了InvalidOperationException (数据无法发送,因为连接处于断开状态。在发送任何数据之前调用start。)在myDataHub.Invoke(..)调用。
发布于 2014-02-20 07:16:27
自从这个问题被问起已经有一段时间了。为便于将来参考,需要在创建代理后调用myConnection.Start()
方法,如下所示
myConnection = new HubConnection(endpoint);
proxy = _conn.CreateHubProxy("DataHub");
proxy.On<string>("ServerEvent", ClientHandler);
myConnection.Start();
proxy.Invoke("hubMethod", ...);
https://stackoverflow.com/questions/19473337
复制相似问题