ServiceStack - проблема с журналами запросов автозапроса

Я изо всех сил пытаюсь получить пример пользовательского автозапроса журналов запросов, работающих в сервисе стека.

Я использую VS2017 и использовал пустой шаблон ServiceStack ASP.NET для создания нового решения. Затем я добавил часть кода из примера в http://docs.servicestack.net/autoquery-service#view-request-logs-in-autoquery-viewerhttpsgithubcomservicestackadmin, а именно следующие классы QueryRequestLogs, CustomAutoQueryDataServices и TodayLogs. Мой apphost -

//VS.NET Template Info: https://servicestack.net/vs-templates/EmptyAspNet
public class AppHost : AppHostBase
{
    /// <summary>
    /// Base constructor requires a Name and Assembly where web service implementation is located
    /// </summary>
    public AppHost()
        : base("Autoquery", typeof(MyServices).Assembly) { }

    /// <summary>
    /// Application specific configuration
    /// This method should initialize any IoC resources utilized by your web service classes.
    /// </summary>
    public override void Configure(Container container)
    {

        Plugins.Add(new RequestLogsFeature
        {
            RequestLogger = new CsvRequestLogger(
    files: new FileSystemVirtualPathProvider(this, Config.WebHostPhysicalPath),
    requestLogsPattern: "requestlogs/{year}-{month}/{year}-{month}-{day}.csv",
    errorLogsPattern: "requestlogs/{year}-{month}/{year}-{month}-{day}-errors.csv",
    appendEvery: TimeSpan.FromSeconds(1)
),
            EnableResponseTracking = true
        });

        Plugins.Add(new AutoQueryFeature { MaxLimit = 100 });
        Plugins.Add(new AdminFeature());
    }
}

Я сделал пару звонков, просто чтобы убедиться, что что-то было в журналах запросов. Затем я иду в средство просмотра автозапроса по ссылке со страницы метаданных. Какой бы вариант поиска я ни выбрал с левой стороны, я получаю "Ссылка на объект не установлена ​​на экземпляр объекта". System.NullReferenceException, который исходит из строки

var q = AutoQuery.CreateQuery(query, Request,
    db: new MemoryDataSource<RequestLogEntry>(logs, query, Request));

в

public class CustomAutoQueryDataServices : Service
{
    public IAutoQueryData AutoQuery { get; set; }

    public object Any(QueryRequestLogs query)
    {
        var date = query.Date.GetValueOrDefault(DateTime.UtcNow);
        var logSuffix = query.ViewErrors ? "-errors" : "";
        var csvLogsFile = VirtualFileSources.GetFile(
            "requestlogs/{0}-{1}/{0}-{1}-{2}{3}.csv".Fmt(
                date.Year.ToString("0000"),
                date.Month.ToString("00"),
                date.Day.ToString("00"),
                logSuffix));

        if (csvLogsFile == null)
            throw HttpError.NotFound("No logs found on " + date.ToShortDateString());

        var logs = csvLogsFile.ReadAllText().FromCsv<List<RequestLogEntry>>();
        try
        {
            var q = AutoQuery.CreateQuery(query, Request,
                db: new MemoryDataSource<RequestLogEntry>(logs, query, Request));
            return AutoQuery.Execute(query, q);
        }
        catch (Exception ex)
        {
            return ex;
        }

    }

Полная трассировка стека:

at Autoquery.ServiceInterface.CustomAutoQueryDataServices.Any(QueryRequestLogs query) in C:\Repos\test\Autoquery\Autoquery\Autoquery.ServiceInterface\CustomAutoQueryDataServices.cs:line 32
at ServiceStack.Host.ServiceRunner`1.Execute(IRequest request, Object instance, TRequest requestDto)
at ServiceStack.Host.ServiceExec`1.Execute(IRequest request, Object instance, Object requestDto, String requestName)
at ServiceStack.Host.ServiceRequestExec`2.Execute(IRequest requestContext, Object instance, Object request)
at ServiceStack.Host.ServiceController.ManagedServiceExec(ServiceExecFn serviceExec, IService service, IRequest request, Object requestDto)
at ServiceStack.Host.ServiceController.<>c__DisplayClass36_0.<RegisterServiceExecutor>b__0(IRequest req, Object dto)
at ServiceStack.Host.ServiceController.Execute(Object requestDto, IRequest req)
at ServiceStack.HostContext.ExecuteService(Object request, IRequest httpReq)
at ServiceStack.Host.RestHandler.GetResponse(IRequest request, Object requestDto)
at ServiceStack.Host.RestHandler.<>c__DisplayClass13_1.<ProcessRequestAsync>b__0(Task t)
at ServiceStack.AsyncExtensions.Continue[TOut](Task task, Func`2 next)
at ServiceStack.Host.RestHandler.ProcessRequestAsync(IRequest httpReq, IResponse httpRes, String operationName)
at ServiceStack.Host.Handlers.HttpAsyncTaskHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
at System.Web.HttpApplication.PipelineStepManager.ResumeSteps(Exception error)
at System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb)
at System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr rootedObjectsPointer, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr rootedObjectsPointer, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
at System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr pHandler, RequestNotificationStatus& notificationStatus)
at System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr pHandler, RequestNotificationStatus& notificationStatus)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr rootedObjectsPointer, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)
at System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr rootedObjectsPointer, IntPtr nativeRequestContext, IntPtr moduleData, Int32 flags)

Когда я отлаживаю, каждый из журналов, параметров запроса и запроса не равны нулю.

Я предполагаю, что где-то пропустил что-то простое, но я понятия не имею, что, и я не могу увидеть, как отладить это дальше.

1 ответ

NullReferenceException потому что AutoQuery Зависимость равна нулю:

public IAutoQueryData AutoQuery { get; set; }

Это null потому что вы только импортировали функцию СУБД AutoQuery:

Plugins.Add(new AutoQueryFeature { MaxLimit = 100 });

Вместо функции данных AutoQuery:

Plugins.Add(new AutoQueryDataFeature { MaxLimit = 100 });

Что требуется при использовании любого из (не RDBMS) источников данных AutoQuery.

Другие вопросы по тегам