diff --git a/src/JsonApiDotNetCore/Internal/DasherizedRoutingConvention.cs b/src/JsonApiDotNetCore/Internal/DasherizedRoutingConvention.cs index 7732a91250..97be6aee14 100644 --- a/src/JsonApiDotNetCore/Internal/DasherizedRoutingConvention.cs +++ b/src/JsonApiDotNetCore/Internal/DasherizedRoutingConvention.cs @@ -1,5 +1,6 @@ // REF: https://github.com/aspnet/Entropy/blob/dev/samples/Mvc.CustomRoutingConvention/NameSpaceRoutingConvention.cs // REF: https://github.com/aspnet/Mvc/issues/5691 +using JsonApiDotNetCore.Controllers; using JsonApiDotNetCore.Extensions; using Microsoft.AspNetCore.Mvc.ApplicationModels; @@ -12,17 +13,28 @@ public DasherizedRoutingConvention(string nspace) { _namespace = nspace; } - + public void Apply(ApplicationModel application) { foreach (var controller in application.Controllers) - { - var template = $"{_namespace}/{controller.ControllerName.Dasherize()}"; - controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel() + { + if (IsJsonApiController(controller)) { - Template = template - }; + var template = $"{_namespace}/{controller.ControllerName.Dasherize()}"; + controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel() + { + Template = template + }; + } } } + + private bool IsJsonApiController(ControllerModel controller) + { + var controllerBaseType = controller.ControllerType.BaseType; + if(!controllerBaseType.IsConstructedGenericType) return false; + var genericTypeDefinition = controllerBaseType.GetGenericTypeDefinition(); + return (genericTypeDefinition == typeof(JsonApiController<,>) || genericTypeDefinition == typeof(JsonApiController<>)); + } } } diff --git a/src/JsonApiDotNetCore/JsonApiDotNetCore.csproj b/src/JsonApiDotNetCore/JsonApiDotNetCore.csproj index 45684b0223..b2d2bd4a6c 100755 --- a/src/JsonApiDotNetCore/JsonApiDotNetCore.csproj +++ b/src/JsonApiDotNetCore/JsonApiDotNetCore.csproj @@ -1,6 +1,6 @@  - 1.3.0 + 1.3.1 netcoreapp1.0 JsonApiDotNetCore JsonApiDotNetCore diff --git a/src/JsonApiDotNetCoreExample/Controllers/TestValuesController.cs b/src/JsonApiDotNetCoreExample/Controllers/TestValuesController.cs new file mode 100644 index 0000000000..3443d34b74 --- /dev/null +++ b/src/JsonApiDotNetCoreExample/Controllers/TestValuesController.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Mvc; + +namespace JsonApiDotNetCoreExample.Controllers +{ + [Route("[controller]")] + public class TestValuesController : Controller + { + [HttpGet] + public IActionResult Get() + { + var result = new string[] { "value" }; + return Ok(result); + } + } +} diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/Extensibility/CustomControllerTests.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/Extensibility/CustomControllerTests.cs new file mode 100644 index 0000000000..fe84817540 --- /dev/null +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/Extensibility/CustomControllerTests.cs @@ -0,0 +1,34 @@ +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.TestHost; +using Xunit; +using JsonApiDotNetCoreExample; + +namespace JsonApiDotNetCoreExampleTests.Acceptance.Extensibility +{ + [Collection("WebHostCollection")] + public class CustomControllerTests + { + [Fact] + public async Task NonJsonApiControllers_DoNotUse_Dasherized_Routes() + { + // arrange + var builder = new WebHostBuilder() + .UseStartup(); + var httpMethod = new HttpMethod("GET"); + var route = $"testValues"; + + var server = new TestServer(builder); + var client = server.CreateClient(); + var request = new HttpRequestMessage(httpMethod, route); + + // act + var response = await client.SendAsync(request); + + // assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + } +}