只是要事先弄清楚,这个问题是关于.Net Core SignalR的,而不是以前的版本。
新的SignalR在IIS后面的WebSockets出现问题(我无法让它们在Chrome / Win7 / IIS Express上运行)。因此,我使用服务器发送事件(SSE)。但是,问题在于大约2分钟后那些超时,连接状态从2变为3。自动重新连接已被删除(显然,在以前的版本中,它的运行情况并不理想)。
我现在想实现一个心跳计时器,以阻止客户端超时,每30秒滴答一滴就可以很好地完成工作。
11月10日更新
我现在设法实现了服务器端心跳信号,该信号基本上取自Ricardo Peres的https://weblogs.asp.net/ricardoperes/signalr-in-asp-net-core
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider) app.UseSignalR(routes =>
{
routes.MapHub<TheHubClass>("signalr");
});
TimerCallback SignalRHeartBeat = async (x) => {
await serviceProvider.GetService<IHubContext<TheHubClass>>().Clients.All.InvokeAsync("Heartbeat", DateTime.Now); };
var timer = new Timer(SignalRHeartBeat).Change(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(30));
Run Code Online (Sandbox Code Playgroud)
对于HubClass,我添加了 public async Task HeartBeat(DateTime now) => await Clients.All.InvokeAsync("Heartbeat", now);
显然,计时器,正在发送的数据(我只是在发送DateTime)和客户端方法名称都可以不同。
见下面的评论;计时器回调不应再使用。现在,我实现了一个IHostedService(或更确切地说是抽象BackgroundService)来做到这一点:
public class HeartBeat : BackgroundService
{
private readonly IHubContext<SignalRHub> _hubContext;
public HeartBeat(IHubContext<SignalRHub> hubContext)
{
_hubContext = hubContext;
}
protected …Run Code Online (Sandbox Code Playgroud) asp.net-core-mvc asp.net-core-2.0 asp.net-core-2.1 asp.net-core-signalr
我有两个要同步的简单列表。
List<Guid> untrackedList包含一堆 Guid。
List<Foo> trackedList包含许多对象Foo(其中包括)具有 Guid 的 ID 属性。此列表由实体框架跟踪,因此我想为 untrackedList 中存在但尚未在 trackedList 中的那些添加新项目,并从 trackedList 中删除所有未出现在 untracked List 中的内容。
public void MyTestMethod()
{
const int someThing = 1000;
var untrackedList = new List<Guid>()
{
new Guid("8fcfb512-ca00-4463-b98a-ac890b3ac4da"),
new Guid("6532b60b-f047-4a96-9e5f-c5a242f9a1f5"),
new Guid("103cb7e4-1674-490c-b299-4b20d90e706c"),
new Guid("6c933cce-fb0e-4e1b-bbc3-e62235933cc8")
};
var trackedList = new List<Foo>()
{
new Foo() { SomeId = new Guid("6532b60b-f047-4a96-9e5f-c5a242f9a1f5"), Something = someThing },
new Foo() { SomeId = new Guid("12345678-abcd-1234-1234-1234567890ab"), Something = someThing }
};
// testing Find and …Run Code Online (Sandbox Code Playgroud) 我的应用程序需要(几乎默认)JSON 序列化设置:
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.AddJsonOptions(options =>
{
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
options.SerializerSettings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
});
Run Code Online (Sandbox Code Playgroud)
仅对于一个控制器,我需要为两个输入使用不同的命名策略(我使用模型绑定[FromBody] myComplexObject和输出
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
Run Code Online (Sandbox Code Playgroud)
我的问题几乎与Web API相同:在操作或控制器级别配置 JSON 序列化程序设置,但我要求的 AspNet Core 2.2+IControllerConfiguration已不再存在。
Core 2.1+ 等效问题在这里有一个回复:Configure input/output formatters on controllers with ASP.NET Core 2.1
那里的答案似乎有些零散或不完整 - 很难想象没有更简单的方法可以实现这一目标。有人会知道如何在单个控制器中为所有输入和输出使用 DefaultContractResolver 吗?