Skip to content

Commit 6cd41b5

Browse files
committed
fix(RequestScopedServiceProvider): do not access disposed scope
1 parent 675f866 commit 6cd41b5

File tree

4 files changed

+12
-6
lines changed

4 files changed

+12
-6
lines changed

src/JsonApiDotNetCore/Extensions/IServiceCollectionExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ public static void AddJsonApiInternals(
122122

123123
services.AddScoped(typeof(IResourceService<>), typeof(EntityResourceService<>));
124124
services.AddScoped(typeof(IResourceService<,>), typeof(EntityResourceService<,>));
125+
125126
services.AddSingleton<JsonApiOptions>(jsonApiOptions);
126127
services.AddSingleton<IContextGraph>(jsonApiOptions.ContextGraph);
127128
services.AddScoped<IJsonApiContext, JsonApiContext>();

src/JsonApiDotNetCore/Services/Operations/OperationProcessorResolver.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using JsonApiDotNetCore.Internal;
12
using JsonApiDotNetCore.Internal.Generics;
23
using JsonApiDotNetCore.Models.Operations;
34
using JsonApiDotNetCore.Services.Operations.Processors;
@@ -90,6 +91,9 @@ public IOpProcessor LocateUpdateService(Operation operation)
9091
var resource = operation.GetResourceTypeName();
9192

9293
var contextEntity = _context.ContextGraph.GetContextEntity(resource);
94+
if (contextEntity == null)
95+
throw new JsonApiException(400, $"This API does not expose a resource of type '{resource}'.");
96+
9397
var processor = _processorFactory.GetProcessor<IOpProcessor>(
9498
typeof(IUpdateOpProcessor<,>), contextEntity.EntityType, contextEntity.IdentityType
9599
);

src/JsonApiDotNetCore/Services/Operations/Processors/UpdateOpProcessor.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,17 @@ public async Task<Operation> ProcessAsync(Operation operation)
5353
throw new JsonApiException(400, "The data.id parameter is required for replace operations");
5454

5555
var model = (T)_deSerializer.DocumentToObject(operation.DataObject);
56+
5657
var result = await _service.UpdateAsync(model.Id, model);
58+
if (result == null)
59+
throw new JsonApiException(404, $"Could not find an instance of '{operation.DataObject.Type}' with id {operation.DataObject.Id}");
5760

5861
var operationResult = new Operation
5962
{
6063
Op = OperationCode.update
6164
};
6265

63-
operationResult.Data = _documentBuilder.GetData(
64-
_contextGraph.GetContextEntity(operation.GetResourceTypeName()),
65-
result);
66+
operationResult.Data = _documentBuilder.GetData(_contextGraph.GetContextEntity(operation.GetResourceTypeName()), result);
6667

6768
return operationResult;
6869
}

src/JsonApiDotNetCore/Services/ScopedServiceProvider.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ public interface IScopedServiceProvider : IServiceProvider { }
1515
/// </summary>
1616
public class RequestScopedServiceProvider : IScopedServiceProvider
1717
{
18-
private readonly IServiceProvider _serviceProvider;
18+
private readonly IHttpContextAccessor _httpContextAccessor;
1919

2020
public RequestScopedServiceProvider(IHttpContextAccessor httpContextAccessor)
2121
{
22-
_serviceProvider = httpContextAccessor.HttpContext.RequestServices;
22+
_httpContextAccessor = httpContextAccessor;
2323
}
2424

2525
/// <inheritdoc />
26-
public object GetService(Type serviceType) => _serviceProvider.GetService(serviceType);
26+
public object GetService(Type serviceType) => _httpContextAccessor.HttpContext.RequestServices.GetService(serviceType);
2727
}
2828
}

0 commit comments

Comments
 (0)