Remove IErrorDescriptionFactory

This commit is contained in:
Ryan Brandenburg 2018-02-28 15:37:32 -08:00
parent d6ba2ee966
commit 9b4b373014
10 changed files with 8 additions and 204 deletions

View File

@ -214,9 +214,6 @@ namespace Microsoft.Extensions.DependencyInjection
services.TryAddTransient<DisableRequestSizeLimitFilter>();
services.TryAddTransient<RequestFormLimitsFilter>();
// Error description
services.TryAddSingleton<IErrorDescriptionFactory, DefaultErrorDescriptorFactory>();
//
// ModelBinding, Validation
//

View File

@ -1,19 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Mvc.Abstractions;
namespace Microsoft.AspNetCore.Mvc.Infrastructure
{
public class ErrorDescriptionContext
{
public ErrorDescriptionContext(ActionDescriptor actionDescriptor)
{
ActionDescriptor = actionDescriptor;
}
public ActionDescriptor ActionDescriptor { get; }
public object Result { get; set; }
}
}

View File

@ -1,15 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Mvc.Abstractions;
namespace Microsoft.AspNetCore.Mvc.Infrastructure
{
/// <summary>
/// Defines a contract for creating or modifying an error response.
/// </summary>
public interface IErrorDescriptionFactory
{
object CreateErrorDescription(ActionDescriptor actionDescriptor, object result);
}
}

View File

@ -1,12 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNetCore.Mvc.Infrastructure
{
public interface IErrorDescriptorProvider
{
int Order { get; }
void OnProvidersExecuting(ErrorDescriptionContext context);
}
}

View File

@ -2,19 +2,15 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Internal
{
public class ApiBehaviorOptionsSetup : IConfigureOptions<ApiBehaviorOptions>
{
private readonly IErrorDescriptionFactory _errorDescriptionFactory;
public ApiBehaviorOptionsSetup(IErrorDescriptionFactory errorDescriptionFactory)
public ApiBehaviorOptionsSetup()
{
_errorDescriptionFactory = errorDescriptionFactory;
}
public void Configure(ApiBehaviorOptions options)
@ -28,13 +24,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
IActionResult GetInvalidModelStateResponse(ActionContext context)
{
var errorDetails = _errorDescriptionFactory.CreateErrorDescription(
context.ActionDescriptor,
context.ModelState);
var result = (errorDetails is ModelStateDictionary modelState) ?
new BadRequestObjectResult(modelState) :
new BadRequestObjectResult(errorDetails);
var result = new BadRequestObjectResult(context.ModelState);
result.ContentTypes.Add("application/json");
result.ContentTypes.Add("application/xml");

View File

@ -1,51 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Infrastructure;
namespace Microsoft.AspNetCore.Mvc.Internal
{
public class DefaultErrorDescriptorFactory : IErrorDescriptionFactory
{
private readonly IErrorDescriptorProvider[] _providers;
public DefaultErrorDescriptorFactory(IEnumerable<IErrorDescriptorProvider> providers)
{
if (providers == null)
{
throw new ArgumentNullException(nameof(providers));
}
_providers = providers.OrderBy(p => p.Order).ToArray();
}
public object CreateErrorDescription(ActionDescriptor actionDescriptor, object result)
{
if (actionDescriptor == null)
{
throw new ArgumentNullException(nameof(actionDescriptor));
}
if (result == null)
{
throw new ArgumentNullException(nameof(result));
}
var context = new ErrorDescriptionContext(actionDescriptor)
{
Result = result,
};
for (var i = 0; i < _providers.Length; i++)
{
_providers[i].OnProvidersExecuting(context);
}
return context.Result ?? result;
}
}
}

View File

@ -6,7 +6,6 @@ using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using BasicWebSite;
using BasicWebSite.Models;
using Newtonsoft.Json;
using Xunit;
@ -70,18 +69,10 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
State = "WA",
Zip = "Invalid",
};
var expected = new[]
var expected = new Dictionary<string, string[]>
{
new VndError
{
Path = "Name",
Message = "The field Name must be a string with a minimum length of 5 and a maximum length of 30.",
},
new VndError
{
Path = "Zip",
Message = @"The field Zip must match the regular expression '\d{5}'.",
},
{"Name", new string[] {"The field Name must be a string with a minimum length of 5 and a maximum length of 30."}},
{"Zip", new string[]{ @"The field Zip must match the regular expression '\d{5}'."}}
};
var contactString = JsonConvert.SerializeObject(contactModel);
@ -91,14 +82,9 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
// Assert
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
Assert.Equal("application/vnd.error+json", response.Content.Headers.ContentType.MediaType);
var actual = JsonConvert.DeserializeObject<VndError[]>(await response.Content.ReadAsStringAsync());
actual = actual.OrderBy(e => e.Path).ToArray();
Assert.Equal(expected.Length, actual.Length);
for (var i = 0; i < expected.Length; i++)
{
Assert.Equal(expected[i].Path, expected[i].Path);
Assert.Equal(expected[i].Message, expected[i].Message);
}
var content = await response.Content.ReadAsStringAsync();
var actual = JsonConvert.DeserializeObject<Dictionary<string, string[]>>(content);
Assert.Equal(expected, actual);
}
[Fact]

View File

@ -1,14 +1,10 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.IO;
using System.Linq;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
namespace BasicWebSite
@ -42,7 +38,6 @@ namespace BasicWebSite
services.AddSingleton<IActionDescriptorProvider, ActionDescriptorCreationCounter>();
services.AddHttpContextAccessor();
services.AddSingleton<ContactsRepository>();
services.AddSingleton<IErrorDescriptorProvider, VndErrorDescriptionProvider>();
services.AddScoped<RequestIdService>();
}

View File

@ -1,23 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
namespace BasicWebSite
{
public class VndError
{
public string LogRef { get; set; }
public string Path { get; set; }
public string Message { get; set; }
}
}

View File

@ -1,44 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.DependencyInjection;
namespace BasicWebSite
{
public class VndErrorDescriptionProvider : IErrorDescriptorProvider
{
public int Order => 0;
public void OnProvidersExecuting(ErrorDescriptionContext context)
{
if (context.ActionDescriptor.FilterDescriptors.Any(f => f.Filter is VndErrorAttribute) &&
context.Result is ModelStateDictionary dictionary)
{
var vndErrors = new List<VndError>();
foreach (var item in dictionary)
{
foreach (var modelError in item.Value.Errors)
{
vndErrors.Add(new VndError
{
LogRef = modelError.ErrorMessage,
Path = item.Key,
Message = modelError.ErrorMessage,
});
}
}
context.Result = vndErrors;
}
}
}
}