diff --git a/.gitignore b/.gitignore
index 4c9ab09..253f059 100644
--- a/.gitignore
+++ b/.gitignore
@@ -200,3 +200,5 @@ GeneratedArtifacts/
_Pvt_Extensions/
ModelManifest.xml
+
+.idea/.idea.Digipolis.Web/.idea/
diff --git a/samples/Digipolis.Web.SampleApi/Configuration/Version2.cs b/samples/Digipolis.Web.SampleApi/Configuration/Version2.cs
index 146644b..19b1cb2 100644
--- a/samples/Digipolis.Web.SampleApi/Configuration/Version2.cs
+++ b/samples/Digipolis.Web.SampleApi/Configuration/Version2.cs
@@ -1,24 +1,28 @@
-using Swashbuckle.AspNetCore.Swagger;
+using System;
+using Microsoft.OpenApi.Models;
namespace Digipolis.Web.SampleApi.Configuration
{
///
/// Contains all information for V2 of the API
///
- public class Version2 : Info
+ public class Version2 : OpenApiInfo
{
+ ///
+ /// Constructs OpenApiInfo object for version 2 of the API
+ ///
public Version2()
{
- this.Version = Versions.V2;
- this.Title = "API V2";
- this.Description = "Description for V2 of the API";
- this.Contact = new Contact { Email = "info@digipolis.be", Name = "Digipolis", Url = "https://www.digipolis.be" };
- this.TermsOfService = "https://www.digipolis.be/tos";
- this.License = new License
+ Version = Versions.V2;
+ Title = "API V2";
+ Description = "Description for V2 of the API";
+ Contact = new OpenApiContact {Email = "info@digipolis.be", Name = "Digipolis", Url = new Uri("https://www.digipolis.be")};
+ TermsOfService = new Uri("https://www.digipolis.be/tos");
+ License = new OpenApiLicense
{
Name = "My License",
- Url = "https://www.digipolis.be/licensing"
+ Url = new Uri("https://www.digipolis.be/licensing")
};
}
}
-}
+}
\ No newline at end of file
diff --git a/samples/Digipolis.Web.SampleApi/Controllers/ValuesController.cs b/samples/Digipolis.Web.SampleApi/Controllers/ValuesController.cs
index 10a514f..70a1545 100644
--- a/samples/Digipolis.Web.SampleApi/Controllers/ValuesController.cs
+++ b/samples/Digipolis.Web.SampleApi/Controllers/ValuesController.cs
@@ -33,43 +33,38 @@ public ValuesController(IValueLogic valueLogic, ILogger logger
///
/// This endpoint demostrates the use of the old and it's resulting json.
///
- /// Query options from uri
/// An array of value objects
- [HttpGet()]
+ [HttpGet]
[ProducesResponseType(typeof(PagedResult), 200)]
[AllowAnonymous]
- [Versions(Versions.V1, Versions.V2)]
[Produces("application/hal+json")]
+ [Versions(Versions.V1, Versions.V2)]
public IActionResult Get([FromQuery]CriteriaDto criteria)
{
- int total;
- var values = _valueLogic.GetAll(criteria, out total);
- //var result = queryOptions.ToPagedResult(values, total, "kevin", new { test = 0 });
- var result = criteria.ToPagedResult(values, total, "Get", "Values", new { test = 0 });
+ var values = _valueLogic.GetAll(criteria, out var total);
+ var result = criteria.ToPagedResult(values, total, ControllerContext.ActionDescriptor.ActionName, ControllerContext.ActionDescriptor.ControllerName);
return Ok(result);
}
-
+
///
/// Get all values
///
///
/// This endpoint demostrates the use of the new and it's resulting json.
///
- /// Query options from uri
+ /// Query options from uri
/// An array of value objects
[HttpGet("new")]
- [ProducesResponseType(typeof(PagedResult), 200)]
[AllowAnonymous]
[Versions(Versions.V1, Versions.V2)]
[Produces("application/hal+json")]
public IActionResult GetNew([FromQuery]CriteriaDto criteria)
{
- int total;
- var values = _valueLogic.GetAll(criteria, out total);
- //var result = queryOptions.ToPagedResult(values, total, "kevin", new { test = 0 });
+ var values = _valueLogic.GetAll(criteria, out var total);
var result = criteria.ToPagedResult(values, total);
return Ok(result);
}
+
///
/// Get a value by id
///
@@ -79,13 +74,14 @@ public IActionResult GetNew([FromQuery]CriteriaDto criteria)
[ProducesResponseType(typeof(ValueDto), 200)]
[ProducesResponseType(typeof(ValueDto), 401)]
[AllowAnonymous]
+ [Versions(Versions.V1, Versions.V2)]
[Produces("application/json", "text/csv")]
public IActionResult Get(int id)
{
var value = _valueLogic.GetById(id);
return Ok(value);
}
-
+
///
/// Add a new value
///
@@ -101,7 +97,7 @@ public IActionResult Post([FromBody, Required] ValueDto value)
value = _valueLogic.Add(value);
return CreatedAtAction("Get", new { id = value.Id }, value);
}
-
+
///
/// Update an existing value object
///
@@ -117,7 +113,7 @@ public IActionResult Put(int id, [FromBody, Required] ValueDto value)
value = _valueLogic.Update(id, value);
return Ok(value);
}
-
+
///
/// Delete a value by it's Id
///
@@ -130,9 +126,9 @@ public IActionResult Delete(int id)
_valueLogic.Delete(id);
return NoContent();
}
-
+
///
- /// Thorws an exception
+ /// Throws an exception
///
///
[HttpGet("exception")]
diff --git a/samples/Digipolis.Web.SampleApi/Digipolis.Web.SampleApi.csproj b/samples/Digipolis.Web.SampleApi/Digipolis.Web.SampleApi.csproj
index 1f6690c..2dfee5c 100644
--- a/samples/Digipolis.Web.SampleApi/Digipolis.Web.SampleApi.csproj
+++ b/samples/Digipolis.Web.SampleApi/Digipolis.Web.SampleApi.csproj
@@ -1,40 +1,49 @@
-
- netcoreapp2.1
- true
- Digipolis.Web.SampleApi
- Exe
- Digipolis.Web.SampleApi
- 2.1.6
-
-
-
-
- PreserveNewest
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ netcoreapp3.1
+ true
+ Digipolis.Web.SampleApi
+ Exe
+ Digipolis.Web.SampleApi
+
+
+
+
+ PreserveNewest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ bin\$(Configuration)\$(TargetFramework)\$(MSBuildThisFileName).xml
+
+
+
+
+
+
diff --git a/samples/Digipolis.Web.SampleApi/Models/ChildDto.cs b/samples/Digipolis.Web.SampleApi/Models/ChildDto.cs
index 6599b7f..67203bc 100644
--- a/samples/Digipolis.Web.SampleApi/Models/ChildDto.cs
+++ b/samples/Digipolis.Web.SampleApi/Models/ChildDto.cs
@@ -2,6 +2,9 @@
{
public class ChildDto
{
+ ///
+ /// The Id of the child
+ ///
public int Id { get; set; }
}
-}
+}
\ No newline at end of file
diff --git a/samples/Digipolis.Web.SampleApi/Models/CriteriaDto.cs b/samples/Digipolis.Web.SampleApi/Models/CriteriaDto.cs
index 8737bc0..4590c17 100644
--- a/samples/Digipolis.Web.SampleApi/Models/CriteriaDto.cs
+++ b/samples/Digipolis.Web.SampleApi/Models/CriteriaDto.cs
@@ -11,17 +11,34 @@ namespace Digipolis.Web.SampleApi.Models
{
public class CriteriaDto : PageSortOptions
{
+ ///
+ /// Test bool
+ ///
public bool? TestBool { get; set; }
-
+
+ ///
+ /// Test String array
+ ///
public string[] StringArray { get; set; }
+ ///
+ /// Test String List
+ ///
public List StringList { get; set; }
+ ///
+ /// Test Int Array
+ ///
public int[] IntArray { get; set; }
+ ///
+ /// Test Int List
+ ///
public List IntList { get; set; }
+ ///
+ /// Test Complex array
+ ///
public ChildDto[] ComplexArray { get; set; }
-
-}
-}
+ }
+}
\ No newline at end of file
diff --git a/samples/Digipolis.Web.SampleApi/Properties/launchSettings.json b/samples/Digipolis.Web.SampleApi/Properties/launchSettings.json
index 14776a4..5539708 100644
--- a/samples/Digipolis.Web.SampleApi/Properties/launchSettings.json
+++ b/samples/Digipolis.Web.SampleApi/Properties/launchSettings.json
@@ -8,14 +8,6 @@
}
},
"profiles": {
- "IIS Express": {
- "commandName": "IISExpress",
- "launchBrowser": true,
- "launchUrl": "api/values",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- },
"Digipolis.Web.SampleApi": {
"commandName": "Project",
"launchBrowser": true,
diff --git a/samples/Digipolis.Web.SampleApi/Startup.cs b/samples/Digipolis.Web.SampleApi/Startup.cs
index 3ed8cb3..5804e88 100644
--- a/samples/Digipolis.Web.SampleApi/Startup.cs
+++ b/samples/Digipolis.Web.SampleApi/Startup.cs
@@ -1,21 +1,27 @@
-using AutoMapper;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using AutoMapper;
+using Digipolis.Web.Api.JsonConverters;
+using Digipolis.Web.Api.Tools;
using Digipolis.Web.SampleApi.Configuration;
using Digipolis.Web.SampleApi.Data;
using Digipolis.Web.SampleApi.Logic;
using Digipolis.Web.Startup;
using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
-using Swashbuckle.AspNetCore.Swagger;
-using License = Swashbuckle.AspNetCore.Swagger.License;
+using Microsoft.OpenApi.Models;
namespace Digipolis.Web.SampleApi
{
public class Startup
{
- public Startup(IHostingEnvironment env)
+ public Startup(IHostEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
@@ -32,6 +38,7 @@ public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc()
+ .AddNewtonsoftJson(options => options.SerializerSettings.Initialize()) // set default Digipolis json serializer settings
.AddApiExtensions(Configuration.GetSection("ApiExtensions"), x =>
{
//Override settings made by the appsettings.json
@@ -46,21 +53,21 @@ public void ConfigureServices(IServiceCollection services)
// Add Swagger extensions
services.AddSwaggerGen(o =>
{
- o.SwaggerDoc(Versions.V1, new Info
+ Array.ForEach(AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies().GetXmlDocPaths(), doc => o.IncludeXmlComments(doc));
+
+ o.SwaggerDoc(Versions.V1, new OpenApiInfo
{
//Add Inline version
Version = Versions.V1,
Title = "API V1",
Description = "Description for V1 of the API",
- Contact = new Contact { Email = "info@digipolis.be", Name = "Digipolis", Url = "https://www.digipolis.be" },
- TermsOfService = "https://www.digipolis.be/tos",
- License = new License
+ Contact = new OpenApiContact {Email = "info@digipolis.be", Name = "Digipolis", Url = new Uri("https://www.digipolis.be")},
+ License = new OpenApiLicense
{
Name = "My License",
- Url = "https://www.digipolis.be/licensing"
- },
+ Url = new Uri("https://www.digipolis.be/licensing")
+ }
});
-
o.SwaggerDoc(Versions.V2, new Version2());
});
@@ -68,29 +75,27 @@ public void ConfigureServices(IServiceCollection services)
services.AddScoped();
services.AddScoped();
+ services.AddLogging(loggingBuilder =>
+ {
+ loggingBuilder.AddConsole(x => Configuration.GetSection("logging"));
+ loggingBuilder.AddDebug();
+ });
+
//Add AutoMapper
- services.AddAutoMapper();
-
+ services.AddAutoMapper(typeof(Startup));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
- public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
+ public void Configure(IApplicationBuilder app)
{
- loggerFactory.AddConsole(Configuration.GetSection("Logging"));
- loggerFactory.AddDebug();
-
// Enable Api Extensions
app.UseApiExtensions();
-
- app.UseMvc();
+ app.UseRouting();
+ app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
// Enable middleware to serve generated Swagger as a JSON endpoint
- app.UseSwagger(c =>
- {
- c.RouteTemplate = "docs/{documentName}/swagger.json";
- c.PreSerializeFilters.Add((swagger, httpReq) => swagger.Host = httpReq.Host.Value);
- });
+ app.UseSwagger(c => { c.RouteTemplate = "docs/{documentName}/swagger.json"; });
// Enable middleware to serve swagger-ui assets (HTML, JS, CSS etc.)
app.UseSwaggerUI(options =>
@@ -100,7 +105,6 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
});
app.UseSwaggerUiRedirect();
-
}
}
-}
+}
\ No newline at end of file
diff --git a/samples/Digipolis.Web.SampleApi/Swagger/SwaggerUiController.cs b/samples/Digipolis.Web.SampleApi/Swagger/SwaggerUiController.cs
deleted file mode 100644
index 003f71e..0000000
--- a/samples/Digipolis.Web.SampleApi/Swagger/SwaggerUiController.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using System.Reflection;
-using Digipolis.Web.SampleApi.Configuration;
-using Microsoft.AspNetCore.Mvc;
-
-namespace Digipolis.Web.SampleApi.Swagger
-{
- [ApiExplorerSettings(IgnoreApi=true)]
- public class SwaggerUiController : Controller
- {
- [HttpGet("swagger/ui/index.html")]
- public IActionResult Index()
- {
- return View("~/Swagger/index.cshtml", GetDiscoveryUrls());
- }
-
- private IDictionary GetDiscoveryUrls()
- {
- var versions = typeof(Versions)
- .GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
- .Where(fi => fi.IsLiteral && !fi.IsInitOnly && fi.FieldType == typeof(string))
- .ToDictionary(x=> x.GetRawConstantValue().ToString(), x => string.Format("/swagger/{0}/swagger.json", x.GetRawConstantValue()));
-
- return versions;
- }
- }
-}
diff --git a/samples/Digipolis.Web.SampleApi/Swagger/index.cshtml b/samples/Digipolis.Web.SampleApi/Swagger/index.cshtml
deleted file mode 100644
index 7e65f66..0000000
--- a/samples/Digipolis.Web.SampleApi/Swagger/index.cshtml
+++ /dev/null
@@ -1,132 +0,0 @@
-@model IDictionary
-
-
-
-
-
- Swagger UI
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Digipolis.Web/Api/ApiExtensionOptions.cs b/src/Digipolis.Web/Api/ApiExtensionOptions.cs
index 47e342b..06c42e1 100644
--- a/src/Digipolis.Web/Api/ApiExtensionOptions.cs
+++ b/src/Digipolis.Web/Api/ApiExtensionOptions.cs
@@ -25,15 +25,5 @@ public class ApiExtensionOptions
/// Default = false.
///
public bool LogExceptionObject { get; set; }
-
- /////
- ///// BaseUrl used for generation of HAL-urls
- /////
- //public string BaseUrl { get; set; }
-
- ///
- /// The route wwhere the version can be requested (default = '/status/version').
- ///
- //public string Route { get; set; } = "/status/version";
}
}
diff --git a/src/Digipolis.Web/Api/Filters/ValidateModelStateAttribute.cs b/src/Digipolis.Web/Api/Filters/ValidateModelStateAttribute.cs
index 5df8e9c..ea24dd6 100644
--- a/src/Digipolis.Web/Api/Filters/ValidateModelStateAttribute.cs
+++ b/src/Digipolis.Web/Api/Filters/ValidateModelStateAttribute.cs
@@ -9,18 +9,21 @@ public class ValidateModelStateAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
- if (context.ModelState.IsValid) return;
- else throw new ValidationException(messages: context.ModelState.ToDictionary(x => x.Key, x => x.Value.Errors.Select(e => e.ErrorMessage)));
+ if (context.ModelState.IsValid)
+ return;
+
+ throw new ValidationException(messages: context.ModelState.ToDictionary(x => x.Key, x => x.Value.Errors.Select(e => e.ErrorMessage)));
}
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
if (context.ModelState.IsValid)
{
- if (next != null) await next();
+ if (next != null)
+ await next();
}
else
throw new ValidationException(messages: context.ModelState.ToDictionary(x => x.Key, x => x.Value.Errors.Select(e => e.ErrorMessage)));
}
}
-}
+}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Api/JsonConverters/JsonSerializerSettingsComposer.cs b/src/Digipolis.Web/Api/JsonConverters/JsonSerializerSettingsComposer.cs
index 42b667e..0735fb8 100644
--- a/src/Digipolis.Web/Api/JsonConverters/JsonSerializerSettingsComposer.cs
+++ b/src/Digipolis.Web/Api/JsonConverters/JsonSerializerSettingsComposer.cs
@@ -1,17 +1,27 @@
-using Newtonsoft.Json;
+using System;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Converters;
namespace Digipolis.Web.Api.JsonConverters
{
- internal static class JsonSerializerSettingsComposer
+ public static class JsonSerializerSettingsComposer
{
- internal static void Initialize(this JsonSerializerSettings settings)
+ ///
+ /// Sets the default Digipolis JSON serializer settings for Newtonsoft.JSON
+ ///
+ ///
+ ///
+ public static void Initialize(this JsonSerializerSettings settings, Action settingsAction = null)
{
settings.ContractResolver = new BaseContractResolver();
settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
settings.NullValueHandling = NullValueHandling.Ignore;
settings.Converters.Add(new TimeSpanConverter());
settings.Converters.Add(new GuidConverter());
+ settings.Converters.Add(new StringEnumConverter());
settings.Formatting = Formatting.None;
+
+ settingsAction?.Invoke(settings);
}
}
-}
+}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Api/Tools/AssemblyExtensions.cs b/src/Digipolis.Web/Api/Tools/AssemblyExtensions.cs
new file mode 100644
index 0000000..0735cf5
--- /dev/null
+++ b/src/Digipolis.Web/Api/Tools/AssemblyExtensions.cs
@@ -0,0 +1,28 @@
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+
+namespace Digipolis.Web.Api.Tools
+{
+ public static class AssemblyExtensions
+ {
+ public static string[] GetXmlDocPaths(this IEnumerable assemblies)
+ {
+ var assemblyLocations = new List();
+ foreach (var assembly in assemblies)
+ assemblyLocations.AddRange(GetAssemblyLocations(assembly));
+
+ return assemblyLocations.ToArray();
+ }
+
+ private static IEnumerable GetAssemblyLocations(this Assembly assembly)
+ {
+ var assemblyNames = assembly.GetReferencedAssemblies().Union(new[] {assembly.GetName()});
+
+ var xmlPaths = assemblyNames.Select(a => Path.Combine(Path.GetDirectoryName(assembly.Location), $"{a.Name}.xml")).Where(File.Exists);
+
+ return xmlPaths;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Api/Tools/DictionaryExtensions.cs b/src/Digipolis.Web/Api/Tools/DictionaryExtensions.cs
new file mode 100644
index 0000000..ce2858a
--- /dev/null
+++ b/src/Digipolis.Web/Api/Tools/DictionaryExtensions.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+
+namespace Digipolis.Web.Api.Tools
+{
+ public static class DictionaryExtensions
+ {
+ public static void AddRangeIfNotExist(this Dictionary source, Dictionary collection)
+ {
+ if (collection == null)
+ {
+ throw new ArgumentNullException(nameof(collection));
+ }
+
+ foreach (var item in collection)
+ {
+ if (!source.ContainsKey(item.Key))
+ {
+ source.Add(item.Key, item.Value);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Api/Tools/LinkProvider.cs b/src/Digipolis.Web/Api/Tools/LinkProvider.cs
index 02ffd46..c5b581a 100644
--- a/src/Digipolis.Web/Api/Tools/LinkProvider.cs
+++ b/src/Digipolis.Web/Api/Tools/LinkProvider.cs
@@ -1,47 +1,34 @@
using System;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Routing;
-using Microsoft.Extensions.Options;
-using Microsoft.AspNetCore.Http;
-using System.Net.Http.Headers;
using Microsoft.AspNetCore.Http.Headers;
namespace Digipolis.Web.Api.Tools
{
public class LinkProvider : ILinkProvider
{
- private IActionContextAccessor _httpContextAccessor;
- //private Uri _baseUri;
- private IUrlHelper _urlHelper;
+ private readonly IActionContextAccessor _httpContextAccessor;
+ private readonly IUrlHelper _urlHelper;
- public LinkProvider(IActionContextAccessor httpContextAccessor, IUrlHelper urlHelper, IOptions options)
+ public LinkProvider(IActionContextAccessor httpContextAccessor, IUrlHelper urlHelper)
{
- if (httpContextAccessor == null) throw new ArgumentNullException(nameof(httpContextAccessor));
- _httpContextAccessor = httpContextAccessor;
-
- if (urlHelper == null) throw new ArgumentNullException(nameof(urlHelper));
- _urlHelper = urlHelper;
+ _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
+ _urlHelper = urlHelper ?? throw new ArgumentNullException(nameof(urlHelper));
}
public string AbsoluteAction(string actionName, string controllerName, object routeValues = null)
{
- HttpRequest request = _httpContextAccessor.ActionContext.HttpContext.Request;
-
- var relativeUrl = _urlHelper.Action(actionName, controllerName, routeValues);
-
+ var relativeUrl = _urlHelper.Action(actionName, controllerName, routeValues);
return GetFullUrlBuilder(relativeUrl).ToString();
-
}
public string AbsoluteRoute(string routeName, object routeValues = null)
{
var relativeUrl = _urlHelper.RouteUrl(routeName, routeValues);
-
return GetFullUrlBuilder(relativeUrl).ToString();
}
-
+
public UriBuilder GetFullUrlBuilder(string relativeUrl)
{
var result = GetAbsoluteUrlBuilder();
@@ -61,12 +48,12 @@ public UriBuilder GetFullUrlBuilder(string relativeUrl)
public UriBuilder GetAbsoluteUrlBuilder()
{
- HttpRequest request = _httpContextAccessor.ActionContext.HttpContext.Request;
- RequestHeaders headers = new RequestHeaders(request.Headers);
- var host = headers.Host.HasValue ? headers.Host.Host: request.Host.Value;
+ var request = _httpContextAccessor.ActionContext.HttpContext.Request;
+ var headers = new RequestHeaders(request.Headers);
+ var host = headers.Host.HasValue ? headers.Host.Host : request.Host.Value;
var port = headers.Host.Port ?? 80;
- UriBuilder builder = new UriBuilder(request.Scheme, host, port);
+ var builder = new UriBuilder(request.Scheme, host, port);
return builder;
}
}
-}
+}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Digipolis.Web.csproj b/src/Digipolis.Web/Digipolis.Web.csproj
index a5b3c6e..6189e0b 100644
--- a/src/Digipolis.Web/Digipolis.Web.csproj
+++ b/src/Digipolis.Web/Digipolis.Web.csproj
@@ -27,18 +27,18 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Digipolis.Web/Exceptions/ExceptionHandler.cs b/src/Digipolis.Web/Exceptions/ExceptionHandler.cs
index 3058330..9e61ad5 100644
--- a/src/Digipolis.Web/Exceptions/ExceptionHandler.cs
+++ b/src/Digipolis.Web/Exceptions/ExceptionHandler.cs
@@ -1,13 +1,12 @@
-using Digipolis.Errors;
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using Digipolis.Errors;
using Digipolis.Web.Api;
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
-using System;
-using System.Linq;
-using System.Threading.Tasks;
namespace Digipolis.Web.Exceptions
{
@@ -15,23 +14,18 @@ public class ExceptionHandler : IExceptionHandler
{
private readonly IExceptionMapper _mapper;
private readonly ILogger _logger;
- private readonly IOptions _options;
private readonly IOptions _apiExtensionOptions;
- public ExceptionHandler(IExceptionMapper mapper, ILogger logger, IOptions options, IOptions apiExtensionOptions)
+ public ExceptionHandler(IExceptionMapper mapper, ILogger logger, IOptions apiExtensionOptions)
{
- if(mapper == null) throw new ArgumentNullException(nameof(mapper));
- if(logger == null) throw new ArgumentNullException(nameof(logger));
-
- _mapper = mapper;
- _logger = logger;
- _options = options;
+ _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
+ _logger = logger ?? throw new ArgumentNullException(nameof(logger));
_apiExtensionOptions = apiExtensionOptions;
}
public async Task HandleAsync(HttpContext context, Exception ex)
{
- if(_apiExtensionOptions?.Value?.DisableGlobalErrorHandling == true) return;
+ if (_apiExtensionOptions?.Value?.DisableGlobalErrorHandling == true) return;
var error = _mapper?.Resolve(ex);
if (error == null) return;
@@ -39,11 +33,12 @@ public async Task HandleAsync(HttpContext context, Exception ex)
{
context.Response.Clear();
context.Response.ContentType = "application/problem+json";
- if (error.Status != default(int)) context.Response.StatusCode = error.Status;
- var json = JsonConvert.SerializeObject(error, _options?.Value?.SerializerSettings ?? new JsonSerializerSettings());
+ if (error.Status != default) context.Response.StatusCode = error.Status;
+ var json = JsonConvert.SerializeObject(error);
await context.Response.WriteAsync(json);
}
- else if (error.Status != default(int)) context.Response.StatusCode = error.Status;
+ else if (error.Status != default) context.Response.StatusCode = error.Status;
+
LogException(error, ex);
}
@@ -57,11 +52,12 @@ public void Handle(HttpContext context, Exception ex)
{
context.Response.Clear();
context.Response.ContentType = "application/problem+json";
- if (error.Status != default(int)) context.Response.StatusCode = error.Status;
- var json = JsonConvert.SerializeObject(error, _options?.Value?.SerializerSettings ?? new JsonSerializerSettings());
+ if (error.Status != default) context.Response.StatusCode = error.Status;
+ var json = JsonConvert.SerializeObject(error);
context.Response.WriteAsync(json).Wait();
}
- else if (error.Status != default(int)) context.Response.StatusCode = error.Status;
+ else if (error.Status != default) context.Response.StatusCode = error.Status;
+
LogException(error, ex);
}
@@ -78,7 +74,7 @@ private void LogException(Error error, Exception exception)
logMessage.Exception = exception;
}
- var logAsJson = JsonConvert.SerializeObject(logMessage, _options?.Value?.SerializerSettings ?? new JsonSerializerSettings());
+ var logAsJson = JsonConvert.SerializeObject(logMessage);
if (error.Status >= 500 && error.Status <= 599)
_logger?.LogError(logAsJson);
else if (error.Status >= 400 && error.Status <= 499)
@@ -86,4 +82,4 @@ private void LogException(Error error, Exception exception)
else _logger?.LogInformation(logAsJson);
}
}
-}
+}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Exceptions/ExceptionResponseMiddleware.cs b/src/Digipolis.Web/Exceptions/ExceptionResponseMiddleware.cs
index 414c24f..5349aad 100644
--- a/src/Digipolis.Web/Exceptions/ExceptionResponseMiddleware.cs
+++ b/src/Digipolis.Web/Exceptions/ExceptionResponseMiddleware.cs
@@ -1,11 +1,11 @@
-using Digipolis.Errors.Exceptions;
+using System;
+using System.Net;
+using System.Threading.Tasks;
+using Digipolis.Errors.Exceptions;
using Digipolis.Web.Api;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
-using System;
-using System.Net;
-using System.Threading.Tasks;
namespace Digipolis.Web.Exceptions
{
@@ -15,8 +15,7 @@ internal class ExceptionResponseMiddleware
public ExceptionResponseMiddleware(RequestDelegate next)
{
- if (next == null) throw new ArgumentNullException(nameof(next), $"{nameof(next)} cannot be null.");
- this._next = next;
+ _next = next ?? throw new ArgumentNullException(nameof(next), $"{nameof(next)} cannot be null.");
}
public async Task Invoke(HttpContext context)
@@ -26,13 +25,13 @@ public async Task Invoke(HttpContext context)
if (handler == null || options?.Value?.DisableGlobalErrorHandling == true)
{
- await this._next.Invoke(context);
+ await _next.Invoke(context);
return;
}
try
{
- await this._next.Invoke(context);
+ await _next.Invoke(context);
if (context.Response.StatusCode == (int)HttpStatusCode.Unauthorized)
{
await handler.HandleAsync(context, new UnauthorizedAccessException());
diff --git a/src/Digipolis.Web/Modelbinders/CommaDelimitedArrayModelBinder.cs b/src/Digipolis.Web/Modelbinders/CommaDelimitedArrayModelBinder.cs
index dd53ba5..b59f9f7 100644
--- a/src/Digipolis.Web/Modelbinders/CommaDelimitedArrayModelBinder.cs
+++ b/src/Digipolis.Web/Modelbinders/CommaDelimitedArrayModelBinder.cs
@@ -16,11 +16,6 @@ public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext.ModelMetadata.IsEnumerableType)
{
- if (bindingContext == null)
- {
- throw new ArgumentNullException(nameof(bindingContext));
- }
-
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (valueProviderResult == ValueProviderResult.None)
{
@@ -39,7 +34,6 @@ public Task BindModelAsync(ModelBindingContext bindingContext)
bindingContext.Model = result;
bindingContext.Result = ModelBindingResult.Success(result);
-
}
catch (Exception exception)
{
@@ -64,7 +58,7 @@ public Task BindModelAsync(ModelBindingContext bindingContext)
return Task.CompletedTask;
}
- internal object ParseArray(string arrayString, Type collectionType)
+ internal static object ParseArray(string arrayString, Type collectionType)
{
if (collectionType.IsArray && (collectionType.GetElementType() == typeof(string) || collectionType.GetElementType().GetTypeInfo().IsValueType))
{
@@ -72,28 +66,30 @@ internal object ParseArray(string arrayString, Type collectionType)
var converter = TypeDescriptor.GetConverter(elementType);
- var values = arrayString.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
- .Select(x => converter.ConvertFromString(x.Trim()))
- .ToArray();
+ var values = arrayString.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries)
+ .Select(x => converter.ConvertFromString(x.Trim()))
+ .ToArray();
var typedValues = Array.CreateInstance(elementType, values.Length);
values.CopyTo(typedValues, 0);
return typedValues;
}
- else if (collectionType.GetInterfaces()
- .Any(ti => ti.IsConstructedGenericType
- && ti.GetGenericTypeDefinition() == typeof(IEnumerable<>)
- && (ti.GenericTypeArguments[0] == typeof(string) || ti.GenericTypeArguments[0].GetTypeInfo().IsValueType)))
+ else
{
+ if (!collectionType.GetInterfaces()
+ .Any(ti => ti.IsConstructedGenericType
+ && ti.GetGenericTypeDefinition() == typeof(IEnumerable<>)
+ && (ti.GenericTypeArguments[0] == typeof(string) || ti.GenericTypeArguments[0].GetTypeInfo().IsValueType)))
+ throw new NotSupportedException($"Parsing of comma seperated array to {collectionType.FullName} is not supported.");
var elementType = collectionType.GenericTypeArguments[0];
var converter = TypeDescriptor.GetConverter(elementType);
- var values = arrayString.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
- .Select(x => converter.ConvertFromString(x.Trim()))
- .ToArray();
+ var values = arrayString.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries)
+ .Select(x => converter.ConvertFromString(x.Trim()))
+ .ToArray();
- var list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(elementType));
+ var list = (IList) Activator.CreateInstance(typeof(List<>).MakeGenericType(elementType));
foreach (var el in values)
{
@@ -102,10 +98,6 @@ internal object ParseArray(string arrayString, Type collectionType)
return list;
}
- else
- {
- throw new NotSupportedException($"Parsing of comma seperated array to {collectionType.FullName} is not supported.");
- }
}
}
-}
+}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Routing/Routes.cs b/src/Digipolis.Web/Routing/Routes.cs
index 154f4d6..41ad68a 100644
--- a/src/Digipolis.Web/Routing/Routes.cs
+++ b/src/Digipolis.Web/Routing/Routes.cs
@@ -2,7 +2,7 @@
namespace Digipolis.Web.Routing
{
- class Routes
+ internal class Routes
{
internal const string VersionController = "status/version";
}
diff --git a/src/Digipolis.Web/Startup/ApiExtensionSwaggerSettings.cs b/src/Digipolis.Web/Startup/ApiExtensionSwaggerSettings.cs
index 8a7ac4a..e826131 100644
--- a/src/Digipolis.Web/Startup/ApiExtensionSwaggerSettings.cs
+++ b/src/Digipolis.Web/Startup/ApiExtensionSwaggerSettings.cs
@@ -1,5 +1,4 @@
using Digipolis.Web.Swagger;
-using Microsoft.Extensions.DependencyInjection;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace Digipolis.Web.Startup
@@ -8,7 +7,6 @@ public class ApiExtensionSwaggerSettings : SwaggerSettings(this I
public static void UseApiExtensions(this IApplicationBuilder app)
{
var settings = app.ApplicationServices.GetService>();
- //var linkProvider = app.ApplicationServices.GetService();
-
var httpContextAccessor = app.ApplicationServices.GetService();
@@ -38,8 +36,6 @@ public static void UseApiExtensions(this IApplicationBuilder app)
RequireHeaderSymmetry = true,
ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedHost | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto
});
-
- //if (httpContextAccessor != null) LinkProvider.Configure(httpContextAccessor,settings?.Value?.BaseUrl);
}
}
}
diff --git a/src/Digipolis.Web/Startup/MvcBuilderExtensions.cs b/src/Digipolis.Web/Startup/MvcBuilderExtensions.cs
index b223fbf..524c049 100644
--- a/src/Digipolis.Web/Startup/MvcBuilderExtensions.cs
+++ b/src/Digipolis.Web/Startup/MvcBuilderExtensions.cs
@@ -1,20 +1,17 @@
using Digipolis.Web.Api;
-using Digipolis.Web.Api.Conventions;
-using Digipolis.Web.Api.JsonConverters;
using Digipolis.Web.Api.Tools;
-using Digipolis.Web.Modelbinders;
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Formatters;
-using Microsoft.AspNetCore.Mvc.Infrastructure;
-using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
-using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Linq;
-using System.Reflection;
+using Digipolis.Web.Api.Conventions;
+using Digipolis.Web.Modelbinders;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.AspNetCore.Mvc.Routing;
+using Swashbuckle.AspNetCore.SwaggerGen;
namespace Digipolis.Web
{
@@ -29,27 +26,30 @@ public static IMvcBuilder AddApiExtensions(this IMvcBuilder builder, IConfigurat
builder.Services.TryAddSingleton();
builder.Services.TryAddSingleton();
- builder.Services.AddScoped(x =>
+ builder.Services.AddScoped(sp =>
{
- var actionContext = x.GetService().ActionContext;
- return new UrlHelper(actionContext);
+ var ac = sp.GetRequiredService().ActionContext;
+ var f = sp.GetRequiredService();
+ return f.GetUrlHelper(ac);
});
builder.Services.AddScoped();
+
#endregion
#region Register Options
if (config != null && build != null) builder.Services.Configure(x => { });
+
if (config != null)
{
builder.Services.Configure(config);
-
config.Bind(apiOptions);
}
+
if (build != null)
{
- builder.Services.Configure(build);
+ builder.Services.Configure(build);
build(apiOptions);
}
@@ -59,44 +59,30 @@ public static IMvcBuilder AddApiExtensions(this IMvcBuilder builder, IConfigurat
if (!apiOptions.DisableVersioning)
{
- builder.AddMvcOptions(options =>
- {
- options.Conventions.Insert(0, new RouteConvention(new RouteAttribute("{apiVersion}")));
- });
+ builder.AddMvcOptions(options => { options.Conventions.Insert(0, new RouteConvention(new RouteAttribute("{apiVersion}"))); });
builder.Services.ConfigureSwaggerGen(options =>
{
options.DocInclusionPredicate((version, apiDescription) =>
{
- if (!apiDescription.TryGetMethodInfo(out MethodInfo methodInfo)) return false;
+ if (!apiDescription.TryGetMethodInfo(out var methodInfo)) return false;
var allowedVersions = methodInfo.GetCustomAttributes(true).OfType().FirstOrDefault();
- return (allowedVersions != null && allowedVersions.AcceptedVersions.Contains(version));
+ return allowedVersions != null && allowedVersions.AcceptedVersions.Contains(version);
});
});
}
-
#endregion
builder.AddMvcOptions(options =>
{
options.Filters.Insert(0, new ConsumesAttribute("application/json"));
options.Filters.Insert(1, new ProducesAttribute("application/json"));
-
options.ModelBinderProviders.Insert(0, new CommaDelimitedArrayModelBinderProvider());
-
- JsonOutputFormatter jsonFormatter = options.OutputFormatters.OfType().FirstOrDefault();
-
- jsonFormatter?.SupportedMediaTypes.Add("application/hal+json");
- });
-
- builder.AddJsonOptions(x =>
- {
- x.SerializerSettings.Initialize();
});
return builder;
}
}
-}
+}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Swagger/DocumentFilter/EndPointPathsAndParamsToLower.cs b/src/Digipolis.Web/Swagger/DocumentFilter/EndPointPathsAndParamsToLower.cs
index 92471ca..ede1918 100644
--- a/src/Digipolis.Web/Swagger/DocumentFilter/EndPointPathsAndParamsToLower.cs
+++ b/src/Digipolis.Web/Swagger/DocumentFilter/EndPointPathsAndParamsToLower.cs
@@ -1,46 +1,50 @@
-using Swashbuckle.AspNetCore.Swagger;
+using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;
using System.Linq;
+using Digipolis.Web.Api.Tools;
+using Microsoft.OpenApi.Models;
namespace Digipolis.Web.Swagger
{
internal class EndPointPathsAndParamsToLower : IDocumentFilter
{
- public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
+ public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
- var newPaths = new Dictionary();
+ var newPaths = new Dictionary();
foreach (var path in swaggerDoc.Paths)
{
var res = HandlePath(path.Value);
newPaths.Add(path.Key.ToLowerInvariant(), res);
}
- swaggerDoc.Paths = newPaths;
+
+ var dict = new OpenApiPaths();
+ dict.AddRangeIfNotExist(newPaths);
+
+ swaggerDoc.Paths = dict;
}
- private PathItem HandlePath(PathItem value)
+ private OpenApiPathItem HandlePath(OpenApiPathItem value)
{
- value.Parameters = handleParameters(value.Parameters);
+ value.Parameters = HandleParameters(value.Parameters);
+ foreach (var operation in value.Operations)
+ {
+ operation.Value.Parameters = HandleParameters(operation.Value.Parameters);
+ }
- if (value.Get != null) value.Get.Parameters = handleParameters(value.Get.Parameters);
- if (value.Post != null) value.Post.Parameters = handleParameters(value.Post.Parameters);
- if (value.Put != null) value.Put.Parameters = handleParameters(value.Put.Parameters);
- if (value.Patch != null) value.Patch.Parameters = handleParameters(value.Patch.Parameters);
- if (value.Delete != null) value.Delete.Parameters = handleParameters(value.Delete.Parameters);
- if (value.Head != null) value.Head.Parameters = handleParameters(value.Head.Parameters);
- if (value.Options != null) value.Options.Parameters = handleParameters(value.Options.Parameters);
return value;
}
- private IList handleParameters(IList parameters)
+ private static IList HandleParameters(IList parameters)
{
if (parameters == null) return null;
- foreach (var item in parameters.Where(x => new[]{ "query", "path", "body"}.Contains(x.In)))
+ foreach (var item in parameters)
{
item.Name = item.Name?.ToLowerInvariant();
}
+
return parameters;
- }
+ }
}
}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Swagger/DocumentFilter/SetVersionInPaths.cs b/src/Digipolis.Web/Swagger/DocumentFilter/SetVersionInPaths.cs
index 7062827..ac06364 100644
--- a/src/Digipolis.Web/Swagger/DocumentFilter/SetVersionInPaths.cs
+++ b/src/Digipolis.Web/Swagger/DocumentFilter/SetVersionInPaths.cs
@@ -2,39 +2,42 @@
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Linq;
+using System.Text.RegularExpressions;
+using Microsoft.OpenApi.Models;
namespace Digipolis.Web.Swagger
{
internal class SetVersionInPaths : IDocumentFilter
{
- public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
+ public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
- swaggerDoc.Paths = swaggerDoc.Paths.ToDictionary(
- entry => entry.Key.Replace("{apiVersion}", swaggerDoc.Info.Version).Replace("{apiversion}", swaggerDoc.Info.Version),
- entry =>
+ var originalPaths = swaggerDoc.Paths;
+ var newPaths = new OpenApiPaths();
+
+ foreach (var path in originalPaths)
+ {
+ var key = path.Key.Replace("{apiVersion}", swaggerDoc.Info.Version).Replace("{apiversion}", swaggerDoc.Info.Version);
+ var pathItem = path.Value;
+
+ foreach (var op in pathItem.Operations)
{
- var pathItem = entry.Value;
- RemoveVersionParamFrom(pathItem.Get);
- RemoveVersionParamFrom(pathItem.Put);
- RemoveVersionParamFrom(pathItem.Post);
- RemoveVersionParamFrom(pathItem.Delete);
- RemoveVersionParamFrom(pathItem.Options);
- RemoveVersionParamFrom(pathItem.Head);
- RemoveVersionParamFrom(pathItem.Patch);
- return pathItem;
- });
+ RemoveVersionParamFrom(op.Value);
+ }
+
+ newPaths.Add(key, pathItem);
+ }
+
+ swaggerDoc.Paths = newPaths;
}
- private void RemoveVersionParamFrom(Operation operation)
+ private static void RemoveVersionParamFrom(OpenApiOperation operation)
{
- if (operation == null || operation.Parameters == null) return;
+ var versionParam = operation?.Parameters?.FirstOrDefault(param => param.Name.Equals("apiVersion", StringComparison.CurrentCultureIgnoreCase));
- var versionParam = operation.Parameters.FirstOrDefault(param => param.Name.Equals("apiVersion", StringComparison.CurrentCultureIgnoreCase));
- if (versionParam == null) return;
+ if (versionParam == null)
+ return;
operation.Parameters.Remove(versionParam);
}
}
-
-
-}
+}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Swagger/OperationFilter/AddConsumeProducesValues.cs b/src/Digipolis.Web/Swagger/OperationFilter/AddConsumeProducesValues.cs
index de02769..53cae4e 100644
--- a/src/Digipolis.Web/Swagger/OperationFilter/AddConsumeProducesValues.cs
+++ b/src/Digipolis.Web/Swagger/OperationFilter/AddConsumeProducesValues.cs
@@ -1,6 +1,7 @@
using System;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
+using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Swashbuckle.AspNetCore.Swagger;
@@ -8,27 +9,27 @@ namespace Digipolis.Web.Swagger
{
public class AddConsumeProducesValues : IOperationFilter
{
- public void Apply(Operation operation, OperationFilterContext context)
+ public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
var produces = context.MethodInfo.GetCustomAttributes(true).OfType().LastOrDefault();
var consumes = context.MethodInfo.GetCustomAttributes(true).OfType().LastOrDefault();
-
- if (produces != null) {
- foreach (var responseType in produces.ContentTypes)
- {
- if (!operation.Produces.Contains(responseType))
- operation.Produces.Add(responseType);
- }
- };
-
- if (consumes != null)
- {
- foreach (var responseType in consumes.ContentTypes)
- {
- if (!operation.Consumes.Contains(responseType))
- operation.Consumes.Add(responseType);
- }
- };
+ //
+ // if (produces != null) {
+ // foreach (var responseType in produces.ContentTypes)
+ // {
+ // if (!operation.Produces.Contains(responseType))
+ // operation.Produces.Add(responseType);
+ // }
+ // };
+ //
+ // if (consumes != null)
+ // {
+ // foreach (var responseType in consumes.ContentTypes)
+ // {
+ // if (!operation.Consumes.Contains(responseType))
+ // operation.Consumes.Add(responseType);
+ // }
+ // };
}
}
}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Swagger/OperationFilter/AddFileUploadParams.cs b/src/Digipolis.Web/Swagger/OperationFilter/AddFileUploadParams.cs
index 2ac28d2..bf4147d 100644
--- a/src/Digipolis.Web/Swagger/OperationFilter/AddFileUploadParams.cs
+++ b/src/Digipolis.Web/Swagger/OperationFilter/AddFileUploadParams.cs
@@ -3,6 +3,7 @@
using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Http;
+using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Swashbuckle.AspNetCore.Swagger;
@@ -10,7 +11,7 @@ namespace Digipolis.Web.Swagger
{
public class AddFileUploadParams : IOperationFilter
{
- public void Apply(Operation operation, OperationFilterContext context)
+ public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (operation.Parameters == null)
return;
@@ -31,33 +32,35 @@ public void Apply(Operation operation, OperationFilterContext context)
if (!allFileParamNames.Any())
return;
- var paramsToRemove = new List();
- foreach (var param in operation.Parameters)
- {
- paramsToRemove.AddRange(from fileParamName in allFileParamNames
- where param.Name.StartsWith(fileParamName + ".")
- select param);
- }
- paramsToRemove.ForEach(x => operation.Parameters.Remove(x));
- foreach (var paramName in allFileParamNames)
- {
- var fileParam = new NonBodyParameter
- {
- Type = "file",
- Name = paramName,
- In = "formData",
- Required = true
- };
- operation.Parameters.Add(fileParam);
- }
- foreach (
- IParameter param in
- operation.Parameters.Where(x => x.In.Equals("form", StringComparison.CurrentCultureIgnoreCase)))
- {
- param.In = "formData";
- }
-
- operation.Consumes = new List() {"multipart/form-data"};
+ // var paramsToRemove = new List();
+ // foreach (var param in operation.Parameters)
+ // {
+ // paramsToRemove.AddRange(from fileParamName in allFileParamNames
+ // where param.Name.StartsWith(fileParamName + ".")
+ // select param);
+ // }
+ //
+ // paramsToRemove.ForEach(x => operation.Parameters.Remove(x));
+ // foreach (var paramName in allFileParamNames)
+ // {
+ // var fileParam = new OpenApiParameter()
+ // {
+ // Type = "file",
+ // Name = paramName,
+ // In = "formData",
+ // Required = true
+ // };
+ // operation.Parameters.Add(fileParam);
+ // }
+ //
+ // foreach (
+ // OpenApiParameter param in
+ // operation.Parameters.Where(x => x.In.Equals("form", StringComparison.CurrentCultureIgnoreCase)))
+ // {
+ // param.In = "formData";
+ // }
+ //
+ // // operation.Consumes = new List() {"multipart/form-data"};
}
}
}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Swagger/OperationFilter/ValidRefUri.cs b/src/Digipolis.Web/Swagger/OperationFilter/ValidRefUri.cs
index e95e97e..fdacb9f 100644
--- a/src/Digipolis.Web/Swagger/OperationFilter/ValidRefUri.cs
+++ b/src/Digipolis.Web/Swagger/OperationFilter/ValidRefUri.cs
@@ -3,68 +3,69 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Microsoft.OpenApi.Models;
namespace Digipolis.Web.Swagger
{
// This filter is necessary to correct the $Ref in the swagger for response types that are generic types.
- public class ValidRefUri : IOperationFilter
- {
- public void Apply(Operation operation, OperationFilterContext context)
- {
- //If no responses, skip the operation.
- if (operation.Responses is null) return;
- //If there are Ref's in the response schema
- foreach (var item in operation.Responses.Where(x => x.Value?.Schema?.Ref != null && x.Value.Schema.Ref.Contains('[')))
- {
- CorrectResponse(item, context);
- }
-
- foreach (var item in context.SchemaRegistry.Definitions.Where(x => x.Value?.Properties != null).ToList())
- {
- foreach (var property in item.Value.Properties.Where(x => x.Value.Ref != null && x.Value.Ref.Contains("[")))
- {
- CorrectProperty(property, context);
- }
- }
- }
- private void CorrectResponse(KeyValuePair response, OperationFilterContext context)
- {
- var invalidRef = response.Value.Schema.Ref;
- var validRef = invalidRef.Replace("[", "_").Replace(",", "_").Replace("]", "");
-
- var schemaName = invalidRef.Split('/').LastOrDefault();
- var validSchemaName = validRef.Split('/').LastOrDefault();
-
- Schema schema;
- if (context.SchemaRegistry.Definitions.TryGetValue(schemaName, out schema))
- {
- context.SchemaRegistry.Definitions.Remove(schemaName);
- if (!context.SchemaRegistry.Definitions.Keys.Contains(validSchemaName))
- {
- context.SchemaRegistry.Definitions.Add(validSchemaName, schema);
- }
- response.Value.Schema.Ref = validRef;
- }
- }
- private void CorrectProperty(KeyValuePair prop, OperationFilterContext context)
- {
- var invalidRef = prop.Value.Ref;
- var validRef = invalidRef.Replace("[", "_").Replace(",", "_").Replace("]", "");
-
- var schemaName = invalidRef.Split('/').LastOrDefault();
- var validSchemaName = validRef.Split('/').LastOrDefault();
- Schema schema;
- if (context.SchemaRegistry.Definitions.TryGetValue(schemaName, out schema))
- {
- context.SchemaRegistry.Definitions.Remove(schemaName);
- if (!context.SchemaRegistry.Definitions.Keys.Contains(validSchemaName))
- {
- context.SchemaRegistry.Definitions.Add(validSchemaName, schema);
- }
- prop.Value.Ref = validRef;
- }
-
-
- }
- }
+ // public class ValidRefUri : IOperationFilter
+ // {
+ // public void Apply(OpenApiOperation operation, OperationFilterContext context)
+ // {
+ // //If no responses, skip the operation.
+ // if (operation.Responses is null) return;
+ // //If there are Ref's in the response schema
+ // foreach (var item in operation.Responses.Where(x => x.Value?.?.Ref != null && x.Value.Schema.Ref.Contains('[')))
+ // {
+ // CorrectResponse(item, context);
+ // }
+ //
+ // foreach (var item in context.SchemaRegistry.Definitions.Where(x => x.Value?.Properties != null).ToList())
+ // {
+ // foreach (var property in item.Value.Properties.Where(x => x.Value.Ref != null && x.Value.Ref.Contains("[")))
+ // {
+ // CorrectProperty(property, context);
+ // }
+ // }
+ // }
+ // private void CorrectResponse(KeyValuePair response, OperationFilterContext context)
+ // {
+ // var invalidRef = response.Value.Schema.Ref;
+ // var validRef = invalidRef.Replace("[", "_").Replace(",", "_").Replace("]", "");
+ //
+ // var schemaName = invalidRef.Split('/').LastOrDefault();
+ // var validSchemaName = validRef.Split('/').LastOrDefault();
+ //
+ // Schema schema;
+ // if (context.SchemaRegistry.Definitions.TryGetValue(schemaName, out schema))
+ // {
+ // context.SchemaRegistry.Definitions.Remove(schemaName);
+ // if (!context.SchemaRegistry.Definitions.Keys.Contains(validSchemaName))
+ // {
+ // context.SchemaRegistry.Definitions.Add(validSchemaName, schema);
+ // }
+ // response.Value.Schema.Ref = validRef;
+ // }
+ // }
+ // private void CorrectProperty(KeyValuePair prop, OperationFilterContext context)
+ // {
+ // var invalidRef = prop.Value.Ref;
+ // var validRef = invalidRef.Replace("[", "_").Replace(",", "_").Replace("]", "");
+ //
+ // var schemaName = invalidRef.Split('/').LastOrDefault();
+ // var validSchemaName = validRef.Split('/').LastOrDefault();
+ // Schema schema;
+ // if (context.SchemaRegistry.Definitions.TryGetValue(schemaName, out schema))
+ // {
+ // context.SchemaRegistry.Definitions.Remove(schemaName);
+ // if (!context.SchemaRegistry.Definitions.Keys.Contains(validSchemaName))
+ // {
+ // context.SchemaRegistry.Definitions.Add(validSchemaName, schema);
+ // }
+ // prop.Value.Ref = validRef;
+ // }
+ //
+ //
+ // }
+ // }
}
\ No newline at end of file
diff --git a/src/Digipolis.Web/Swagger/SwaggerResponseDefaults.cs b/src/Digipolis.Web/Swagger/SwaggerResponseDefaults.cs
index 66dbe0d..612a54d 100644
--- a/src/Digipolis.Web/Swagger/SwaggerResponseDefaults.cs
+++ b/src/Digipolis.Web/Swagger/SwaggerResponseDefaults.cs
@@ -1,17 +1,18 @@
using System;
+using System.Collections.Generic;
using System.Linq;
using Digipolis.Errors;
using Digipolis.Web.Api;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
+using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
-using Swashbuckle.AspNetCore.Swagger;
namespace Digipolis.Web.Swagger
{
public class SwaggerResponseDefaults : SwaggerResponseDefinitions
{
- protected override void ConfigureResponses(Operation operation, OperationFilterContext context)
+ protected override void ConfigureResponses(OpenApiOperation operation, OperationFilterContext context)
{
UnauthorizedResponse(operation, context);
InternalServerErrorResponse(operation, context);
@@ -22,7 +23,7 @@ protected override void ConfigureResponses(Operation operation, OperationFilterC
NotFoundResponse(operation, context);
}
- protected virtual void UnauthorizedResponse(Operation operation, OperationFilterContext context)
+ protected virtual void UnauthorizedResponse(OpenApiOperation operation, OperationFilterContext context)
{
var allowsAnonymous = ActionAttributes.OfType().Any();
if (operation.Responses.ContainsKey("401"))
@@ -30,52 +31,70 @@ protected virtual void UnauthorizedResponse(Operation operation, OperationFilter
if (allowsAnonymous) operation.Responses.Remove("401");
else operation.Responses["401"].Description = "Unauthorized";
return;
- };
+ }
if (!CombinedAttributes.OfType().Any() || allowsAnonymous) return;
- operation.Responses.Add("401", new Response
+ operation.Responses.Add("401", new OpenApiResponse()
{
Description = "Unauthorized",
- Schema = context.SchemaRegistry.GetOrRegister(typeof(Error))
+ Content = new Dictionary
+ {
+ ["application/problem+json"] = new OpenApiMediaType
+ {
+ Schema = context.SchemaGenerator.GenerateSchema(typeof(Error), context.SchemaRepository)
+ }
+ }
});
}
- protected virtual void BadRequestResponse(Operation operation, OperationFilterContext context)
+ protected virtual void BadRequestResponse(OpenApiOperation operation, OperationFilterContext context)
{
if (operation.Responses.ContainsKey("400")) return;
if (!CombinedAttributes.Any(x => x is ValidateModelStateAttribute || x is HttpPostAttribute || x is HttpPutAttribute || x is HttpPatchAttribute))
return;
- operation.Responses.Add("400", new Response
+ operation.Responses.Add("400", new OpenApiResponse
{
Description = "Validation error",
- Schema = context.SchemaRegistry.GetOrRegister(typeof(Error))
+ Content = new Dictionary
+ {
+ ["application/problem+json"] = new OpenApiMediaType
+ {
+ Schema = context.SchemaGenerator.GenerateSchema(typeof(Error), context.SchemaRepository)
+ }
+ }
});
}
- protected virtual void InternalServerErrorResponse(Operation operation, OperationFilterContext context)
+ protected virtual void InternalServerErrorResponse(OpenApiOperation operation, OperationFilterContext context)
{
if (operation.Responses.ContainsKey("500")) return;
- operation.Responses.Add("500", new Response
+ operation.Responses.Add("500", new OpenApiResponse()
{
Description = "Technical error",
- Schema = context.SchemaRegistry.GetOrRegister(typeof(Error)),
+ Content = new Dictionary
+ {
+ ["application/problem+json"] = new OpenApiMediaType
+ {
+ Schema = context.SchemaGenerator.GenerateSchema(typeof(Error), context.SchemaRepository)
+ }
+ }
});
}
- protected virtual void NoContentResponse(Operation operation, OperationFilterContext context)
+ protected virtual void NoContentResponse(OpenApiOperation operation, OperationFilterContext context)
{
if (!CombinedAttributes.OfType().Any()) return;
operation.Responses.Remove("200");
if (operation.Responses.ContainsKey("204")) return;
- operation.Responses.Add("204", new Response
+ operation.Responses.Add("204", new OpenApiResponse()
{
Description = "Removed"
});
}
- protected virtual void CreatedResponse(Operation operation, OperationFilterContext context)
+ protected virtual void CreatedResponse(OpenApiOperation operation, OperationFilterContext context)
{
if (!CombinedAttributes.OfType().Any()) return;
if (!operation.Responses.ContainsKey("201")) return;
@@ -84,7 +103,7 @@ protected virtual void CreatedResponse(Operation operation, OperationFilterConte
response.Description = "Created";
}
- protected virtual void OkResponse(Operation operation, OperationFilterContext contexts)
+ protected virtual void OkResponse(OpenApiOperation operation, OperationFilterContext contexts)
{
if (!operation.Responses.ContainsKey("200")) return;
var response = operation.Responses["200"];
@@ -92,7 +111,7 @@ protected virtual void OkResponse(Operation operation, OperationFilterContext co
response.Description = "Ok";
}
- protected virtual void NotFoundResponse(Operation operation, OperationFilterContext context)
+ protected virtual void NotFoundResponse(OpenApiOperation operation, OperationFilterContext context)
{
if (operation.Responses.ContainsKey("404"))
{
@@ -105,10 +124,16 @@ protected virtual void NotFoundResponse(Operation operation, OperationFilterCont
if (!context.ApiDescription.ParameterDescriptions.Any(x => !x.Name.Equals("apiVersion") && x.Source.Id.Equals("Path")))
return;
- operation.Responses.Add("404", new Response
+ operation.Responses.Add("404", new OpenApiResponse()
{
Description = "Not found",
- Schema = context.SchemaRegistry.GetOrRegister(typeof(Error))
+ Content = new Dictionary
+ {
+ ["application/problem+json"] = new OpenApiMediaType
+ {
+ Schema = context.SchemaGenerator.GenerateSchema(typeof(Error), context.SchemaRepository)
+ }
+ }
});
}
}
diff --git a/src/Digipolis.Web/Swagger/SwaggerResponseDefinitions.cs b/src/Digipolis.Web/Swagger/SwaggerResponseDefinitions.cs
index db00ce9..c37f072 100644
--- a/src/Digipolis.Web/Swagger/SwaggerResponseDefinitions.cs
+++ b/src/Digipolis.Web/Swagger/SwaggerResponseDefinitions.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Microsoft.OpenApi.Models;
namespace Digipolis.Web.Swagger
{
@@ -14,7 +15,7 @@ public abstract class SwaggerResponseDefinitions : IOperationFilter
protected IEnumerable CombinedAttributes { get; private set; }
- public void Apply(Operation operation, Swashbuckle.AspNetCore.SwaggerGen.OperationFilterContext context)
+ public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
ActionAttributes = context.MethodInfo.GetCustomAttributes(true).OfType();
ControllerAttributes = context.MethodInfo.DeclaringType.GetCustomAttributes(true).OfType();
@@ -23,9 +24,9 @@ public void Apply(Operation operation, Swashbuckle.AspNetCore.SwaggerGen.Operati
ExcludeSwaggerResonse(operation);
}
- protected abstract void ConfigureResponses(Operation operation, Swashbuckle.AspNetCore.SwaggerGen.OperationFilterContext context);
+ protected abstract void ConfigureResponses(OpenApiOperation operation, OperationFilterContext context);
- private void ExcludeSwaggerResonse(Operation operation)
+ private void ExcludeSwaggerResonse(OpenApiOperation operation)
{
var excludes = CombinedAttributes.OfType();
if (!excludes.Any()) return;
diff --git a/src/Digipolis.Web/Swagger/SwaggerSettings.cs b/src/Digipolis.Web/Swagger/SwaggerSettings.cs
index 9991d1a..94e26c0 100644
--- a/src/Digipolis.Web/Swagger/SwaggerSettings.cs
+++ b/src/Digipolis.Web/Swagger/SwaggerSettings.cs
@@ -12,16 +12,16 @@ public void Configure(SwaggerGenOptions options)
options.OperationFilter();
// determine base path for the application.
- var basePath = AppContext.BaseDirectory;
- var assemblyName = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
- var fileName = System.IO.Path.GetFileName(assemblyName + ".xml");
+ var basePath = AppContext.BaseDirectory;
+ var assemblyName = System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name;
+ var fileName = Path.GetFileName($"{assemblyName}.xml");
var xmlPath = Path.Combine(basePath, fileName);
if (File.Exists(xmlPath)) options.IncludeXmlComments(xmlPath);
options.OperationFilter();
options.OperationFilter();
- options.OperationFilter();
+ // options.OperationFilter();
options.DocumentFilter();
options.DocumentFilter();
diff --git a/test/Digipolis.Web.UnitTests/Api/Models/PageOptionsExtensionsTest.cs b/test/Digipolis.Web.UnitTests/Api/Models/PageOptionsExtensionsTest.cs
index 57dc262..cb067c7 100644
--- a/test/Digipolis.Web.UnitTests/Api/Models/PageOptionsExtensionsTest.cs
+++ b/test/Digipolis.Web.UnitTests/Api/Models/PageOptionsExtensionsTest.cs
@@ -152,7 +152,7 @@ private Mock GetActionContextAccessorWithLinkProvider()
accessor.SetupGet((o) => o.ActionContext).Returns(actionContext);
- var linkProvider = new LinkProvider(accessor.Object, urlHelper.Object, apiExtOptions.Object);
+ var linkProvider = new LinkProvider(accessor.Object, urlHelper.Object);
serviceProvider.Setup((x) => x.GetService(typeof(ILinkProvider))).Returns(linkProvider);
diff --git a/test/Digipolis.Web.UnitTests/Api/Tools/LinkProviderTest.cs b/test/Digipolis.Web.UnitTests/Api/Tools/LinkProviderTest.cs
index 725db4f..ee86502 100644
--- a/test/Digipolis.Web.UnitTests/Api/Tools/LinkProviderTest.cs
+++ b/test/Digipolis.Web.UnitTests/Api/Tools/LinkProviderTest.cs
@@ -1,5 +1,4 @@
using Digipolis.Web.Api.Tools;
-using Digipolis.Web.UnitTests._TestObjects;
using Digipolis.Web.UnitTests.Utilities;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
@@ -27,14 +26,13 @@ public void GetAbsoluteUrlBuilder_BuildsUrlFromRequestHostAndScheme()
Mock.Get(actionContext.HttpContext.Request).SetupGet(x => x.Host).Returns(host);
Mock.Get(actionContext.HttpContext.Request).SetupGet(x => x.Scheme).Returns("xyz");
- var headerDictionary = new HeaderDictionary();
- headerDictionary.Add(new KeyValuePair("Host", new StringValues("test.be:99")));
+ var headerDictionary = new HeaderDictionary {new KeyValuePair("Host", new StringValues("test.be:99"))};
Mock.Get(actionContext.HttpContext.Request).SetupGet(x => x.Headers).Returns(headerDictionary);
var urlHelper = new Mock().Object;
// act
- var linkProvider = new LinkProvider(actionContextAccessorMock.Object, urlHelper, new TestApiExtensionOptions(new Web.Api.ApiExtensionOptions()));
+ var linkProvider = new LinkProvider(actionContextAccessorMock.Object, urlHelper);
var absoluteUrl = linkProvider.GetAbsoluteUrlBuilder();
// assert
@@ -62,7 +60,7 @@ public void GetFullUrlBuilder_BuildsFullUrlWithQueryString()
var urlHelper = new Mock().Object;
// act
- var linkProvider = new LinkProvider(actionContextAccessorMock.Object, urlHelper, new TestApiExtensionOptions(new Web.Api.ApiExtensionOptions()));
+ var linkProvider = new LinkProvider(actionContextAccessorMock.Object, urlHelper);
var fullUrl = linkProvider.GetFullUrlBuilder("/v1/test?q=99&q2=test");
// assert
@@ -90,7 +88,7 @@ public void GetFullUrlBuilder_BuildsFullUrlWithoutQueryString()
var urlHelper = new Mock().Object;
// act
- var linkProvider = new LinkProvider(actionContextAccessorMock.Object, urlHelper, new TestApiExtensionOptions(new Web.Api.ApiExtensionOptions()));
+ var linkProvider = new LinkProvider(actionContextAccessorMock.Object, urlHelper);
var fullUrl = linkProvider.GetFullUrlBuilder("/v1/test");
// assert
diff --git a/test/Digipolis.Web.UnitTests/Digipolis.Web.UnitTests.csproj b/test/Digipolis.Web.UnitTests/Digipolis.Web.UnitTests.csproj
index 6b7d089..c9225f2 100644
--- a/test/Digipolis.Web.UnitTests/Digipolis.Web.UnitTests.csproj
+++ b/test/Digipolis.Web.UnitTests/Digipolis.Web.UnitTests.csproj
@@ -42,13 +42,13 @@
-
+
-
-
-
-
+
+
+
+
diff --git a/test/Digipolis.Web.UnitTests/Exceptions/ExceptionHandlerTests.cs b/test/Digipolis.Web.UnitTests/Exceptions/ExceptionHandlerTests.cs
index 5187f8d..2ac0190 100644
--- a/test/Digipolis.Web.UnitTests/Exceptions/ExceptionHandlerTests.cs
+++ b/test/Digipolis.Web.UnitTests/Exceptions/ExceptionHandlerTests.cs
@@ -19,14 +19,14 @@ public class ExceptionHandlerTests
[Fact]
private void CtorMapperNullException()
{
- Assert.Throws(() => new ExceptionHandler(null, null, null, null));
+ Assert.Throws(() => new ExceptionHandler(null, null, null));
}
[Fact]
private void CtorLoggerNullException()
{
var mapper = new ExceptionMapperTest();
- Assert.Throws(() => new ExceptionHandler(mapper, null, null, null));
+ Assert.Throws(() => new ExceptionHandler(mapper, null, null));
}
[Fact]
@@ -34,7 +34,7 @@ private void CtorSuccesWithoutOptions()
{
var mapper = new ExceptionMapperTest();
var logger = new TestLogger();
- Assert.NotNull(new ExceptionHandler(mapper, logger, null, null));
+ Assert.NotNull(new ExceptionHandler(mapper, logger, null));
}
[Fact]
diff --git a/test/Digipolis.Web.UnitTests/Modelbinders/CommaDelimitedArrayModelBinderTest.cs b/test/Digipolis.Web.UnitTests/Modelbinders/CommaDelimitedArrayModelBinderTest.cs
index b89fe17..f6bf92a 100644
--- a/test/Digipolis.Web.UnitTests/Modelbinders/CommaDelimitedArrayModelBinderTest.cs
+++ b/test/Digipolis.Web.UnitTests/Modelbinders/CommaDelimitedArrayModelBinderTest.cs
@@ -20,7 +20,7 @@ public void ShouldParseArrayOfInt()
{
var binder = new CommaDelimitedArrayModelBinder();
- var result = binder.ParseArray("1,2,3", typeof(int[]));
+ var result = CommaDelimitedArrayModelBinder.ParseArray("1,2,3", typeof(int[]));
Assert.NotNull(result);
Assert.True(result is int[]);
@@ -38,7 +38,7 @@ public void ShouldParseArrayOfString()
{
var binder = new CommaDelimitedArrayModelBinder();
- var result = binder.ParseArray("1,two,3", typeof(string[]));
+ var result = CommaDelimitedArrayModelBinder.ParseArray("1,two,3", typeof(string[]));
Assert.NotNull(result);
Assert.True(result is string[]);
@@ -56,7 +56,7 @@ public void ShouldParseListOfString()
{
var binder = new CommaDelimitedArrayModelBinder();
- var result = binder.ParseArray("1,two,3", typeof(List));
+ var result = CommaDelimitedArrayModelBinder.ParseArray("1,two,3", typeof(List));
Assert.NotNull(result);
Assert.True(result is List);
@@ -74,7 +74,7 @@ public void ShouldParseListOfDateTime()
{
var binder = new CommaDelimitedArrayModelBinder();
- var result = binder.ParseArray("2016-01-01,1981-10-26,2012-12-21", typeof(List));
+ var result = CommaDelimitedArrayModelBinder.ParseArray("2016-01-01,1981-10-26,2012-12-21", typeof(List));
Assert.NotNull(result);
Assert.True(result is List);
@@ -89,7 +89,7 @@ public void ShouldThrowNotSupportedExceptionIfNotArrayOrIEnumerable()
{
var binder = new CommaDelimitedArrayModelBinder();
- Assert.Throws(() => binder.ParseArray("coords(12.4,12.2),454564.454,C#", typeof(ulong)));
+ Assert.Throws(() => CommaDelimitedArrayModelBinder.ParseArray("coords(12.4,12.2),454564.454,C#", typeof(ulong)));
}
[Fact]
@@ -97,7 +97,7 @@ public void ShouldThrowNotSupportedExceptionIfArrayOfReferenceType()
{
var binder = new CommaDelimitedArrayModelBinder();
- Assert.Throws(() => binder.ParseArray("coords(12.4,12.2),454564.454,C#", typeof(List