Skip to content

Commit 33991b8

Browse files
committed
async routing
1 parent 3efb148 commit 33991b8

File tree

3 files changed

+66
-66
lines changed

3 files changed

+66
-66
lines changed

JsonApiDotNetCore/Middleware/JsonApiMiddleware.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public async Task Invoke(HttpContext context)
3030
_logger.LogInformation("Passing request to JsonApiService: " + context.Request.Path);
3131

3232
if(IsJsonApiRequest(context)) {
33-
var routeWasHandled = _router.HandleJsonApiRoute(context, _serviceProvider);
33+
var routeWasHandled = await _router.HandleJsonApiRouteAsync(context, _serviceProvider);
3434
if(!routeWasHandled)
3535
RespondNotFound(context);
3636
}

JsonApiDotNetCore/Routing/IRouter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
using System;
2+
using System.Threading.Tasks;
23
using Microsoft.AspNetCore.Http;
34

45
namespace JsonApiDotNetCore.Routing
56
{
67
public interface IRouter
78
{
8-
bool HandleJsonApiRoute(HttpContext context, IServiceProvider serviceProvider);
9+
Task<bool> HandleJsonApiRouteAsync(HttpContext context, IServiceProvider serviceProvider);
910
}
1011
}

JsonApiDotNetCore/Routing/Router.cs

Lines changed: 63 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,89 @@
11
using System;
22
using System.Text;
3+
using System.Threading.Tasks;
34
using JsonApiDotNetCore.Abstractions;
45
using JsonApiDotNetCore.Configuration;
56
using JsonApiDotNetCore.Controllers;
67
using JsonApiDotNetCore.Services;
78
using Microsoft.AspNetCore.Http;
89
using Microsoft.AspNetCore.Mvc;
9-
using Newtonsoft.Json;
1010

1111
namespace JsonApiDotNetCore.Routing
1212
{
13-
public class Router : IRouter
14-
{
15-
private readonly JsonApiModelConfiguration _jsonApiModelConfiguration;
16-
private IServiceProvider _serviceProvider;
17-
private JsonApiContext _jsonApiContext;
18-
private IRouteBuilder _routeBuilder;
19-
private IControllerBuilder _controllerBuilder;
20-
21-
public Router(JsonApiModelConfiguration configuration, IRouteBuilder routeBuilder, IControllerBuilder controllerBuilder)
13+
public class Router : IRouter
2214
{
23-
_jsonApiModelConfiguration = configuration;
24-
_routeBuilder = routeBuilder;
25-
_controllerBuilder = controllerBuilder;
26-
}
15+
private readonly JsonApiModelConfiguration _jsonApiModelConfiguration;
16+
private IServiceProvider _serviceProvider;
17+
private JsonApiContext _jsonApiContext;
18+
private IRouteBuilder _routeBuilder;
19+
private IControllerBuilder _controllerBuilder;
2720

28-
public bool HandleJsonApiRoute(HttpContext context, IServiceProvider serviceProvider)
29-
{
30-
_serviceProvider = serviceProvider;
21+
public Router(JsonApiModelConfiguration configuration, IRouteBuilder routeBuilder, IControllerBuilder controllerBuilder)
22+
{
23+
_jsonApiModelConfiguration = configuration;
24+
_routeBuilder = routeBuilder;
25+
_controllerBuilder = controllerBuilder;
26+
}
3127

32-
var route = _routeBuilder.BuildFromRequest(context.Request);
33-
if (route == null) return false;
28+
public async Task<bool> HandleJsonApiRouteAsync(HttpContext context, IServiceProvider serviceProvider)
29+
{
30+
_serviceProvider = serviceProvider;
3431

35-
InitializeContext(context, route);
36-
CallController();
32+
var route = _routeBuilder.BuildFromRequest(context.Request);
33+
if (route == null) return false;
3734

38-
return true;
39-
}
35+
InitializeContext(context, route);
36+
await CallController();
4037

41-
private void InitializeContext(HttpContext context, Route route)
42-
{
43-
var dbContext = _serviceProvider.GetService(_jsonApiModelConfiguration.ContextType);
44-
_jsonApiContext = new JsonApiContext(context, route, dbContext, _jsonApiModelConfiguration);
45-
}
38+
return true;
39+
}
4640

47-
private void CallController()
48-
{
49-
var controller = _controllerBuilder.BuildController(_jsonApiContext);
41+
private void InitializeContext(HttpContext context, Route route)
42+
{
43+
var dbContext = _serviceProvider.GetService(_jsonApiModelConfiguration.ContextType);
44+
_jsonApiContext = new JsonApiContext(context, route, dbContext, _jsonApiModelConfiguration);
45+
}
5046

51-
var result = ActivateControllerMethod(controller);
47+
private async Task CallController()
48+
{
49+
var controller = _controllerBuilder.BuildController(_jsonApiContext);
5250

53-
result.Value = SerializeResult(result.Value);
51+
var result = ActivateControllerMethod(controller);
5452

55-
SendResponse(result);
56-
}
53+
result.Value = SerializeResult(result.Value);
5754

58-
private ObjectResult ActivateControllerMethod(IJsonApiController controller)
59-
{
60-
var route = _jsonApiContext.Route;
61-
switch (route.RequestMethod)
62-
{
63-
case "GET":
64-
return string.IsNullOrEmpty(route.ResourceId) ? controller.Get() : controller.Get(route.ResourceId);
65-
case "POST":
66-
return controller.Post(new JsonApiDeserializer(_jsonApiContext).GetEntityFromRequest());
67-
case "PATCH":
68-
return controller.Patch(route.ResourceId, new JsonApiDeserializer(_jsonApiContext).GetEntityPatch());
69-
case "DELETE":
70-
return controller.Delete(route.ResourceId);
71-
default:
72-
throw new ArgumentException("Request method not supported", nameof(route));
73-
}
74-
}
55+
await SendResponse(result);
56+
}
7557

76-
private object SerializeResult(object result)
77-
{
78-
return result == null ? null : new JsonApiSerializer(_jsonApiContext).ToJsonApiDocument(result);
79-
}
58+
private ObjectResult ActivateControllerMethod(IJsonApiController controller)
59+
{
60+
var route = _jsonApiContext.Route;
61+
switch (route.RequestMethod)
62+
{
63+
case "GET":
64+
return string.IsNullOrEmpty(route.ResourceId) ? controller.Get() : controller.Get(route.ResourceId);
65+
case "POST":
66+
return controller.Post(new JsonApiDeserializer(_jsonApiContext).GetEntityFromRequest());
67+
case "PATCH":
68+
return controller.Patch(route.ResourceId, new JsonApiDeserializer(_jsonApiContext).GetEntityPatch());
69+
case "DELETE":
70+
return controller.Delete(route.ResourceId);
71+
default:
72+
throw new ArgumentException("Request method not supported", nameof(route));
73+
}
74+
}
8075

81-
private void SendResponse(ObjectResult result)
82-
{
83-
var context = _jsonApiContext.HttpContext;
84-
context.Response.StatusCode = result.StatusCode ?? 500;
85-
context.Response.ContentType = "application/vnd.api+json";
86-
context.Response.WriteAsync(result.Value == null ? "" : result.Value.ToString(), Encoding.UTF8);
87-
context.Response.Body.Flush();
76+
private object SerializeResult(object result)
77+
{
78+
return result == null ? null : new JsonApiSerializer(_jsonApiContext).ToJsonApiDocument(result);
79+
}
80+
81+
private async Task SendResponse(ObjectResult result)
82+
{
83+
var context = _jsonApiContext.HttpContext;
84+
context.Response.StatusCode = result.StatusCode ?? 500;
85+
context.Response.ContentType = "application/vnd.api+json";
86+
await context.Response.WriteAsync(result.Value == null ? "" : result.Value.ToString(), Encoding.UTF8);
87+
}
8888
}
89-
}
9089
}

0 commit comments

Comments
 (0)