首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IModelBinder延迟

IModelBinder延迟
EN

Stack Overflow用户
提问于 2019-04-04 09:59:32
回答 1查看 19关注 0票数 0

我已经创建了一个使用接口作为post参数的控制器。由于参数是一个接口,所以我使用IModelBinder将request.Body转换为IQuery对象。IModelBinder的解析没有问题,在控制器上执行也没有问题。我得到的唯一问题是,从解析到IQuery对象的request.Body到收到Controller有一个延迟。

我用来解析请求正文的IModelBinder:

代码语言:javascript
复制
public Task BindModelAsync(ModelBindingContext bindingContext)
{
    string _queryJson = String.Empty;
    try
    {
        StreamReader _reader = new StreamReader(bindingContext.HttpContext.Request.Body);
        _queryJson = _reader.ReadToEnd();
        if (_queryJson.IsEmpty())
        {
            bindingContext.Result = ModelBindingResult.Failed();
            goto done;
        }
    }
    catch
    {
        bindingContext.Result = ModelBindingResult.Failed();
        goto done;
    }

    bindingContext.Result = ModelBindingResult.Success(QueryBuilder.ParseJson(DataContext, _queryJson));
    System.Diagnostics.Trace.WriteLine($"QUERY PARSING COMPLETE {DateTime.Now.ToString("HH:mm:ss.fffffff")}");
    done:
    return Task.CompletedTask;
}

控制器:

代码语言:javascript
复制
[HttpPost]
public IActionResult Query(IQuery query)
{
    try
    {
        System.Diagnostics.Trace.WriteLine($"QUERY ON CONTROLLER {DateTime.Now.ToString("HH:mm:ss.fffffff")}");
        query.ThrowArgumentNullException("query", "Missing query to execute");
        if (query is ISelectQuery)
        {
            var _rows = ((ISelectQuery)query)
                .ReadAll()
                .ToArray();
            return new EntitiesResult(((ISelectQuery)query).ViewEntity, _rows.Length, _rows);
        }
        else
            throw new InvalidCastException($"Only select query can be executed for now");
    }
    catch (Exception ex) { return new ExceptionResult(ex); }
}

正如上面的代码一样,我将跟踪放在跟踪IQuery对象何时完成解析以及控制器何时接收IQuery对象。我查看了输出窗口,发现在控制器上解析和接收后,存在10+s延迟。output

我认为这可能与日志有关,所以我在启动时禁用了日志:

代码语言:javascript
复制
services.AddLogging(builder =>
{
    builder.AddFilter("Microsoft", LogLevel.None)
                 .AddFilter("System", LogLevel.None)
                 .AddFilter("NToastNotify", LogLevel.None)
                 .AddConsole();
});

结果仍然存在延迟,对IQuery对象的ToString方法的调用仍被称为disabled

呼叫请求示例:postman

我没有找到ASP.Net核心ModelBindingContext的源代码,所以在被绑定器解析并在控制器上接收后,我不知道是什么导致了对象延迟。

EN

回答 1

Stack Overflow用户

发布于 2019-04-04 13:27:32

找到了问题所在。在阅读了ParameterBinder的源代码并使能登录到跟踪模式后,我找到了导致ObjectModelValidator的原因。在我的绑定器解析完成后,验证器开始并验证我的IQuery。这会导致ParameterBinder上的延迟

为了解决这个问题,我使用了Skorunka František在disable validator上提供的临时解决方案。

现在,我只需要找到仅针对我的特定IModelBinder禁用验证器的方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55506772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档