2017-06-26 1 views
1

Ich habe Probleme, die benutzerdefinierte Beispielabfrage der Requestlogs zu erhalten, die in einem Servicestack-Dienst funktionieren.ServiceStack - Autoquery Request protokolliert Problem

Ich verwende VS2017 und habe die leere ServiceStack ASP.NET-Vorlage verwendet, um eine neue Lösung zu erstellen. Ich habe dann einen Teil des Codes aus dem Beispiel in http://docs.servicestack.net/autoquery-service#view-request-logs-in-autoquery-viewerhttpsgithubcomservicestackadmin hinzugefügt, nämlich die folgenden Klassen QueryRequestLogs, CustomAutoQueryDataServices und TodayLogs. Mein Apphost ist -

//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()); 
    } 
} 

Ich machte ein paar Anrufe nur um sicher zu gehen, dass etwas in den Anfrageprotokollen war. Dann gehe ich über den Link von der Metadatenseite zum Autoquery-Viewer. Welche der Suchoptionen ich auch auf der linken Seite versuche, ich bekomme eine "Objektreferenz, die nicht auf eine Instanz eines Objekts gesetzt ist". System.NullReferenceException, die von der Linie

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

in

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; 
     } 

    } 

Der vollständige Stack-Trace kommt, ist:

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) 

Wenn ich debuggen, die jeweils Protokolle, Abfrage und Request-Parameter sind nicht null.

Ich gehe davon aus, dass ich irgendwo etwas Einfaches verpasst habe, aber ich habe keine Ahnung was, und ich kann auch nicht sehen, wie man das weiter debuggt.

+0

Bitte veröffentlichen Sie den vollständigen StackTrace. – mythz

+0

Der Stack-Trace ist - bei ServiceStack.AutoQueryDataExtensions.CreateQuery [Von] (IAutoQueryData AutoQuery, IQueryData'1 Modell, IRequest Anforderung, IQueryDataSource db) bei Autoquery.ServiceInterface.CustomAutoQueryDataServices.Any (QueryRequestLogs Abfrage) in C: \ Repos \ test \ Autoquery \ Autoquery \ Autoquery.ServiceInterface \ CustomAutoQueryDataServices.cs: Zeile 28 bei ServiceStack.Host.ServiceRunner'1.Execute (IRequest-Anforderung, Objektinstanz, TRequest requestDto) – steve

+0

Bitte keine Stack-Traces oder Code in Kommentaren, nur Aktualisieren Sie Ihre Frage, um weitere Informationen hinzuzufügen. Können Sie Ihre Frage bitte mit dem ** vollständigen StackTrace ** aktualisieren? – mythz

Antwort

1

Die NullReferenceException ist, weil die AutoQuery Abhängigkeit ist null:

public IAutoQueryData AutoQuery { get; set; } 

Es ist null, weil Sie nur die AutoQuery RDBMS Eigenschaft importiert haben:

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

Anstelle der Eigenschaft AutoQuery Daten:

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

Erforderlich bei Verwendung eines der (nicht RDBMS) AutoQuery Data Sources.

+1

Mythz du bist ein Star, vielen Dank für Ihre Zeit und Geduld – steve