3月第五讲全局IAsyncActionFilter中设置的Order属性无效

我定义了两个异步的IAsyncActionFilter,分别用于参数校验以及返回结果包装;

我遇到的问题是:两个筛选器的调用顺序并没有按照 Order大小即先执行DataValidationFilter.Before 然后执行SucceedResultFilter.Before而是按照注入服务时调用AddDataValidation和AddUnifyResult的先后顺序执行。

例如先调用AddUnifyResult则先执行SucceedResultFilter.Before

筛选器定义如下

// 参数校验
public class DataValidationFilter(IOptions<ApiBehaviorOptions> options): IAsyncActionFilter, IOrderedFilter
{
    private const int FilterOrder = -1000;
    private readonly ApiBehaviorOptions _apiBehaviorOptions = options.Value;
    public int Order => FilterOrder;
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
          // do something
    }
}

// 返回结果包装
public class SucceedResultFilter : IAsyncActionFilter, IOrderedFilter
{
    private const int FilterOrder = 8888;

    public int Order => FilterOrder;

    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
       // do something
    }

添加两个筛选器的方式如下

主服务器一挂,从服务器应该乖乖地连上去的嘛,结果一个跑偏了。
日志中反复出现“Error condition on socket for SYNC: Connection reset by peer”表明从服务器试图与主服务器同步,但是连接被对方重置了。

这个问题可能有几个原因:

网络问题:临时的网络不稳定或延迟可能导致连接失败,有时候就是因为网络抽风了一下,可能一时半会儿的不稳定,或者主服务器复活后还在那儿慢悠悠地恢复状态,没顾上理它。两台从服务器配置一模一样,但有时候可能也就是一个小细节没注意到,比如网络的一丁点儿设置不同。

主服务器的配置:如果主服务器在宕机后重启,它可能需要一些时间来恢复服务,特别是如果有相关的数据恢复过程在进行。

从服务器的配置:尽管两台从服务器的配置相同,但也有可能是其中一台从服务器的网络配置有轻微差异,比如DNS解析、路由等。

防火墙或安全组规则:可能有防火墙规则或安全组设置在某些条件下暂时阻止了连接,防火墙或安全组规则这些小家伙有时候会捣蛋,也许是条件触发了某些规则,就把连接挡在外面了。如果数据多到跟春节回家的人潮一样,主服务器可能还在忙着处理呢,所以它会让从服务器排排坐,耐心等一下。。

同步队列:如果有很多数据需要同步,主服务器可能会在处理完一个同步请求后才能接受另一个,导致一台从服务器需要等待。

通常,这种问题可以通过以下几种方法来诊断和解决:

检查网络连接:确保所有服务器之间的网络连接是稳定的。
检查服务器日志:主服务器和从服务器的日志可能会提供更多关于问题的细节。
检查配置文件:确认配置文件中没有误差,特别是与网络连接相关的设置。
查看防火墙和安全组规则:确保这些规则没有错误地阻止了某些类型的网络流量。
检查资源使用情况:在高负载情况下,服务器可能会拒绝新的连接。
由于这种情况发生在服务器重新启动后,并且最终自己恢复了正常,这很可能是由于服务器启动初期的资源或服务还未完全稳定。如果这种情况经常发生,可能需要对启动流程进行优化,或者考虑在从服务器上设置重试连接的机制。如果问题依旧存在,可能需要专业的网络管理员或系统管理员来检查配置和网络条件。

闪退和报错看起来是wxPython相关的。看这个错误 “C++ assertion "GetEventHandler() == this" failed at ....\src\common\wincmn.cpp”,感觉像是在销毁一个窗口或控件的时候,还有些事件处理器(event handlers)没有被正确移除。可能是在关闭程序的时候,某些部件还在处理事件,然后它们就崩了。

这种事啊,一般是因为界面库和程序之间的交互出了点儿问题。可能是程序里有点儿代码没有按预期工作,比如没有在窗口销毁之前移除所有的事件监听器。或者呢,有可能是库的一个bug,或者是你的代码使用了库的某个功能,但是没完全按照它的说明书来。

你可以尝试查查看robotframework-ride的issue tracker,看看有没有人遇到过类似的问题,也许那里已经有解决方案了。如果没有,你可能得检查一下你的代码,确保所有注册的事件处理器都被正确地清理了。

https://m.iqiyi.com/v_1toasjsgh3o.html
https://www.iqiyi.com/v_1toasjsgh3o.html
https://www.iqiyi.com/v_21is04yum94.html
https://m.iqiyi.com/v_21is04yum94.html

而且呢,如果你用的是旧版的wxPython或robotframework-ride,试试更新到最新版,有时候这些奇怪的问题在新版里就修复了。这种GUI的问题,有时候就是要试试不同的方法,才能找到问题的症结所在。别急,慢慢来,一步步调试,总能找到解决的办法的!

/// <summary>
/// 添加规范化结果服务
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public static IServiceCollection AddUnifyResult(this IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add<SucceedResultFilter>();
        options.Conventions.Add(new UnifyResultApplicationModelConvention());
    });

    return services;
}

/// <summary>
/// 添加全局数据验证
/// </summary>
public static IServiceCollection AddDataValidation(this IServiceCollection services, Action<DataValidationOptions>? options = null)
{
    var configureOptions = new DataValidationOptions();
    options?.Invoke(configureOptions);

    if (configureOptions.GlobalEnabled)
    {
        services.Configure<ApiBehaviorOptions>(opt =>
        {
            opt.SuppressMapClientErrors = configureOptions.SuppressMapClientErrors;
            opt.SuppressModelStateInvalidFilter = configureOptions.SuppressModelStateInvalidFilter;
        });

        services.Configure<MvcOptions>(opt =>
        {
            opt.Filters.Add<DataValidationFilter>();
            opt.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = configureOptions.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes;
        });
    }

    return services;
}
  • 29
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值