小编Ext*_*Use的帖子

.Net Core SignalR-连接超时-心跳计时器-连接状态更改处理

只是要事先弄清楚,这个问题是关于.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

  • 在startup.cs中,添加到 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

对于HubClass,我添加了 public async Task HeartBeat(DateTime now) => await Clients.All.InvokeAsync("Heartbeat", now);

显然,计时器,正在发送的数据(我只是在发送DateTime)和客户端方法名称都可以不同。

更新.Net Core 2.1+

见下面的评论;计时器回调不应再使用。现在,我实现了一个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

7
推荐指数
1
解决办法
5358
查看次数

Linq List.Contains(x =&gt; ...) - CS0103 x 在当前上下文中不存在(在 foreach 中)

我有两个要同步的简单列表。 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)

c#

6
推荐指数
1
解决办法
1169
查看次数

AspNet Core - 控制器级别的输入/输出 JSON 序列化设置

我的应用程序需要(几乎默认)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 吗?

c# asp.net-core json-serialization

5
推荐指数
1
解决办法
5526
查看次数