Exception CanReadRequestBody

Hi,

I am trying to return an 404 HTTP Code in a service in case something is missing:

if (belegId == null)
{
  throw HttpError.NotFound($"Unkown sale number \"{request.SaleNumber}\"");
}

But unlike in other ServiceStack solutions this leads to the following errer in the console.

fail: ServiceStack.ServiceStackHost[0]
  Unkown sale number "dx"
  ServiceStack.HttpError: Unkown sale number "dx"
     at Mauve.Atida.API.ServiceInterface.PrescriptionsService.Post(MarkPrescriptionRequest request) in C:\Devel\Mauve.Atida.API\Mauve.Atida.API.ServiceInterface\PrescriptionsService.cs:line 58
     at ServiceStack.Host.ServiceRunner`1.ExecuteAsync(IRequest req, Object instance, TRequest requestDto) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/Host/ServiceRunner.cs:line 131
fail: ServiceStack.ServiceStackHost[0]
  Object reference not set to an instance of an object.
  System.NullReferenceException: Object reference not set to an instance of an object.
     at ServiceStack.HttpRequestExtensions.CanReadRequestBody(IRequest req) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/HttpRequestExtensions.cs:line 1145
     at ServiceStack.Host.InMemoryRollingRequestLogger.CreateEntry(IRequest request, Object requestDto, Object response, TimeSpan requestDuration, Type requestType)
     at ServiceStack.CsvRequestLogger.Log(IRequest request, Object requestDto, Object response, TimeSpan requestDuration) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/CsvRequestLogger.cs:line 150
     at ServiceStack.HttpExtensions.EndHttpHandlerRequestAsync(IResponse httpRes, Boolean skipHeaders, Boolean skipClose, Func`2 afterHeaders) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/HttpExtensions.cs:line 131
     at ServiceStack.HttpResponseExtensionsInternal.WriteToResponse(IResponse response, Object result, StreamSerializerDelegateAsync defaultAction, IRequest request, Byte[] bodyPrefix, Byte[] bodySuffix, CancellationToken token) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/HttpResponseExtensionsInternal.cs:line 389
     at ServiceStack.Host.Handlers.ServiceStackHandlerBase.HandleResponseNext(IRequest httpReq, IResponse httpRes, Object response) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/Host/Handlers/ServiceStackHandlerBase.cs:line 136
     at ServiceStack.Host.Handlers.ServiceStackHandlerBase.HandleResponse(IRequest httpReq, IResponse httpRes, Object response) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/Host/Handlers/ServiceStackHandlerBase.cs:line 107
     at ServiceStack.Host.Handlers.GenericHandler.ProcessRequestAsync(IRequest httpReq, IResponse httpRes, String operationName) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/Host/Handlers/GenericHandler.cs:line 66
info: ServiceStack.Host.Handlers.HttpAsyncTaskHandler[0]
  Failed to write error to response: {0}
  System.NullReferenceException: Object reference not set to an instance of an object.
     at ServiceStack.HttpRequestExtensions.CanReadRequestBody(IRequest req) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/HttpRequestExtensions.cs:line 1145
     at ServiceStack.Host.InMemoryRollingRequestLogger.CreateEntry(IRequest request, Object requestDto, Object response, TimeSpan requestDuration, Type requestType)
     at ServiceStack.CsvRequestLogger.Log(IRequest request, Object requestDto, Object response, TimeSpan requestDuration) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/CsvRequestLogger.cs:line 150
     at ServiceStack.HttpExtensions.EndHttpHandlerRequest(IResponse httpRes, Boolean skipHeaders, Boolean skipClose, Action`1 afterHeaders) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/HttpExtensions.cs:line 104
     at ServiceStack.HttpResponseExtensionsInternal.WriteErrorToResponse(IResponse httpRes, IRequest httpReq, String contentType, String operationName, String errorMessage, Exception ex, Int32 statusCode) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/HttpResponseExtensionsInternal.cs:line 541
     at ServiceStack.HostContext.RaiseAndHandleException(IRequest httpReq, IResponse httpRes, String operationName, Exception ex) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/HostContext.cs:line 266
     at ServiceStack.Host.Handlers.HttpAsyncTaskHandler.HandleException(IRequest httpReq, IResponse httpRes, String operationName, Exception ex) in /home/runner/work/ServiceStack/ServiceStack/ServiceStack/src/ServiceStack/Host/Handlers/HttpAsyncTaskHandler.cs:line 180

Is there a better way to return HTTP Codes?

Greatings
Andre

The NRE should be fixed in this commit, this change is available from v6.2.1+ that’s now available on MyGet.

1 Like