Move JSON.NET specific features to a separate assembly

This commit is contained in:
Pranav K 2018-12-17 07:32:15 +05:30
parent d116ab8550
commit cdc66c5f98
170 changed files with 1457 additions and 2147 deletions

View File

@ -136,9 +136,9 @@ This can be done once #4246 is complete, and done in conjunction with converting
<PackageArtifact Include="Microsoft.AspNetCore.Mvc.Core" Category="noship" /> <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Core" Category="noship" />
<PackageArtifact Include="Microsoft.AspNetCore.Mvc.Cors" Category="noship" /> <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Cors" Category="noship" />
<PackageArtifact Include="Microsoft.AspNetCore.Mvc.DataAnnotations" Category="noship" /> <PackageArtifact Include="Microsoft.AspNetCore.Mvc.DataAnnotations" Category="noship" />
<PackageArtifact Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Category="noship" />
<PackageArtifact Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Category="noship" /> <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Category="noship" />
<PackageArtifact Include="Microsoft.AspNetCore.Mvc.Localization" Category="noship" /> <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Localization" Category="noship" />
<PackageArtifact Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Category="ship" />
<PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor" Category="noship" /> <PackageArtifact Include="Microsoft.AspNetCore.Mvc.Razor" Category="noship" />
<PackageArtifact Include="Microsoft.AspNetCore.Mvc.RazorPages" Category="noship" /> <PackageArtifact Include="Microsoft.AspNetCore.Mvc.RazorPages" Category="noship" />
<PackageArtifact Include="Microsoft.AspNetCore.Mvc.TagHelpers" Category="noship" /> <PackageArtifact Include="Microsoft.AspNetCore.Mvc.TagHelpers" Category="noship" />

View File

@ -99,9 +99,9 @@
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Core" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.Core\Microsoft.AspNetCore.Mvc.Core.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Core" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.Core\Microsoft.AspNetCore.Mvc.Core.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Cors" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.Cors\Microsoft.AspNetCore.Mvc.Cors.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Cors" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.Cors\Microsoft.AspNetCore.Mvc.Cors.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.DataAnnotations" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.DataAnnotations\Microsoft.AspNetCore.Mvc.DataAnnotations.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.DataAnnotations" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.DataAnnotations\Microsoft.AspNetCore.Mvc.DataAnnotations.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Formatters.Json" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.Formatters.Json\Microsoft.AspNetCore.Mvc.Formatters.Json.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.Formatters.Xml\Microsoft.AspNetCore.Mvc.Formatters.Xml.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.Formatters.Xml\Microsoft.AspNetCore.Mvc.Formatters.Xml.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Localization" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.Localization\Microsoft.AspNetCore.Mvc.Localization.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Localization" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.Localization\Microsoft.AspNetCore.Mvc.Localization.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.NewtonsoftJson\Microsoft.AspNetCore.Mvc.NewtonsoftJson.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.RazorPages" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.RazorPages\Microsoft.AspNetCore.Mvc.RazorPages.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.RazorPages" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.RazorPages\Microsoft.AspNetCore.Mvc.RazorPages.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Razor" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.Razor\Microsoft.AspNetCore.Mvc.Razor.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Razor" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.Razor\Microsoft.AspNetCore.Mvc.Razor.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.TagHelpers" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.TagHelpers\Microsoft.AspNetCore.Mvc.TagHelpers.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.TagHelpers" ProjectPath="$(RepositoryRoot)src\Mvc\src\Microsoft.AspNetCore.Mvc.TagHelpers\Microsoft.AspNetCore.Mvc.TagHelpers.csproj" />

View File

@ -54,7 +54,6 @@
<Dependency Include="Microsoft.AspNetCore.Mvc.Core" Version="$(MicrosoftAspNetCoreMvcCorePackageVersion)" /> <Dependency Include="Microsoft.AspNetCore.Mvc.Core" Version="$(MicrosoftAspNetCoreMvcCorePackageVersion)" />
<Dependency Include="Microsoft.AspNetCore.Mvc.Cors" Version="$(MicrosoftAspNetCoreMvcCorsPackageVersion)" /> <Dependency Include="Microsoft.AspNetCore.Mvc.Cors" Version="$(MicrosoftAspNetCoreMvcCorsPackageVersion)" />
<Dependency Include="Microsoft.AspNetCore.Mvc.DataAnnotations" Version="$(MicrosoftAspNetCoreMvcDataAnnotationsPackageVersion)" /> <Dependency Include="Microsoft.AspNetCore.Mvc.DataAnnotations" Version="$(MicrosoftAspNetCoreMvcDataAnnotationsPackageVersion)" />
<Dependency Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Version="$(MicrosoftAspNetCoreMvcFormattersJsonPackageVersion)" />
<Dependency Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Version="$(MicrosoftAspNetCoreMvcFormattersXmlPackageVersion)" /> <Dependency Include="Microsoft.AspNetCore.Mvc.Formatters.Xml" Version="$(MicrosoftAspNetCoreMvcFormattersXmlPackageVersion)" />
<Dependency Include="Microsoft.AspNetCore.Mvc.Localization" Version="$(MicrosoftAspNetCoreMvcLocalizationPackageVersion)" /> <Dependency Include="Microsoft.AspNetCore.Mvc.Localization" Version="$(MicrosoftAspNetCoreMvcLocalizationPackageVersion)" />
<Dependency Include="Microsoft.AspNetCore.Mvc.Razor" Version="$(MicrosoftAspNetCoreMvcRazorPackageVersion)" /> <Dependency Include="Microsoft.AspNetCore.Mvc.Razor" Version="$(MicrosoftAspNetCoreMvcRazorPackageVersion)" />

View File

@ -1,3 +1,3 @@
@ECHO OFF @ECHO OFF
SET RepoRoot=%~dp0..\.. SET RepoRoot=%~dp0..\..
%RepoRoot%\build.cmd -LockFile %RepoRoot%\korebuild-lock.txt -projects %~dp0**\*.*proj %* %RepoRoot%\build.cmd -projects %~dp0\**\*.*proj %*

View File

@ -25,6 +25,7 @@
<Reference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" /> <Reference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" />
<Reference Include="Microsoft.AspNetCore.Identity.UI" /> <Reference Include="Microsoft.AspNetCore.Identity.UI" />
<Reference Include="Microsoft.AspNetCore.Mvc" /> <Reference Include="Microsoft.AspNetCore.Mvc" />
<Reference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" />
<Reference Include="Microsoft.AspNetCore.Rewrite" /> <Reference Include="Microsoft.AspNetCore.Rewrite" />
<Reference Include="Microsoft.AspNetCore.Server.IISIntegration" /> <Reference Include="Microsoft.AspNetCore.Server.IISIntegration" />
<Reference Include="Microsoft.AspNetCore.Server.Kestrel" /> <Reference Include="Microsoft.AspNetCore.Server.Kestrel" />

View File

@ -34,7 +34,8 @@ namespace Identity.DefaultUI.WebSite
{ {
options.Conventions.AuthorizeFolder("/Areas/Identity/Pages/Account/Manage"); options.Conventions.AuthorizeFolder("/Areas/Identity/Pages/Account/Manage");
options.Conventions.AuthorizePage("/Areas/Identity/Pages/Account/Logout"); options.Conventions.AuthorizePage("/Areas/Identity/Pages/Account/Logout");
}); })
.AddNewtonsoftJson();
} }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

View File

@ -31,7 +31,8 @@ namespace Identity.DefaultUI.WebSite
.AddUserManager<UserManager<Microsoft.AspNetCore.Identity.Test.PocoUser>>(); .AddUserManager<UserManager<Microsoft.AspNetCore.Identity.Test.PocoUser>>();
services.AddSingleton<IUserStore<Microsoft.AspNetCore.Identity.Test.PocoUser>, InMemoryUserStore<Microsoft.AspNetCore.Identity.Test.PocoUser>>(); services.AddSingleton<IUserStore<Microsoft.AspNetCore.Identity.Test.PocoUser>, InMemoryUserStore<Microsoft.AspNetCore.Identity.Test.PocoUser>>();
services.AddMvc(); services.AddMvc()
.AddNewtonsoftJson();
} }
} }
} }

View File

@ -12,7 +12,7 @@ using Microsoft.Extensions.FileProviders;
namespace Identity.DefaultUI.WebSite namespace Identity.DefaultUI.WebSite
{ {
public class StartupBase<TUser,TContext> public class StartupBase<TUser,TContext>
where TUser : class where TUser : class
where TContext : DbContext where TContext : DbContext
{ {
@ -45,7 +45,8 @@ namespace Identity.DefaultUI.WebSite
.AddRoles<IdentityRole>() .AddRoles<IdentityRole>()
.AddEntityFrameworkStores<TContext>(); .AddEntityFrameworkStores<TContext>();
services.AddMvc(); services.AddMvc()
.AddNewtonsoftJson();
} }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

View File

@ -2,8 +2,8 @@
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Debug", "Default": "Debug",
"System": "Information", "System": "Warning",
"Microsoft": "Information" "Microsoft": "Warning"
} }
} }
} }

View File

@ -83,11 +83,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Ab
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.ViewFeatures", "src\Microsoft.AspNetCore.Mvc.ViewFeatures\Microsoft.AspNetCore.Mvc.ViewFeatures.csproj", "{3F8B8FC1-9FE4-4788-8991-367113E8D7AD}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.ViewFeatures", "src\Microsoft.AspNetCore.Mvc.ViewFeatures\Microsoft.AspNetCore.Mvc.ViewFeatures.csproj", "{3F8B8FC1-9FE4-4788-8991-367113E8D7AD}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Formatters.Json", "src\Microsoft.AspNetCore.Mvc.Formatters.Json\Microsoft.AspNetCore.Mvc.Formatters.Json.csproj", "{3FC8D9D6-9352-43A3-8E81-422F270085B7}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.NewtonsoftJson", "src\Microsoft.AspNetCore.Mvc.NewtonsoftJson\Microsoft.AspNetCore.Mvc.NewtonsoftJson.csproj", "{3FC8D9D6-9352-43A3-8E81-422F270085B7}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Formatters.Xml", "src\Microsoft.AspNetCore.Mvc.Formatters.Xml\Microsoft.AspNetCore.Mvc.Formatters.Xml.csproj", "{42C81540-CD47-4C68-A7A3-2A93B9C3B210}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Formatters.Xml", "src\Microsoft.AspNetCore.Mvc.Formatters.Xml\Microsoft.AspNetCore.Mvc.Formatters.Xml.csproj", "{42C81540-CD47-4C68-A7A3-2A93B9C3B210}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Formatters.Json.Test", "test\Microsoft.AspNetCore.Mvc.Formatters.Json.Test\Microsoft.AspNetCore.Mvc.Formatters.Json.Test.csproj", "{493780DA-E696-40FF-BD12-4A5C5736F292}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.NewtonsoftJson.Test", "test\Microsoft.AspNetCore.Mvc.NewtonsoftJson.Test\Microsoft.AspNetCore.Mvc.NewtonsoftJson.Test.csproj", "{493780DA-E696-40FF-BD12-4A5C5736F292}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Formatters.Xml.Test", "test\Microsoft.AspNetCore.Mvc.Formatters.Xml.Test\Microsoft.AspNetCore.Mvc.Formatters.Xml.Test.csproj", "{22019146-BDFA-442E-8C8E-345FB9644578}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Formatters.Xml.Test", "test\Microsoft.AspNetCore.Mvc.Formatters.Xml.Test\Microsoft.AspNetCore.Mvc.Formatters.Xml.Test.csproj", "{22019146-BDFA-442E-8C8E-345FB9644578}"
EndProject EndProject

View File

@ -24,7 +24,7 @@
<Reference Include="Microsoft.AspNetCore.Authentication" /> <Reference Include="Microsoft.AspNetCore.Authentication" />
<Reference Include="Microsoft.AspNetCore.Authentication.JwtBearer" /> <Reference Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
<Reference Include="Microsoft.AspNetCore.Mvc.DataAnnotations" /> <Reference Include="Microsoft.AspNetCore.Mvc.DataAnnotations" />
<Reference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" /> <Reference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" />
<Reference Include="Microsoft.AspNetCore.Server.Kestrel" /> <Reference Include="Microsoft.AspNetCore.Server.Kestrel" />
<Reference Include="Microsoft.Extensions.Configuration.CommandLine" /> <Reference Include="Microsoft.Extensions.Configuration.CommandLine" />
</ItemGroup> </ItemGroup>

View File

@ -125,7 +125,7 @@ namespace BasicApi
services services
.AddMvcCore() .AddMvcCore()
.AddAuthorization() .AddAuthorization()
.AddJsonFormatters(json => json.ContractResolver = new CamelCasePropertyNamesContractResolver()) .AddNewtonsoftJson(options => options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver())
.AddDataAnnotations(); .AddDataAnnotations();
} }

View File

@ -4,8 +4,6 @@
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
<!-- Workaround https://github.com/dotnet/core-setup/issues/3726 --> <!-- Workaround https://github.com/dotnet/core-setup/issues/3726 -->
<GenerateDependencyFile>false</GenerateDependencyFile> <GenerateDependencyFile>false</GenerateDependencyFile>
<_EnableAllInclusiveRazorSdk>true</_EnableAllInclusiveRazorSdk>
<IsBenchmarkProject>true</IsBenchmarkProject> <IsBenchmarkProject>true</IsBenchmarkProject>
</PropertyGroup> </PropertyGroup>

View File

@ -1,15 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<RazorCompileOnBuild>true</RazorCompileOnBuild>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.AspNetCore.Mvc" /> <Reference Include="Microsoft.AspNetCore.Mvc" />
<Reference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" />
<Reference Include="Microsoft.AspNetCore.Diagnostics" /> <Reference Include="Microsoft.AspNetCore.Diagnostics" />
<Reference Include="Microsoft.AspNetCore.Server.IISIntegration" /> <Reference Include="Microsoft.AspNetCore.Server.IISIntegration" />
<Reference Include="Microsoft.AspNetCore.Server.Kestrel" /> <Reference Include="Microsoft.AspNetCore.Server.Kestrel" />

View File

@ -8,7 +8,6 @@ using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Core, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Core, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Cors, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Cors, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.DataAnnotations, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.DataAnnotations, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Json, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Xml, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Xml, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Localization, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Localization, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
@ -23,7 +22,6 @@ using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Core.TestCommon, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Core.TestCommon, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Cors.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Cors.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.DataAnnotations.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.DataAnnotations.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Json.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Xml.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Xml.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Localization.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Localization.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]

View File

@ -24,9 +24,9 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
"Microsoft.AspNetCore.Mvc.Core", "Microsoft.AspNetCore.Mvc.Core",
"Microsoft.AspNetCore.Mvc.Cors", "Microsoft.AspNetCore.Mvc.Cors",
"Microsoft.AspNetCore.Mvc.DataAnnotations", "Microsoft.AspNetCore.Mvc.DataAnnotations",
"Microsoft.AspNetCore.Mvc.Formatters.Json",
"Microsoft.AspNetCore.Mvc.Formatters.Xml", "Microsoft.AspNetCore.Mvc.Formatters.Xml",
"Microsoft.AspNetCore.Mvc.Localization", "Microsoft.AspNetCore.Mvc.Localization",
"Microsoft.AspNetCore.Mvc.NewtonsoftJson",
"Microsoft.AspNetCore.Mvc.Razor", "Microsoft.AspNetCore.Mvc.Razor",
"Microsoft.AspNetCore.Mvc.RazorPages", "Microsoft.AspNetCore.Mvc.RazorPages",
"Microsoft.AspNetCore.Mvc.TagHelpers", "Microsoft.AspNetCore.Mvc.TagHelpers",

View File

@ -3,10 +3,9 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Core;
using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc namespace Microsoft.AspNetCore.Mvc
{ {
@ -28,9 +27,8 @@ namespace Microsoft.AspNetCore.Mvc
/// Creates a new <see cref="JsonResult"/> with the given <paramref name="value"/>. /// Creates a new <see cref="JsonResult"/> with the given <paramref name="value"/>.
/// </summary> /// </summary>
/// <param name="value">The value to format as JSON.</param> /// <param name="value">The value to format as JSON.</param>
/// <param name="serializerSettings">The <see cref="JsonSerializerSettings"/> to be used by /// <param name="serializerSettings">The serializer settings to be used by the formatter.</param>
/// the formatter.</param> public JsonResult(object value, object serializerSettings)
public JsonResult(object value, JsonSerializerSettings serializerSettings)
{ {
if (serializerSettings == null) if (serializerSettings == null)
{ {
@ -47,9 +45,9 @@ namespace Microsoft.AspNetCore.Mvc
public string ContentType { get; set; } public string ContentType { get; set; }
/// <summary> /// <summary>
/// Gets or sets the <see cref="JsonSerializerSettings"/>. /// Gets or sets the serializer settings.
/// </summary> /// </summary>
public JsonSerializerSettings SerializerSettings { get; set; } public object SerializerSettings { get; set; }
/// <summary> /// <summary>
/// Gets or sets the HTTP status code. /// Gets or sets the HTTP status code.
@ -70,7 +68,17 @@ namespace Microsoft.AspNetCore.Mvc
} }
var services = context.HttpContext.RequestServices; var services = context.HttpContext.RequestServices;
var executor = services.GetRequiredService<JsonResultExecutor>(); var executor = services.GetService<IActionResultExecutor<JsonResult>>();
if (executor == null)
{
throw new InvalidOperationException(Resources.FormatReferenceToNewtonsoftJsonRequired(
$"{nameof(JsonResult)}.{nameof(ExecuteResultAsync)}",
"Microsoft.AspNetCore.Mvc.NewtonsoftJson",
nameof(IMvcBuilder),
"AddNewtonsoftJson",
"ConfigureServices(...)"));
}
return executor.ExecuteAsync(context, this); return executor.ExecuteAsync(context, this);
} }
} }

View File

@ -3,7 +3,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc namespace Microsoft.AspNetCore.Mvc
{ {
@ -18,7 +17,6 @@ namespace Microsoft.AspNetCore.Mvc
/// (e.g., using HTML [W3C.REC-html5-20141028]). When this member is not present, its value is assumed to be /// (e.g., using HTML [W3C.REC-html5-20141028]). When this member is not present, its value is assumed to be
/// "about:blank". /// "about:blank".
/// </summary> /// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "type")]
public string Type { get; set; } public string Type { get; set; }
/// <summary> /// <summary>
@ -26,25 +24,21 @@ namespace Microsoft.AspNetCore.Mvc
/// of the problem, except for purposes of localization(e.g., using proactive content negotiation; /// of the problem, except for purposes of localization(e.g., using proactive content negotiation;
/// see[RFC7231], Section 3.4). /// see[RFC7231], Section 3.4).
/// </summary> /// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "title")]
public string Title { get; set; } public string Title { get; set; }
/// <summary> /// <summary>
/// The HTTP status code([RFC7231], Section 6) generated by the origin server for this occurrence of the problem. /// The HTTP status code([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.
/// </summary> /// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "status")]
public int? Status { get; set; } public int? Status { get; set; }
/// <summary> /// <summary>
/// A human-readable explanation specific to this occurrence of the problem. /// A human-readable explanation specific to this occurrence of the problem.
/// </summary> /// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "detail")]
public string Detail { get; set; } public string Detail { get; set; }
/// <summary> /// <summary>
/// A URI reference that identifies the specific occurrence of the problem.It may or may not yield further information if dereferenced. /// A URI reference that identifies the specific occurrence of the problem.It may or may not yield further information if dereferenced.
/// </summary> /// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "instance")]
public string Instance { get; set; } public string Instance { get; set; }
/// <summary> /// <summary>
@ -58,7 +52,6 @@ namespace Microsoft.AspNetCore.Mvc
/// The round-tripping behavior for <see cref="Extensions"/> is determined by the implementation of the Input \ Output formatters. /// The round-tripping behavior for <see cref="Extensions"/> is determined by the implementation of the Input \ Output formatters.
/// In particular, complex types or collection types may not round-trip to the original type when using the built-in JSON or XML formatters. /// In particular, complex types or collection types may not round-trip to the original type when using the built-in JSON or XML formatters.
/// </remarks> /// </remarks>
[JsonExtensionData]
public IDictionary<string, object> Extensions { get; } = new Dictionary<string, object>(StringComparer.Ordinal); public IDictionary<string, object> Extensions { get; } = new Dictionary<string, object>(StringComparer.Ordinal);
} }
} }

View File

@ -10,7 +10,6 @@ using Microsoft.AspNetCore.Mvc.Formatters;
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.ApiExplorer, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.ApiExplorer, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Cors, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Cors, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.DataAnnotations, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.DataAnnotations, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Json, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Xml, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Xml, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Localization, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Localization, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
@ -25,7 +24,6 @@ using Microsoft.AspNetCore.Mvc.Formatters;
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Core.TestCommon, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Core.TestCommon, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Cors.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Cors.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.DataAnnotations.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.DataAnnotations.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Json.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Xml.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Xml.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Localization.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Localization.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]

View File

@ -1690,6 +1690,20 @@ namespace Microsoft.AspNetCore.Mvc.Core
internal static string FormatApiConventions_Title_422() internal static string FormatApiConventions_Title_422()
=> GetString("ApiConventions_Title_422"); => GetString("ApiConventions_Title_422");
/// <summary>
/// '{0}' requires a reference to '{1}'. Configure your application by adding a reference to the '{1}' package and calling '{2}.{3}' inside the call to '{4}' in the application startup code.
/// </summary>
internal static string ReferenceToNewtonsoftJsonRequired
{
get => GetString("ReferenceToNewtonsoftJsonRequired");
}
/// <summary>
/// '{0}' requires a reference to '{1}'. Configure your application by adding a reference to the '{1}' package and calling '{2}.{3}' inside the call to '{4}' in the application startup code.
/// </summary>
internal static string FormatReferenceToNewtonsoftJsonRequired(object p0, object p1, object p2, object p3, object p4)
=> string.Format(CultureInfo.CurrentCulture, GetString("ReferenceToNewtonsoftJsonRequired"), p0, p1, p2, p3, p4);
private static string GetString(string name, params string[] formatterNames) private static string GetString(string name, params string[] formatterNames)
{ {
var value = _resourceManager.GetString(name); var value = _resourceManager.GetString(name);

View File

@ -490,4 +490,7 @@
<data name="ApiConventions_Title_422" xml:space="preserve"> <data name="ApiConventions_Title_422" xml:space="preserve">
<value>Unprocessable Entity</value> <value>Unprocessable Entity</value>
</data> </data>
<data name="ReferenceToNewtonsoftJsonRequired" xml:space="preserve">
<value>'{0}' requires a reference to '{1}'. Configure your application by adding a reference to the '{1}' package and calling '{2}.{3}' inside the call to '{4}' in the application startup code.</value>
</data>
</root> </root>

View File

@ -5,7 +5,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.Core; using Microsoft.AspNetCore.Mvc.Core;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc namespace Microsoft.AspNetCore.Mvc
{ {
@ -84,7 +83,6 @@ namespace Microsoft.AspNetCore.Mvc
/// <summary> /// <summary>
/// Gets the validation errors associated with this instance of <see cref="ValidationProblemDetails"/>. /// Gets the validation errors associated with this instance of <see cref="ValidationProblemDetails"/>.
/// </summary> /// </summary>
[JsonProperty(PropertyName = "errors")]
public IDictionary<string, string[]> Errors { get; } = new Dictionary<string, string[]>(StringComparer.Ordinal); public IDictionary<string, string[]> Errors { get; } = new Dictionary<string, string[]>(StringComparer.Ordinal);
} }
} }

View File

@ -1,37 +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 Microsoft.AspNetCore.Mvc;
namespace Microsoft.Extensions.DependencyInjection
{
/// <summary>
/// Extensions methods for configuring MVC via an <see cref="IMvcBuilder"/>.
/// </summary>
public static class MvcJsonMvcBuilderExtensions
{
/// <summary>
/// Adds configuration of <see cref="MvcJsonOptions"/> for the application.
/// </summary>
/// <param name="builder">The <see cref="IMvcBuilder"/>.</param>
/// <param name="setupAction">The <see cref="MvcJsonOptions"/> which need to be configured.</param>
public static IMvcBuilder AddJsonOptions(
this IMvcBuilder builder,
Action<MvcJsonOptions> setupAction)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (setupAction == null)
{
throw new ArgumentNullException(nameof(setupAction));
}
builder.Services.Configure(setupAction);
return builder;
}
}
}

View File

@ -1,85 +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 Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Formatters.Json;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.ObjectPool;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
namespace Microsoft.Extensions.DependencyInjection
{
public static class MvcJsonMvcCoreBuilderExtensions
{
public static IMvcCoreBuilder AddJsonFormatters(this IMvcCoreBuilder builder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
AddJsonFormatterServices(builder.Services);
return builder;
}
public static IMvcCoreBuilder AddJsonFormatters(
this IMvcCoreBuilder builder,
Action<JsonSerializerSettings> setupAction)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (setupAction == null)
{
throw new ArgumentNullException(nameof(setupAction));
}
AddJsonFormatterServices(builder.Services);
builder.Services.Configure<MvcJsonOptions>((options) => setupAction(options.SerializerSettings));
return builder;
}
/// <summary>
/// Adds configuration of <see cref="MvcJsonOptions"/> for the application.
/// </summary>
/// <param name="builder">The <see cref="IMvcCoreBuilder"/>.</param>
/// <param name="setupAction">The <see cref="MvcJsonOptions"/> which need to be configured.</param>
/// <returns>The <see cref="IMvcCoreBuilder"/>.</returns>
public static IMvcCoreBuilder AddJsonOptions(
this IMvcCoreBuilder builder,
Action<MvcJsonOptions> setupAction)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (setupAction == null)
{
throw new ArgumentNullException(nameof(setupAction));
}
builder.Services.Configure(setupAction);
return builder;
}
// Internal for testing.
internal static void AddJsonFormatterServices(IServiceCollection services)
{
services.TryAddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
services.TryAddEnumerable(
ServiceDescriptor.Transient<IConfigureOptions<MvcOptions>, MvcJsonMvcOptionsSetup>());
services.TryAddEnumerable(
ServiceDescriptor.Transient<IApiDescriptionProvider, JsonPatchOperationsArrayProvider>());
services.TryAddSingleton<JsonResultExecutor>();
}
}
}

View File

@ -1,58 +0,0 @@
// <auto-generated />
namespace Microsoft.AspNetCore.Mvc.Formatters.Json
{
using System.Globalization;
using System.Reflection;
using System.Resources;
internal static class Resources
{
private static readonly ResourceManager _resourceManager
= new ResourceManager("Microsoft.AspNetCore.Mvc.Formatters.Json.Resources", typeof(Resources).GetTypeInfo().Assembly);
/// <summary>
/// {0} cannot be null.
/// </summary>
internal static string ContractResolverCannotBeNull
{
get => GetString("ContractResolverCannotBeNull");
}
/// <summary>
/// {0} cannot be null.
/// </summary>
internal static string FormatContractResolverCannotBeNull(object p0)
=> string.Format(CultureInfo.CurrentCulture, GetString("ContractResolverCannotBeNull"), p0);
/// <summary>
/// Cannot configure JSON casing behavior on '{0}' contract resolver. The supported contract resolver is {1}.
/// </summary>
internal static string InvalidContractResolverForJsonCasingConfiguration
{
get => GetString("InvalidContractResolverForJsonCasingConfiguration");
}
/// <summary>
/// Cannot configure JSON casing behavior on '{0}' contract resolver. The supported contract resolver is {1}.
/// </summary>
internal static string FormatInvalidContractResolverForJsonCasingConfiguration(object p0, object p1)
=> string.Format(CultureInfo.CurrentCulture, GetString("InvalidContractResolverForJsonCasingConfiguration"), p0, p1);
private static string GetString(string name, params string[] formatterNames)
{
var value = _resourceManager.GetString(name);
System.Diagnostics.Debug.Assert(value != null);
if (formatterNames != null)
{
for (var i = 0; i < formatterNames.Length; i++)
{
value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}");
}
}
return value;
}
}
}

View File

@ -1,910 +0,0 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Formatters.Json, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Mvc.JsonPatchExtensions",
"Visibility": "Public",
"Kind": "Class",
"Abstract": true,
"Static": true,
"Sealed": true,
"ImplementedInterfaces": [],
"Members": [
{
"Kind": "Method",
"Name": "ApplyTo<T0>",
"Parameters": [
{
"Name": "patchDoc",
"Type": "Microsoft.AspNetCore.JsonPatch.JsonPatchDocument<T0>"
},
{
"Name": "objectToApplyTo",
"Type": "T0"
},
{
"Name": "modelState",
"Type": "Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary"
}
],
"ReturnType": "System.Void",
"Static": true,
"Extension": true,
"Visibility": "Public",
"GenericParameter": [
{
"ParameterName": "T",
"ParameterPosition": 0,
"Class": true,
"BaseTypeOrInterfaces": []
}
]
},
{
"Kind": "Method",
"Name": "ApplyTo<T0>",
"Parameters": [
{
"Name": "patchDoc",
"Type": "Microsoft.AspNetCore.JsonPatch.JsonPatchDocument<T0>"
},
{
"Name": "objectToApplyTo",
"Type": "T0"
},
{
"Name": "modelState",
"Type": "Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary"
},
{
"Name": "prefix",
"Type": "System.String"
}
],
"ReturnType": "System.Void",
"Static": true,
"Extension": true,
"Visibility": "Public",
"GenericParameter": [
{
"ParameterName": "T",
"ParameterPosition": 0,
"Class": true,
"BaseTypeOrInterfaces": []
}
]
}
],
"GenericParameters": []
},
{
"Name": "Microsoft.AspNetCore.Mvc.JsonResult",
"Visibility": "Public",
"Kind": "Class",
"BaseType": "Microsoft.AspNetCore.Mvc.ActionResult",
"ImplementedInterfaces": [],
"Members": [
{
"Kind": "Method",
"Name": "ExecuteResultAsync",
"Parameters": [
{
"Name": "context",
"Type": "Microsoft.AspNetCore.Mvc.ActionContext"
}
],
"ReturnType": "System.Threading.Tasks.Task",
"Virtual": true,
"Override": true,
"ImplementedInterface": "Microsoft.AspNetCore.Mvc.IActionResult",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "get_ContentType",
"Parameters": [],
"ReturnType": "System.String",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "set_ContentType",
"Parameters": [
{
"Name": "value",
"Type": "System.String"
}
],
"ReturnType": "System.Void",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "get_SerializerSettings",
"Parameters": [],
"ReturnType": "Newtonsoft.Json.JsonSerializerSettings",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "set_SerializerSettings",
"Parameters": [
{
"Name": "value",
"Type": "Newtonsoft.Json.JsonSerializerSettings"
}
],
"ReturnType": "System.Void",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "get_StatusCode",
"Parameters": [],
"ReturnType": "System.Nullable<System.Int32>",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "set_StatusCode",
"Parameters": [
{
"Name": "value",
"Type": "System.Nullable<System.Int32>"
}
],
"ReturnType": "System.Void",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "get_Value",
"Parameters": [],
"ReturnType": "System.Object",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "set_Value",
"Parameters": [
{
"Name": "value",
"Type": "System.Object"
}
],
"ReturnType": "System.Void",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "value",
"Type": "System.Object"
}
],
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "value",
"Type": "System.Object"
},
{
"Name": "serializerSettings",
"Type": "Newtonsoft.Json.JsonSerializerSettings"
}
],
"Visibility": "Public",
"GenericParameter": []
}
],
"GenericParameters": []
},
{
"Name": "Microsoft.AspNetCore.Mvc.MvcJsonOptions",
"Visibility": "Public",
"Kind": "Class",
"ImplementedInterfaces": [
"System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.Infrastructure.ICompatibilitySwitch>"
],
"Members": [
{
"Kind": "Method",
"Name": "get_AllowInputFormatterExceptionMessages",
"Parameters": [],
"ReturnType": "System.Boolean",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "set_AllowInputFormatterExceptionMessages",
"Parameters": [
{
"Name": "value",
"Type": "System.Boolean"
}
],
"ReturnType": "System.Void",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "get_SerializerSettings",
"Parameters": [],
"ReturnType": "Newtonsoft.Json.JsonSerializerSettings",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [],
"Visibility": "Public",
"GenericParameter": []
}
],
"GenericParameters": []
},
{
"Name": "Microsoft.AspNetCore.Mvc.Formatters.JsonInputFormatter",
"Visibility": "Public",
"Kind": "Class",
"BaseType": "Microsoft.AspNetCore.Mvc.Formatters.TextInputFormatter",
"ImplementedInterfaces": [
"Microsoft.AspNetCore.Mvc.Formatters.IInputFormatterExceptionPolicy"
],
"Members": [
{
"Kind": "Method",
"Name": "get_ExceptionPolicy",
"Parameters": [],
"ReturnType": "Microsoft.AspNetCore.Mvc.Formatters.InputFormatterExceptionPolicy",
"Virtual": true,
"ImplementedInterface": "Microsoft.AspNetCore.Mvc.Formatters.IInputFormatterExceptionPolicy",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "get_SerializerSettings",
"Parameters": [],
"ReturnType": "Newtonsoft.Json.JsonSerializerSettings",
"Visibility": "Protected",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "ReadRequestBodyAsync",
"Parameters": [
{
"Name": "context",
"Type": "Microsoft.AspNetCore.Mvc.Formatters.InputFormatterContext"
},
{
"Name": "encoding",
"Type": "System.Text.Encoding"
}
],
"ReturnType": "System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.Formatters.InputFormatterResult>",
"Virtual": true,
"Override": true,
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "CreateJsonSerializer",
"Parameters": [],
"ReturnType": "Newtonsoft.Json.JsonSerializer",
"Virtual": true,
"Visibility": "Protected",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "ReleaseJsonSerializer",
"Parameters": [
{
"Name": "serializer",
"Type": "Newtonsoft.Json.JsonSerializer"
}
],
"ReturnType": "System.Void",
"Virtual": true,
"Visibility": "Protected",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "logger",
"Type": "Microsoft.Extensions.Logging.ILogger"
},
{
"Name": "serializerSettings",
"Type": "Newtonsoft.Json.JsonSerializerSettings"
},
{
"Name": "charPool",
"Type": "System.Buffers.ArrayPool<System.Char>"
},
{
"Name": "objectPoolProvider",
"Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider"
}
],
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "logger",
"Type": "Microsoft.Extensions.Logging.ILogger"
},
{
"Name": "serializerSettings",
"Type": "Newtonsoft.Json.JsonSerializerSettings"
},
{
"Name": "charPool",
"Type": "System.Buffers.ArrayPool<System.Char>"
},
{
"Name": "objectPoolProvider",
"Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider"
},
{
"Name": "suppressInputFormatterBuffering",
"Type": "System.Boolean"
}
],
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "logger",
"Type": "Microsoft.Extensions.Logging.ILogger"
},
{
"Name": "serializerSettings",
"Type": "Newtonsoft.Json.JsonSerializerSettings"
},
{
"Name": "charPool",
"Type": "System.Buffers.ArrayPool<System.Char>"
},
{
"Name": "objectPoolProvider",
"Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider"
},
{
"Name": "suppressInputFormatterBuffering",
"Type": "System.Boolean"
},
{
"Name": "allowInputFormatterExceptionMessages",
"Type": "System.Boolean"
}
],
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "logger",
"Type": "Microsoft.Extensions.Logging.ILogger"
},
{
"Name": "serializerSettings",
"Type": "Newtonsoft.Json.JsonSerializerSettings"
},
{
"Name": "charPool",
"Type": "System.Buffers.ArrayPool<System.Char>"
},
{
"Name": "objectPoolProvider",
"Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider"
},
{
"Name": "options",
"Type": "Microsoft.AspNetCore.Mvc.MvcOptions"
},
{
"Name": "jsonOptions",
"Type": "Microsoft.AspNetCore.Mvc.MvcJsonOptions"
}
],
"Visibility": "Public",
"GenericParameter": []
}
],
"GenericParameters": []
},
{
"Name": "Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter",
"Visibility": "Public",
"Kind": "Class",
"BaseType": "Microsoft.AspNetCore.Mvc.Formatters.TextOutputFormatter",
"ImplementedInterfaces": [],
"Members": [
{
"Kind": "Method",
"Name": "get_SerializerSettings",
"Parameters": [],
"ReturnType": "Newtonsoft.Json.JsonSerializerSettings",
"Visibility": "Protected",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "get_PublicSerializerSettings",
"Parameters": [],
"ReturnType": "Newtonsoft.Json.JsonSerializerSettings",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "WriteObject",
"Parameters": [
{
"Name": "writer",
"Type": "System.IO.TextWriter"
},
{
"Name": "value",
"Type": "System.Object"
}
],
"ReturnType": "System.Void",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "CreateJsonWriter",
"Parameters": [
{
"Name": "writer",
"Type": "System.IO.TextWriter"
}
],
"ReturnType": "Newtonsoft.Json.JsonWriter",
"Virtual": true,
"Visibility": "Protected",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "CreateJsonSerializer",
"Parameters": [],
"ReturnType": "Newtonsoft.Json.JsonSerializer",
"Virtual": true,
"Visibility": "Protected",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "WriteResponseBodyAsync",
"Parameters": [
{
"Name": "context",
"Type": "Microsoft.AspNetCore.Mvc.Formatters.OutputFormatterWriteContext"
},
{
"Name": "selectedEncoding",
"Type": "System.Text.Encoding"
}
],
"ReturnType": "System.Threading.Tasks.Task",
"Virtual": true,
"Override": true,
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "serializerSettings",
"Type": "Newtonsoft.Json.JsonSerializerSettings"
},
{
"Name": "charPool",
"Type": "System.Buffers.ArrayPool<System.Char>"
}
],
"Visibility": "Public",
"GenericParameter": []
}
],
"GenericParameters": []
},
{
"Name": "Microsoft.AspNetCore.Mvc.Formatters.JsonPatchInputFormatter",
"Visibility": "Public",
"Kind": "Class",
"BaseType": "Microsoft.AspNetCore.Mvc.Formatters.JsonInputFormatter",
"ImplementedInterfaces": [],
"Members": [
{
"Kind": "Method",
"Name": "CanRead",
"Parameters": [
{
"Name": "context",
"Type": "Microsoft.AspNetCore.Mvc.Formatters.InputFormatterContext"
}
],
"ReturnType": "System.Boolean",
"Virtual": true,
"Override": true,
"ImplementedInterface": "Microsoft.AspNetCore.Mvc.Formatters.IInputFormatter",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "get_ExceptionPolicy",
"Parameters": [],
"ReturnType": "Microsoft.AspNetCore.Mvc.Formatters.InputFormatterExceptionPolicy",
"Virtual": true,
"Override": true,
"ImplementedInterface": "Microsoft.AspNetCore.Mvc.Formatters.IInputFormatterExceptionPolicy",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "ReadRequestBodyAsync",
"Parameters": [
{
"Name": "context",
"Type": "Microsoft.AspNetCore.Mvc.Formatters.InputFormatterContext"
},
{
"Name": "encoding",
"Type": "System.Text.Encoding"
}
],
"ReturnType": "System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.Formatters.InputFormatterResult>",
"Virtual": true,
"Override": true,
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "logger",
"Type": "Microsoft.Extensions.Logging.ILogger"
},
{
"Name": "serializerSettings",
"Type": "Newtonsoft.Json.JsonSerializerSettings"
},
{
"Name": "charPool",
"Type": "System.Buffers.ArrayPool<System.Char>"
},
{
"Name": "objectPoolProvider",
"Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider"
}
],
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "logger",
"Type": "Microsoft.Extensions.Logging.ILogger"
},
{
"Name": "serializerSettings",
"Type": "Newtonsoft.Json.JsonSerializerSettings"
},
{
"Name": "charPool",
"Type": "System.Buffers.ArrayPool<System.Char>"
},
{
"Name": "objectPoolProvider",
"Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider"
},
{
"Name": "suppressInputFormatterBuffering",
"Type": "System.Boolean"
}
],
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "logger",
"Type": "Microsoft.Extensions.Logging.ILogger"
},
{
"Name": "serializerSettings",
"Type": "Newtonsoft.Json.JsonSerializerSettings"
},
{
"Name": "charPool",
"Type": "System.Buffers.ArrayPool<System.Char>"
},
{
"Name": "objectPoolProvider",
"Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider"
},
{
"Name": "suppressInputFormatterBuffering",
"Type": "System.Boolean"
},
{
"Name": "allowInputFormatterExceptionMessages",
"Type": "System.Boolean"
}
],
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "logger",
"Type": "Microsoft.Extensions.Logging.ILogger"
},
{
"Name": "serializerSettings",
"Type": "Newtonsoft.Json.JsonSerializerSettings"
},
{
"Name": "charPool",
"Type": "System.Buffers.ArrayPool<System.Char>"
},
{
"Name": "objectPoolProvider",
"Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider"
},
{
"Name": "options",
"Type": "Microsoft.AspNetCore.Mvc.MvcOptions"
},
{
"Name": "jsonOptions",
"Type": "Microsoft.AspNetCore.Mvc.MvcJsonOptions"
}
],
"Visibility": "Public",
"GenericParameter": []
}
],
"GenericParameters": []
},
{
"Name": "Microsoft.AspNetCore.Mvc.Formatters.JsonSerializerSettingsProvider",
"Visibility": "Public",
"Kind": "Class",
"Abstract": true,
"Static": true,
"Sealed": true,
"ImplementedInterfaces": [],
"Members": [
{
"Kind": "Method",
"Name": "CreateSerializerSettings",
"Parameters": [],
"ReturnType": "Newtonsoft.Json.JsonSerializerSettings",
"Static": true,
"Visibility": "Public",
"GenericParameter": []
}
],
"GenericParameters": []
},
{
"Name": "Microsoft.AspNetCore.Mvc.Formatters.Json.JsonPatchOperationsArrayProvider",
"Visibility": "Public",
"Kind": "Class",
"ImplementedInterfaces": [
"Microsoft.AspNetCore.Mvc.ApiExplorer.IApiDescriptionProvider"
],
"Members": [
{
"Kind": "Method",
"Name": "get_Order",
"Parameters": [],
"ReturnType": "System.Int32",
"Sealed": true,
"Virtual": true,
"ImplementedInterface": "Microsoft.AspNetCore.Mvc.ApiExplorer.IApiDescriptionProvider",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "OnProvidersExecuting",
"Parameters": [
{
"Name": "context",
"Type": "Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescriptionProviderContext"
}
],
"ReturnType": "System.Void",
"Sealed": true,
"Virtual": true,
"ImplementedInterface": "Microsoft.AspNetCore.Mvc.ApiExplorer.IApiDescriptionProvider",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "OnProvidersExecuted",
"Parameters": [
{
"Name": "context",
"Type": "Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescriptionProviderContext"
}
],
"ReturnType": "System.Void",
"Sealed": true,
"Virtual": true,
"ImplementedInterface": "Microsoft.AspNetCore.Mvc.ApiExplorer.IApiDescriptionProvider",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Constructor",
"Name": ".ctor",
"Parameters": [
{
"Name": "modelMetadataProvider",
"Type": "Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider"
}
],
"Visibility": "Public",
"GenericParameter": []
}
],
"GenericParameters": []
},
{
"Name": "Microsoft.Extensions.DependencyInjection.MvcJsonMvcBuilderExtensions",
"Visibility": "Public",
"Kind": "Class",
"Abstract": true,
"Static": true,
"Sealed": true,
"ImplementedInterfaces": [],
"Members": [
{
"Kind": "Method",
"Name": "AddJsonOptions",
"Parameters": [
{
"Name": "builder",
"Type": "Microsoft.Extensions.DependencyInjection.IMvcBuilder"
},
{
"Name": "setupAction",
"Type": "System.Action<Microsoft.AspNetCore.Mvc.MvcJsonOptions>"
}
],
"ReturnType": "Microsoft.Extensions.DependencyInjection.IMvcBuilder",
"Static": true,
"Extension": true,
"Visibility": "Public",
"GenericParameter": []
}
],
"GenericParameters": []
},
{
"Name": "Microsoft.Extensions.DependencyInjection.MvcJsonMvcCoreBuilderExtensions",
"Visibility": "Public",
"Kind": "Class",
"Abstract": true,
"Static": true,
"Sealed": true,
"ImplementedInterfaces": [],
"Members": [
{
"Kind": "Method",
"Name": "AddJsonFormatters",
"Parameters": [
{
"Name": "builder",
"Type": "Microsoft.Extensions.DependencyInjection.IMvcCoreBuilder"
}
],
"ReturnType": "Microsoft.Extensions.DependencyInjection.IMvcCoreBuilder",
"Static": true,
"Extension": true,
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "AddJsonFormatters",
"Parameters": [
{
"Name": "builder",
"Type": "Microsoft.Extensions.DependencyInjection.IMvcCoreBuilder"
},
{
"Name": "setupAction",
"Type": "System.Action<Newtonsoft.Json.JsonSerializerSettings>"
}
],
"ReturnType": "Microsoft.Extensions.DependencyInjection.IMvcCoreBuilder",
"Static": true,
"Extension": true,
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "AddJsonOptions",
"Parameters": [
{
"Name": "builder",
"Type": "Microsoft.Extensions.DependencyInjection.IMvcCoreBuilder"
},
{
"Name": "setupAction",
"Type": "System.Action<Microsoft.AspNetCore.Mvc.MvcJsonOptions>"
}
],
"ReturnType": "Microsoft.Extensions.DependencyInjection.IMvcCoreBuilder",
"Static": true,
"Extension": true,
"Visibility": "Public",
"GenericParameter": []
}
],
"GenericParameters": []
}
]
}

View File

@ -0,0 +1,63 @@
// 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 Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{
internal class AnnotatedProblemDetails
{
/// <remarks>
/// Required for JSON.NET deserialization.
/// </remarks>
public AnnotatedProblemDetails() { }
public AnnotatedProblemDetails(ProblemDetails problemDetails)
{
Detail = problemDetails.Detail;
Instance = problemDetails.Instance;
Status = problemDetails.Status;
Title = problemDetails.Title;
Type = problemDetails.Type;
foreach (var kvp in problemDetails.Extensions)
{
Extensions[kvp.Key] = kvp.Value;
}
}
[JsonProperty(PropertyName = "type", NullValueHandling = NullValueHandling.Ignore)]
public string Type { get; set; }
[JsonProperty(PropertyName = "title", NullValueHandling = NullValueHandling.Ignore)]
public string Title { get; set; }
[JsonProperty(PropertyName = "status", NullValueHandling = NullValueHandling.Ignore)]
public int? Status { get; set; }
[JsonProperty(PropertyName = "detail", NullValueHandling = NullValueHandling.Ignore)]
public string Detail { get; set; }
[JsonProperty(PropertyName = "instance", NullValueHandling = NullValueHandling.Ignore)]
public string Instance { get; set; }
[JsonExtensionData]
public IDictionary<string, object> Extensions { get; } = new Dictionary<string, object>(StringComparer.Ordinal);
public void CopyTo(ProblemDetails problemDetails)
{
problemDetails.Type = Type;
problemDetails.Title = Title;
problemDetails.Status = Status;
problemDetails.Instance = Instance;
problemDetails.Detail = Detail;
foreach (var kvp in Extensions)
{
problemDetails.Extensions[kvp.Key] = kvp.Value;
}
}
}
}

View File

@ -8,22 +8,22 @@ using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
using Microsoft.Extensions.Internal; using Microsoft.Extensions.Internal;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Bson; using Newtonsoft.Json.Bson;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
internal class TempDataSerializer internal class BsonTempDataSerializer : TempDataSerializer
{ {
private readonly JsonSerializer _jsonSerializer = private readonly JsonSerializer _jsonSerializer =
JsonSerializer.Create(JsonSerializerSettingsProvider.CreateSerializerSettings()); JsonSerializer.Create(JsonSerializerSettingsProvider.CreateSerializerSettings());
private static readonly MethodInfo _convertArrayMethodInfo = typeof(TempDataSerializer).GetMethod( private static readonly MethodInfo _convertArrayMethodInfo = typeof(BsonTempDataSerializer).GetMethod(
nameof(ConvertArray), BindingFlags.Static | BindingFlags.NonPublic); nameof(ConvertArray), BindingFlags.Static | BindingFlags.NonPublic);
private static readonly MethodInfo _convertDictionaryMethodInfo = typeof(TempDataSerializer).GetMethod( private static readonly MethodInfo _convertDictionaryMethodInfo = typeof(BsonTempDataSerializer).GetMethod(
nameof(ConvertDictionary), BindingFlags.Static | BindingFlags.NonPublic); nameof(ConvertDictionary), BindingFlags.Static | BindingFlags.NonPublic);
private static readonly ConcurrentDictionary<Type, Func<JArray, object>> _arrayConverters = private static readonly ConcurrentDictionary<Type, Func<JArray, object>> _arrayConverters =
@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
{ JTokenType.Uri, typeof(Uri) }, { JTokenType.Uri, typeof(Uri) },
}; };
public IDictionary<string, object> Deserialize(byte[] value) public override IDictionary<string, object> Deserialize(byte[] value)
{ {
Dictionary<string, object> tempDataDictionary; Dictionary<string, object> tempDataDictionary;
@ -124,7 +124,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
return convertedDictionary; return convertedDictionary;
} }
public byte[] Serialize(IDictionary<string, object> values) public override byte[] Serialize(IDictionary<string, object> values)
{ {
var hasValues = (values != null && values.Count > 0); var hasValues = (values != null && values.Count > 0);
if (hasValues) if (hasValues)
@ -165,7 +165,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
} }
} }
public static bool CanSerializeType(Type typeToSerialize, out string errorMessage) private static bool CanSerializeType(Type typeToSerialize, out string errorMessage)
{ {
typeToSerialize = typeToSerialize ?? throw new ArgumentNullException(nameof(typeToSerialize)); typeToSerialize = typeToSerialize ?? throw new ArgumentNullException(nameof(typeToSerialize));
@ -195,7 +195,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
if (genericTypeArguments[0] != typeof(string)) if (genericTypeArguments[0] != typeof(string))
{ {
errorMessage = Resources.FormatTempData_CannotSerializeDictionary( errorMessage = Resources.FormatTempData_CannotSerializeDictionary(
typeof(TempDataSerializer).FullName, typeof(BsonTempDataSerializer).FullName,
genericTypeArguments[0], genericTypeArguments[0],
typeof(string).FullName); typeof(string).FullName);
return false; return false;
@ -211,7 +211,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
if (!IsSimpleType(actualType)) if (!IsSimpleType(actualType))
{ {
errorMessage = Resources.FormatTempData_CannotSerializeType( errorMessage = Resources.FormatTempData_CannotSerializeType(
typeof(TempDataSerializer).FullName, typeof(BsonTempDataSerializer).FullName,
actualType); actualType);
return false; return false;
} }

View File

@ -3,13 +3,13 @@
using System; using System;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Formatters.Json; using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
namespace Microsoft.Extensions.DependencyInjection namespace Microsoft.Extensions.DependencyInjection
{ {
public static class MvcJsonOptionsExtensions public static class MvcNewtonsoftJsonOptionsExtensions
{ {
/// <summary> /// <summary>
/// Configures the casing behavior of JSON serialization to use camel case for property names, /// Configures the casing behavior of JSON serialization to use camel case for property names,
@ -18,10 +18,10 @@ namespace Microsoft.Extensions.DependencyInjection
/// <remarks> /// <remarks>
/// This method modifies <see cref="JsonSerializerSettings.ContractResolver"/>. /// This method modifies <see cref="JsonSerializerSettings.ContractResolver"/>.
/// </remarks> /// </remarks>
/// <param name="options"><see cref="MvcJsonOptions"/></param> /// <param name="options"><see cref="MvcNewtonsoftJsonOptions"/></param>
/// <param name="processDictionaryKeys">If true will camel case dictionary keys and properties of dynamic objects.</param> /// <param name="processDictionaryKeys">If true will camel case dictionary keys and properties of dynamic objects.</param>
/// <returns><see cref="MvcJsonOptions"/> with camel case settings.</returns> /// <returns><see cref="MvcNewtonsoftJsonOptions"/> with camel case settings.</returns>
public static MvcJsonOptions UseCamelCasing(this MvcJsonOptions options, bool processDictionaryKeys) public static MvcNewtonsoftJsonOptions UseCamelCasing(this MvcNewtonsoftJsonOptions options, bool processDictionaryKeys)
{ {
if (options == null) if (options == null)
{ {
@ -57,9 +57,9 @@ namespace Microsoft.Extensions.DependencyInjection
/// <remarks> /// <remarks>
/// This method modifies <see cref="JsonSerializerSettings.ContractResolver"/>. /// This method modifies <see cref="JsonSerializerSettings.ContractResolver"/>.
/// </remarks> /// </remarks>
/// <param name="options"><see cref="MvcJsonOptions"/></param> /// <param name="options"><see cref="MvcNewtonsoftJsonOptions"/></param>
/// <returns><see cref="MvcJsonOptions"/> with member casing settings.</returns> /// <returns><see cref="MvcNewtonsoftJsonOptions"/> with member casing settings.</returns>
public static MvcJsonOptions UseMemberCasing(this MvcJsonOptions options) public static MvcNewtonsoftJsonOptions UseMemberCasing(this MvcNewtonsoftJsonOptions options)
{ {
if (options == null) if (options == null)
{ {

View File

@ -5,28 +5,29 @@ using System;
using System.Buffers; using System.Buffers;
using Microsoft.AspNetCore.JsonPatch; using Microsoft.AspNetCore.JsonPatch;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.ObjectPool;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Microsoft.AspNetCore.Mvc.Formatters;
namespace Microsoft.Extensions.DependencyInjection namespace Microsoft.Extensions.DependencyInjection
{ {
/// <summary> /// <summary>
/// Sets up JSON formatter options for <see cref="MvcOptions"/>. /// Sets up JSON formatter options for <see cref="MvcOptions"/>.
/// </summary> /// </summary>
internal class MvcJsonMvcOptionsSetup : IConfigureOptions<MvcOptions> internal class NewtonosftJsonMvcOptionsSetup : IConfigureOptions<MvcOptions>
{ {
private readonly ILoggerFactory _loggerFactory; private readonly ILoggerFactory _loggerFactory;
private readonly MvcJsonOptions _jsonOptions; private readonly MvcNewtonsoftJsonOptions _jsonOptions;
private readonly ArrayPool<char> _charPool; private readonly ArrayPool<char> _charPool;
private readonly ObjectPoolProvider _objectPoolProvider; private readonly ObjectPoolProvider _objectPoolProvider;
public MvcJsonMvcOptionsSetup( public NewtonosftJsonMvcOptionsSetup(
ILoggerFactory loggerFactory, ILoggerFactory loggerFactory,
IOptions<MvcJsonOptions> jsonOptions, IOptions<MvcNewtonsoftJsonOptions> jsonOptions,
ArrayPool<char> charPool, ArrayPool<char> charPool,
ObjectPoolProvider objectPoolProvider) ObjectPoolProvider objectPoolProvider)
{ {
@ -58,13 +59,13 @@ namespace Microsoft.Extensions.DependencyInjection
public void Configure(MvcOptions options) public void Configure(MvcOptions options)
{ {
options.OutputFormatters.Add(new JsonOutputFormatter(_jsonOptions.SerializerSettings, _charPool)); options.OutputFormatters.Add(new NewtonsoftJsonOutputFormatter(_jsonOptions.SerializerSettings, _charPool));
// Register JsonPatchInputFormatter before JsonInputFormatter, otherwise // Register JsonPatchInputFormatter before JsonInputFormatter, otherwise
// JsonInputFormatter would consume "application/json-patch+json" requests // JsonInputFormatter would consume "application/json-patch+json" requests
// before JsonPatchInputFormatter gets to see them. // before JsonPatchInputFormatter gets to see them.
var jsonInputPatchLogger = _loggerFactory.CreateLogger<JsonPatchInputFormatter>(); var jsonInputPatchLogger = _loggerFactory.CreateLogger<NewtonsoftJsonPatchInputFormatter>();
options.InputFormatters.Add(new JsonPatchInputFormatter( options.InputFormatters.Add(new NewtonsoftJsonPatchInputFormatter(
jsonInputPatchLogger, jsonInputPatchLogger,
_jsonOptions.SerializerSettings, _jsonOptions.SerializerSettings,
_charPool, _charPool,
@ -72,8 +73,8 @@ namespace Microsoft.Extensions.DependencyInjection
options, options,
_jsonOptions)); _jsonOptions));
var jsonInputLogger = _loggerFactory.CreateLogger<JsonInputFormatter>(); var jsonInputLogger = _loggerFactory.CreateLogger<NewtonsoftJsonInputFormatter>();
options.InputFormatters.Add(new JsonInputFormatter( options.InputFormatters.Add(new NewtonsoftJsonInputFormatter(
jsonInputLogger, jsonInputLogger,
_jsonOptions.SerializerSettings, _jsonOptions.SerializerSettings,
_charPool, _charPool,

View File

@ -0,0 +1,56 @@
// 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 Microsoft.AspNetCore.Mvc;
namespace Microsoft.Extensions.DependencyInjection
{
/// <summary>
/// Extensions methods for configuring MVC via an <see cref="IMvcBuilder"/>.
/// </summary>
public static class NewtonsoftJsonMvcBuilderExtensions
{
/// <summary>
/// Configures Newtonsoft.Json specific features such as input and output formatters.
/// </summary>
/// <param name="builder">The <see cref="IMvcBuilder"/>.</param>
/// <returns>The <see cref="IMvcBuilder"/>.</returns>
public static IMvcBuilder AddNewtonsoftJson(this IMvcBuilder builder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
NewtonsoftJsonMvcCoreBuilderExtensions.AddServicesCore(builder.Services);
return builder;
}
/// <summary>
/// Configures Newtonsoft.Json specific features such as input and output formatters.
/// </summary>
/// <param name="builder">The <see cref="IMvcBuilder"/>.</param>
/// <param name="setupAction">Callback to configure <see cref="MvcNewtonsoftJsonOptions"/>.</param>
/// <returns>The <see cref="IMvcBuilder"/>.</returns>
public static IMvcBuilder AddNewtonsoftJson(
this IMvcBuilder builder,
Action<MvcNewtonsoftJsonOptions> setupAction)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (setupAction == null)
{
throw new ArgumentNullException(nameof(setupAction));
}
NewtonsoftJsonMvcCoreBuilderExtensions.AddServicesCore(builder.Services);
builder.Services.Configure(setupAction);
return builder;
}
}
}

View File

@ -0,0 +1,110 @@
// 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.Buffers;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.ObjectPool;
using Microsoft.Extensions.Options;
namespace Microsoft.Extensions.DependencyInjection
{
public static class NewtonsoftJsonMvcCoreBuilderExtensions
{
/// <summary>
/// Configures Newtonsoft.Json specific features such as input and output formatters.
/// </summary>
/// <param name="builder">The <see cref="IMvcCoreBuilder"/>.</param>
/// <returns>The <see cref="IMvcCoreBuilder"/>.</returns>
public static IMvcCoreBuilder AddNewtonsoftJson(this IMvcCoreBuilder builder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
AddServicesCore(builder.Services);
return builder;
}
/// <summary>
/// Configures Newtonsoft.Json specific features such as input and output formatters.
/// </summary>
/// <param name="builder">The <see cref="IMvcCoreBuilder"/>.</param>
/// <param name="setupAction">Callback to configure <see cref="MvcNewtonsoftJsonOptions"/>.</param>
/// <returns>The <see cref="IMvcCoreBuilder"/>.</returns>
public static IMvcCoreBuilder AddNewtonsoftJson(
this IMvcCoreBuilder builder,
Action<MvcNewtonsoftJsonOptions> setupAction)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (setupAction == null)
{
throw new ArgumentNullException(nameof(setupAction));
}
AddServicesCore(builder.Services);
builder.Services.Configure(setupAction);
return builder;
}
// Internal for testing.
internal static void AddServicesCore(IServiceCollection services)
{
services.TryAddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
services.TryAddEnumerable(
ServiceDescriptor.Transient<IConfigureOptions<MvcOptions>, NewtonosftJsonMvcOptionsSetup>());
services.TryAddEnumerable(
ServiceDescriptor.Transient<IApiDescriptionProvider, JsonPatchOperationsArrayProvider>());
services.TryAddSingleton<IActionResultExecutor<JsonResult>, JsonResultExecutor>();
var viewFeaturesAssembly = typeof(IHtmlHelper).Assembly;
var tempDataSerializer = services.FirstOrDefault(f =>
f.ServiceType == typeof(TempDataSerializer) &&
f.ImplementationType?.Assembly == viewFeaturesAssembly &&
f.ImplementationType.FullName == "Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure.DefaultTempDataSerializer");
if (tempDataSerializer != null)
{
// Replace the default implementation of TempDataSerializer
services.Remove(tempDataSerializer);
}
services.TryAddSingleton<TempDataSerializer, BsonTempDataSerializer>();
//
// JSON Helper
//
var jsonHelper = services.FirstOrDefault(
f => f.ServiceType == typeof(IJsonHelper) &&
f.ImplementationType?.Assembly == viewFeaturesAssembly &&
f.ImplementationType.FullName == "Microsoft.AspNetCore.Mvc.Rendering.DefaultJsonHelper");
if (jsonHelper != null)
{
services.Remove(jsonHelper);
}
services.TryAddSingleton<IJsonHelper, NewtonsoftJsonHelper>();
services.TryAdd(ServiceDescriptor.Singleton(serviceProvider =>
{
var options = serviceProvider.GetRequiredService<IOptions<MvcNewtonsoftJsonOptions>>().Value;
var charPool = serviceProvider.GetRequiredService<ArrayPool<char>>();
return new NewtonsoftJsonOutputFormatter(options.SerializerSettings, charPool);
}));
}
}
}

View File

@ -5,7 +5,7 @@ using System;
using System.Buffers; using System.Buffers;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc.Formatters namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
internal class JsonArrayPool<T> : IArrayPool<T> internal class JsonArrayPool<T> : IArrayPool<T>
{ {

View File

@ -0,0 +1,60 @@
// 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 Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc.Rendering
{
/// <summary>
/// Newtonsoft.Json specific extensions to <see cref="IJsonHelper"/>.
/// </summary>
public static class JsonHelperExtensions
{
/// <summary>
/// Returns serialized JSON for the <paramref name="value"/>.
/// </summary>
/// <param name="jsonHelper">The <see cref="IJsonHelper"/>.</param>
/// <param name="value">The value to serialize as JSON.</param>
/// <param name="serializerSettings">
/// The <see cref="JsonSerializerSettings"/> to be used by the serializer.
/// </param>
/// <returns>A new <see cref="IHtmlContent"/> containing the serialized JSON.</returns>
public static IHtmlContent Serialize(
this IJsonHelper jsonHelper,
object value,
JsonSerializerSettings serializerSettings)
{
if (jsonHelper == null)
{
throw new ArgumentNullException(nameof(jsonHelper));
}
if (!(jsonHelper is NewtonsoftJsonHelper newtonsoftJsonHelper))
{
var message = Resources.FormatJsonHelperMustBeAnInstanceOfNewtonsoftJson(
nameof(jsonHelper),
nameof(IJsonHelper),
typeof(JsonHelperExtensions).Assembly.GetName().Name,
nameof(NewtonsoftJsonMvcBuilderExtensions.AddNewtonsoftJson));
throw new ArgumentException(message, nameof(jsonHelper));
}
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
if (serializerSettings == null)
{
throw new ArgumentNullException(nameof(serializerSettings));
}
return newtonsoftJsonHelper.Serialize(value, serializerSettings);
}
}
}

View File

@ -8,19 +8,19 @@ using Microsoft.AspNetCore.JsonPatch.Operations;
using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace Microsoft.AspNetCore.Mvc.Formatters.Json namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
/// <summary> /// <summary>
/// Implements a provider of <see cref="ApiDescription"/> to change parameters of /// Implements a provider of <see cref="ApiDescription"/> to change parameters of
/// type <see cref="IJsonPatchDocument"/> to an array of <see cref="Operation"/>. /// type <see cref="IJsonPatchDocument"/> to an array of <see cref="Operation"/>.
/// </summary> /// </summary>
public class JsonPatchOperationsArrayProvider : IApiDescriptionProvider internal sealed class JsonPatchOperationsArrayProvider : IApiDescriptionProvider
{ {
private readonly IModelMetadataProvider _modelMetadataProvider; private readonly IModelMetadataProvider _modelMetadataProvider;
/// <summary> /// <summary>
/// Creates a new instance of <see cref="JsonPatchOperationsArrayProvider"/>. /// Creates a new instance of <see cref="JsonPatchOperationsArrayProvider"/>.
/// </summary> /// </summary>
/// <param name="modelMetadataProvider">The <see cref="IModelMetadataProvider"/>.</param> /// <param name="modelMetadataProvider">The <see cref="IModelMetadataProvider"/>.</param>
public JsonPatchOperationsArrayProvider(IModelMetadataProvider modelMetadataProvider) public JsonPatchOperationsArrayProvider(IModelMetadataProvider modelMetadataProvider)
{ {

View File

@ -5,18 +5,19 @@ using System;
using System.Buffers; using System.Buffers;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc.Formatters namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
/// <summary> /// <summary>
/// Executes a <see cref="JsonResult"/> to write to the response. /// Executes a <see cref="JsonResult"/> to write to the response.
/// </summary> /// </summary>
internal class JsonResultExecutor internal class JsonResultExecutor : IActionResultExecutor<JsonResult>
{ {
private static readonly string DefaultContentType = new MediaTypeHeaderValue("application/json") private static readonly string DefaultContentType = new MediaTypeHeaderValue("application/json")
{ {
@ -25,7 +26,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
private readonly IHttpResponseStreamWriterFactory _writerFactory; private readonly IHttpResponseStreamWriterFactory _writerFactory;
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly MvcJsonOptions _options; private readonly MvcNewtonsoftJsonOptions _options;
private readonly IArrayPool<char> _charPool; private readonly IArrayPool<char> _charPool;
/// <summary> /// <summary>
@ -38,7 +39,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
public JsonResultExecutor( public JsonResultExecutor(
IHttpResponseStreamWriterFactory writerFactory, IHttpResponseStreamWriterFactory writerFactory,
ILogger<JsonResultExecutor> logger, ILogger<JsonResultExecutor> logger,
IOptions<MvcJsonOptions> options, IOptions<MvcNewtonsoftJsonOptions> options,
ArrayPool<char> charPool) ArrayPool<char> charPool)
{ {
if (writerFactory == null) if (writerFactory == null)
@ -85,6 +86,8 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
throw new ArgumentNullException(nameof(result)); throw new ArgumentNullException(nameof(result));
} }
var jsonSerializerSettings = GetSerializerSettings(result);
var response = context.HttpContext.Response; var response = context.HttpContext.Response;
ResponseContentTypeHelper.ResolveContentTypeAndEncoding( ResponseContentTypeHelper.ResolveContentTypeAndEncoding(
@ -101,8 +104,6 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
response.StatusCode = result.StatusCode.Value; response.StatusCode = result.StatusCode.Value;
} }
var serializerSettings = result.SerializerSettings ?? _options.SerializerSettings;
_logger.JsonResultExecuting(result.Value); _logger.JsonResultExecuting(result.Value);
using (var writer = _writerFactory.CreateWriter(response.Body, resolvedContentTypeEncoding)) using (var writer = _writerFactory.CreateWriter(response.Body, resolvedContentTypeEncoding))
{ {
@ -112,7 +113,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
jsonWriter.CloseOutput = false; jsonWriter.CloseOutput = false;
jsonWriter.AutoCompleteOnClose = false; jsonWriter.AutoCompleteOnClose = false;
var jsonSerializer = JsonSerializer.Create(serializerSettings); var jsonSerializer = JsonSerializer.Create(jsonSerializerSettings);
jsonSerializer.Serialize(jsonWriter, result.Value); jsonSerializer.Serialize(jsonWriter, result.Value);
} }
@ -121,5 +122,26 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
await writer.FlushAsync(); await writer.FlushAsync();
} }
} }
private JsonSerializerSettings GetSerializerSettings(JsonResult result)
{
var serializerSettings = result.SerializerSettings;
if (serializerSettings == null)
{
return _options.SerializerSettings;
}
else
{
if (!(serializerSettings is JsonSerializerSettings settingsFromResult))
{
throw new InvalidOperationException(Resources.FormatProperty_MustBeInstanceOfType(
nameof(JsonResult),
nameof(JsonResult.SerializerSettings),
typeof(JsonSerializerSettings)));
}
return settingsFromResult;
}
}
} }
} }

View File

@ -4,7 +4,7 @@
using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.ObjectPool;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc.Formatters namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
/// <summary> /// <summary>
/// <see cref="IPooledObjectPolicy{T}"/> for <see cref="JsonSerializer"/>. /// <see cref="IPooledObjectPolicy{T}"/> for <see cref="JsonSerializer"/>.

View File

@ -4,7 +4,7 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
namespace Microsoft.AspNetCore.Mvc.Formatters namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
/// <summary> /// <summary>
/// Helper class which provides <see cref="JsonSerializerSettings"/>. /// Helper class which provides <see cref="JsonSerializerSettings"/>.
@ -12,6 +12,8 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
public static class JsonSerializerSettingsProvider public static class JsonSerializerSettingsProvider
{ {
private const int DefaultMaxDepth = 32; private const int DefaultMaxDepth = 32;
private static readonly ProblemDetailsConverter ProblemDetailsConverter = new ProblemDetailsConverter();
private static readonly ValidationProblemDetailsConverter ValidationProblemDetailsConverter = new ValidationProblemDetailsConverter();
// return shared resolver by default for perf so slow reflection logic is cached once // return shared resolver by default for perf so slow reflection logic is cached once
// developers can set their own resolver after the settings are returned if desired // developers can set their own resolver after the settings are returned if desired
@ -41,6 +43,12 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
// Do not change this setting // Do not change this setting
// Setting this to None prevents Json.NET from loading malicious, unsafe, or security-sensitive types // Setting this to None prevents Json.NET from loading malicious, unsafe, or security-sensitive types
TypeNameHandling = TypeNameHandling.None, TypeNameHandling = TypeNameHandling.None,
Converters =
{
ValidationProblemDetailsConverter,
ProblemDetailsConverter,
}
}; };
} }

View File

@ -3,7 +3,7 @@
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Mvc.Formatters namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
internal static class MediaTypeHeaderValues internal static class MediaTypeHeaderValues
{ {

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<Description>ASP.NET Core MVC formatters for JSON input and output and for JSON PATCH input using Json.NET.</Description> <Description>ASP.NET Core MVC features that use Newtonsoft.Json. Includes input and output formatters for JSON and JSON PATCH.</Description>
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
<NoWarn>$(NoWarn);CS1591</NoWarn> <NoWarn>$(NoWarn);CS1591</NoWarn>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
@ -13,8 +13,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.AspNetCore.Mvc.Core" /> <Reference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" />
<Reference Include="Microsoft.AspNetCore.JsonPatch" /> <Reference Include="Microsoft.AspNetCore.JsonPatch" />
<Reference Include="Newtonsoft.Json" />
<Reference Include="Newtonsoft.Json.Bson" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\Microsoft.AspNetCore.Mvc.Core\Formatters\ResponseContentTypeHelper.cs" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -7,6 +7,7 @@ using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc namespace Microsoft.AspNetCore.Mvc
@ -14,13 +15,13 @@ namespace Microsoft.AspNetCore.Mvc
/// <summary> /// <summary>
/// Provides programmatic configuration for JSON in the MVC framework. /// Provides programmatic configuration for JSON in the MVC framework.
/// </summary> /// </summary>
public class MvcJsonOptions : IEnumerable<ICompatibilitySwitch> public class MvcNewtonsoftJsonOptions : IEnumerable<ICompatibilitySwitch>
{ {
private readonly IReadOnlyList<ICompatibilitySwitch> _switches = Array.Empty<ICompatibilitySwitch>(); private readonly IReadOnlyList<ICompatibilitySwitch> _switches = Array.Empty<ICompatibilitySwitch>();
/// <summary> /// <summary>
/// Gets or sets a flag to determine whether error messages from JSON deserialization by the /// Gets or sets a flag to determine whether error messages from JSON deserialization by the
/// <see cref="JsonInputFormatter"/> will be added to the <see cref="ModelStateDictionary"/>. If /// <see cref="NewtonsoftJsonInputFormatter"/> will be added to the <see cref="ModelStateDictionary"/>. If
/// <see langword="false"/>, a generic error message will be used instead. /// <see langword="false"/>, a generic error message will be used instead.
/// </summary> /// </summary>
/// <value> /// <value>

View File

@ -10,25 +10,25 @@ using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
/// <summary> /// <summary>
/// Default implementation of <see cref="IJsonHelper"/>. /// Newtonsoft.Json based implementation of <see cref="IJsonHelper"/>.
/// </summary> /// </summary>
public class JsonHelper : IJsonHelper internal class NewtonsoftJsonHelper : IJsonHelper
{ {
private readonly JsonOutputFormatter _jsonOutputFormatter; private readonly NewtonsoftJsonOutputFormatter _jsonOutputFormatter;
private readonly ArrayPool<char> _charPool; private readonly ArrayPool<char> _charPool;
/// <summary> /// <summary>
/// Initializes a new instance of <see cref="JsonHelper"/> that is backed by <paramref name="jsonOutputFormatter"/>. /// Initializes a new instance of <see cref="NewtonsoftJsonHelper"/> that is backed by <paramref name="jsonOutputFormatter"/>.
/// </summary> /// </summary>
/// <param name="jsonOutputFormatter">The <see cref="JsonOutputFormatter"/> used to serialize JSON.</param> /// <param name="jsonOutputFormatter">The <see cref="NewtonsoftJsonOutputFormatter"/> used to serialize JSON.</param>
/// <param name="charPool"> /// <param name="charPool">
/// The <see cref="ArrayPool{Char}"/> for use with custom <see cref="JsonSerializerSettings"/> (see /// The <see cref="ArrayPool{Char}"/> for use with custom <see cref="JsonSerializerSettings"/> (see
/// <see cref="Serialize(object, JsonSerializerSettings)"/>). /// <see cref="Serialize(object, JsonSerializerSettings)"/>).
/// </param> /// </param>
public JsonHelper(JsonOutputFormatter jsonOutputFormatter, ArrayPool<char> charPool) public NewtonsoftJsonHelper(NewtonsoftJsonOutputFormatter jsonOutputFormatter, ArrayPool<char> charPool)
{ {
if (jsonOutputFormatter == null) if (jsonOutputFormatter == null)
{ {
@ -60,12 +60,12 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
throw new ArgumentNullException(nameof(serializerSettings)); throw new ArgumentNullException(nameof(serializerSettings));
} }
var jsonOutputFormatter = new JsonOutputFormatter(serializerSettings, _charPool); var jsonOutputFormatter = new NewtonsoftJsonOutputFormatter(serializerSettings, _charPool);
return SerializeInternal(jsonOutputFormatter, value); return SerializeInternal(jsonOutputFormatter, value);
} }
private IHtmlContent SerializeInternal(JsonOutputFormatter jsonOutputFormatter, object value) private IHtmlContent SerializeInternal(NewtonsoftJsonOutputFormatter jsonOutputFormatter, object value)
{ {
var stringWriter = new StringWriter(CultureInfo.InvariantCulture); var stringWriter = new StringWriter(CultureInfo.InvariantCulture);
jsonOutputFormatter.WriteObject(stringWriter, value); jsonOutputFormatter.WriteObject(stringWriter, value);

View File

@ -11,6 +11,7 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.AspNetCore.WebUtilities; using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.ObjectPool;
@ -21,13 +22,13 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
/// <summary> /// <summary>
/// A <see cref="TextInputFormatter"/> for JSON content. /// A <see cref="TextInputFormatter"/> for JSON content.
/// </summary> /// </summary>
public class JsonInputFormatter : TextInputFormatter, IInputFormatterExceptionPolicy public class NewtonsoftJsonInputFormatter : TextInputFormatter, IInputFormatterExceptionPolicy
{ {
private readonly IArrayPool<char> _charPool; private readonly IArrayPool<char> _charPool;
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly ObjectPoolProvider _objectPoolProvider; private readonly ObjectPoolProvider _objectPoolProvider;
private readonly MvcOptions _options; private readonly MvcOptions _options;
private readonly MvcJsonOptions _jsonOptions; private readonly MvcNewtonsoftJsonOptions _jsonOptions;
// These fields are used when one of the legacy constructors is called that doesn't provide the MvcOptions or // These fields are used when one of the legacy constructors is called that doesn't provide the MvcOptions or
// MvcJsonOptions. // MvcJsonOptions.
@ -37,18 +38,18 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
private ObjectPool<JsonSerializer> _jsonSerializerPool; private ObjectPool<JsonSerializer> _jsonSerializerPool;
/// <summary> /// <summary>
/// Initializes a new instance of <see cref="JsonInputFormatter"/>. /// Initializes a new instance of <see cref="NewtonsoftJsonInputFormatter"/>.
/// </summary> /// </summary>
/// <param name="logger">The <see cref="ILogger"/>.</param> /// <param name="logger">The <see cref="ILogger"/>.</param>
/// <param name="serializerSettings"> /// <param name="serializerSettings">
/// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings /// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings
/// (<see cref="MvcJsonOptions.SerializerSettings"/>) or an instance /// (<see cref="MvcNewtonsoftJsonOptions.SerializerSettings"/>) or an instance
/// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned. /// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned.
/// </param> /// </param>
/// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param> /// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param>
/// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param> /// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param>
[Obsolete("This constructor is obsolete and will be removed in a future version.")] [Obsolete("This constructor is obsolete and will be removed in a future version.")]
public JsonInputFormatter( public NewtonsoftJsonInputFormatter(
ILogger logger, ILogger logger,
JsonSerializerSettings serializerSettings, JsonSerializerSettings serializerSettings,
ArrayPool<char> charPool, ArrayPool<char> charPool,
@ -59,19 +60,19 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
} }
/// <summary> /// <summary>
/// Initializes a new instance of <see cref="JsonInputFormatter"/>. /// Initializes a new instance of <see cref="NewtonsoftJsonInputFormatter"/>.
/// </summary> /// </summary>
/// <param name="logger">The <see cref="ILogger"/>.</param> /// <param name="logger">The <see cref="ILogger"/>.</param>
/// <param name="serializerSettings"> /// <param name="serializerSettings">
/// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings /// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings
/// (<see cref="MvcJsonOptions.SerializerSettings"/>) or an instance /// (<see cref="MvcNewtonsoftJsonOptions.SerializerSettings"/>) or an instance
/// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned. /// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned.
/// </param> /// </param>
/// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param> /// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param>
/// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param> /// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param>
/// <param name="suppressInputFormatterBuffering">Flag to buffer entire request body before deserializing it.</param> /// <param name="suppressInputFormatterBuffering">Flag to buffer entire request body before deserializing it.</param>
[Obsolete("This constructor is obsolete and will be removed in a future version.")] [Obsolete("This constructor is obsolete and will be removed in a future version.")]
public JsonInputFormatter( public NewtonsoftJsonInputFormatter(
ILogger logger, ILogger logger,
JsonSerializerSettings serializerSettings, JsonSerializerSettings serializerSettings,
ArrayPool<char> charPool, ArrayPool<char> charPool,
@ -84,12 +85,12 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
} }
/// <summary> /// <summary>
/// Initializes a new instance of <see cref="JsonInputFormatter"/>. /// Initializes a new instance of <see cref="NewtonsoftJsonInputFormatter"/>.
/// </summary> /// </summary>
/// <param name="logger">The <see cref="ILogger"/>.</param> /// <param name="logger">The <see cref="ILogger"/>.</param>
/// <param name="serializerSettings"> /// <param name="serializerSettings">
/// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings /// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings
/// (<see cref="MvcJsonOptions.SerializerSettings"/>) or an instance /// (<see cref="MvcNewtonsoftJsonOptions.SerializerSettings"/>) or an instance
/// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned. /// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned.
/// </param> /// </param>
/// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param> /// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param>
@ -97,7 +98,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
/// <param name="suppressInputFormatterBuffering">Flag to buffer entire request body before deserializing it.</param> /// <param name="suppressInputFormatterBuffering">Flag to buffer entire request body before deserializing it.</param>
/// <param name="allowInputFormatterExceptionMessages">If <see langword="true"/>, JSON deserialization exception messages will replaced by a generic message in model state.</param> /// <param name="allowInputFormatterExceptionMessages">If <see langword="true"/>, JSON deserialization exception messages will replaced by a generic message in model state.</param>
[Obsolete("This constructor is obsolete and will be removed in a future version.")] [Obsolete("This constructor is obsolete and will be removed in a future version.")]
public JsonInputFormatter( public NewtonsoftJsonInputFormatter(
ILogger logger, ILogger logger,
JsonSerializerSettings serializerSettings, JsonSerializerSettings serializerSettings,
ArrayPool<char> charPool, ArrayPool<char> charPool,
@ -141,25 +142,25 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
} }
/// <summary> /// <summary>
/// Initializes a new instance of <see cref="JsonInputFormatter"/>. /// Initializes a new instance of <see cref="NewtonsoftJsonInputFormatter"/>.
/// </summary> /// </summary>
/// <param name="logger">The <see cref="ILogger"/>.</param> /// <param name="logger">The <see cref="ILogger"/>.</param>
/// <param name="serializerSettings"> /// <param name="serializerSettings">
/// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings /// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings
/// (<see cref="MvcJsonOptions.SerializerSettings"/>) or an instance /// (<see cref="MvcNewtonsoftJsonOptions.SerializerSettings"/>) or an instance
/// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned. /// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned.
/// </param> /// </param>
/// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param> /// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param>
/// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param> /// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param>
/// <param name="options">The <see cref="MvcOptions"/>.</param> /// <param name="options">The <see cref="MvcOptions"/>.</param>
/// <param name="jsonOptions">The <see cref="MvcJsonOptions"/>.</param> /// <param name="jsonOptions">The <see cref="MvcNewtonsoftJsonOptions"/>.</param>
public JsonInputFormatter( public NewtonsoftJsonInputFormatter(
ILogger logger, ILogger logger,
JsonSerializerSettings serializerSettings, JsonSerializerSettings serializerSettings,
ArrayPool<char> charPool, ArrayPool<char> charPool,
ObjectPoolProvider objectPoolProvider, ObjectPoolProvider objectPoolProvider,
MvcOptions options, MvcOptions options,
MvcJsonOptions jsonOptions) MvcNewtonsoftJsonOptions jsonOptions)
{ {
if (logger == null) if (logger == null)
{ {
@ -201,7 +202,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
{ {
get get
{ {
if (GetType() == typeof(JsonInputFormatter)) if (GetType() == typeof(NewtonsoftJsonInputFormatter))
{ {
return InputFormatterExceptionPolicy.MalformedInputExceptions; return InputFormatterExceptionPolicy.MalformedInputExceptions;
} }
@ -214,7 +215,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Any modifications to the <see cref="JsonSerializerSettings"/> object after this /// Any modifications to the <see cref="JsonSerializerSettings"/> object after this
/// <see cref="JsonInputFormatter"/> has been used will have no effect. /// <see cref="NewtonsoftJsonInputFormatter"/> has been used will have no effect.
/// </remarks> /// </remarks>
protected JsonSerializerSettings SerializerSettings { get; } protected JsonSerializerSettings SerializerSettings { get; }

View File

@ -4,15 +4,15 @@
using System; using System;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Mvc.Formatters namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
internal static class MvcJsonLoggerExtensions internal static class NewtonsoftJsonLoggerExtensions
{ {
private static readonly Action<ILogger, Exception> _jsonInputFormatterCrashed; private static readonly Action<ILogger, Exception> _jsonInputFormatterCrashed;
private static readonly Action<ILogger, string, Exception> _jsonResultExecuting; private static readonly Action<ILogger, string, Exception> _jsonResultExecuting;
static MvcJsonLoggerExtensions() static NewtonsoftJsonLoggerExtensions()
{ {
_jsonInputFormatterCrashed = LoggerMessage.Define( _jsonInputFormatterCrashed = LoggerMessage.Define(
LogLevel.Debug, LogLevel.Debug,

View File

@ -7,6 +7,7 @@ using System.ComponentModel;
using System.IO; using System.IO;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc.Formatters namespace Microsoft.AspNetCore.Mvc.Formatters
@ -14,7 +15,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
/// <summary> /// <summary>
/// A <see cref="TextOutputFormatter"/> for JSON content. /// A <see cref="TextOutputFormatter"/> for JSON content.
/// </summary> /// </summary>
public class JsonOutputFormatter : TextOutputFormatter public class NewtonsoftJsonOutputFormatter : TextOutputFormatter
{ {
private readonly IArrayPool<char> _charPool; private readonly IArrayPool<char> _charPool;
@ -23,15 +24,15 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
private JsonSerializer _serializer; private JsonSerializer _serializer;
/// <summary> /// <summary>
/// Initializes a new <see cref="JsonOutputFormatter"/> instance. /// Initializes a new <see cref="NewtonsoftJsonOutputFormatter"/> instance.
/// </summary> /// </summary>
/// <param name="serializerSettings"> /// <param name="serializerSettings">
/// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings /// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings
/// (<see cref="MvcJsonOptions.SerializerSettings"/>) or an instance /// (<see cref="MvcNewtonsoftJsonOptions.SerializerSettings"/>) or an instance
/// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned. /// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned.
/// </param> /// </param>
/// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param> /// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param>
public JsonOutputFormatter(JsonSerializerSettings serializerSettings, ArrayPool<char> charPool) public NewtonsoftJsonOutputFormatter(JsonSerializerSettings serializerSettings, ArrayPool<char> charPool)
{ {
if (serializerSettings == null) if (serializerSettings == null)
{ {
@ -58,7 +59,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Any modifications to the <see cref="JsonSerializerSettings"/> object after this /// Any modifications to the <see cref="JsonSerializerSettings"/> object after this
/// <see cref="JsonOutputFormatter"/> has been used will have no effect. /// <see cref="NewtonsoftJsonOutputFormatter"/> has been used will have no effect.
/// </remarks> /// </remarks>
protected JsonSerializerSettings SerializerSettings { get; } protected JsonSerializerSettings SerializerSettings { get; }
@ -67,7 +68,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Any modifications to the <see cref="JsonSerializerSettings"/> object after this /// Any modifications to the <see cref="JsonSerializerSettings"/> object after this
/// <see cref="JsonOutputFormatter"/> has been used will have no effect. /// <see cref="NewtonsoftJsonOutputFormatter"/> has been used will have no effect.
/// </remarks> /// </remarks>
[EditorBrowsable(EditorBrowsableState.Never)] [EditorBrowsable(EditorBrowsableState.Never)]
public JsonSerializerSettings PublicSerializerSettings => SerializerSettings; public JsonSerializerSettings PublicSerializerSettings => SerializerSettings;

View File

@ -7,6 +7,7 @@ using System.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.JsonPatch; using Microsoft.AspNetCore.JsonPatch;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.ObjectPool;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -16,21 +17,21 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
/// <summary> /// <summary>
/// A <see cref="TextInputFormatter"/> for JSON Patch (application/json-patch+json) content. /// A <see cref="TextInputFormatter"/> for JSON Patch (application/json-patch+json) content.
/// </summary> /// </summary>
public class JsonPatchInputFormatter : JsonInputFormatter public class NewtonsoftJsonPatchInputFormatter : NewtonsoftJsonInputFormatter
{ {
/// <summary> /// <summary>
/// Initializes a new <see cref="JsonPatchInputFormatter"/> instance. /// Initializes a new <see cref="NewtonsoftJsonPatchInputFormatter"/> instance.
/// </summary> /// </summary>
/// <param name="logger">The <see cref="ILogger"/>.</param> /// <param name="logger">The <see cref="ILogger"/>.</param>
/// <param name="serializerSettings"> /// <param name="serializerSettings">
/// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings /// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings
/// (<see cref="MvcJsonOptions.SerializerSettings"/>) or an instance /// (<see cref="MvcNewtonsoftJsonOptions.SerializerSettings"/>) or an instance
/// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned. /// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned.
/// </param> /// </param>
/// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param> /// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param>
/// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param> /// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param>
[Obsolete("This constructor is obsolete and will be removed in a future version.")] [Obsolete("This constructor is obsolete and will be removed in a future version.")]
public JsonPatchInputFormatter( public NewtonsoftJsonPatchInputFormatter(
ILogger logger, ILogger logger,
JsonSerializerSettings serializerSettings, JsonSerializerSettings serializerSettings,
ArrayPool<char> charPool, ArrayPool<char> charPool,
@ -40,19 +41,19 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
} }
/// <summary> /// <summary>
/// Initializes a new <see cref="JsonPatchInputFormatter"/> instance. /// Initializes a new <see cref="NewtonsoftJsonPatchInputFormatter"/> instance.
/// </summary> /// </summary>
/// <param name="logger">The <see cref="ILogger"/>.</param> /// <param name="logger">The <see cref="ILogger"/>.</param>
/// <param name="serializerSettings"> /// <param name="serializerSettings">
/// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings /// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings
/// (<see cref="MvcJsonOptions.SerializerSettings"/>) or an instance /// (<see cref="MvcNewtonsoftJsonOptions.SerializerSettings"/>) or an instance
/// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned. /// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned.
/// </param> /// </param>
/// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param> /// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param>
/// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param> /// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param>
/// <param name="suppressInputFormatterBuffering">Flag to buffer entire request body before deserializing it.</param> /// <param name="suppressInputFormatterBuffering">Flag to buffer entire request body before deserializing it.</param>
[Obsolete("This constructor is obsolete and will be removed in a future version.")] [Obsolete("This constructor is obsolete and will be removed in a future version.")]
public JsonPatchInputFormatter( public NewtonsoftJsonPatchInputFormatter(
ILogger logger, ILogger logger,
JsonSerializerSettings serializerSettings, JsonSerializerSettings serializerSettings,
ArrayPool<char> charPool, ArrayPool<char> charPool,
@ -63,12 +64,12 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
} }
/// <summary> /// <summary>
/// Initializes a new <see cref="JsonPatchInputFormatter"/> instance. /// Initializes a new <see cref="NewtonsoftJsonPatchInputFormatter"/> instance.
/// </summary> /// </summary>
/// <param name="logger">The <see cref="ILogger"/>.</param> /// <param name="logger">The <see cref="ILogger"/>.</param>
/// <param name="serializerSettings"> /// <param name="serializerSettings">
/// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings /// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings
/// (<see cref="MvcJsonOptions.SerializerSettings"/>) or an instance /// (<see cref="MvcNewtonsoftJsonOptions.SerializerSettings"/>) or an instance
/// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned. /// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned.
/// </param> /// </param>
/// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param> /// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param>
@ -78,7 +79,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
/// If <see langword="false"/>, JSON deserialization exception messages will replaced by a generic message in model state. /// If <see langword="false"/>, JSON deserialization exception messages will replaced by a generic message in model state.
/// </param> /// </param>
[Obsolete("This constructor is obsolete and will be removed in a future version.")] [Obsolete("This constructor is obsolete and will be removed in a future version.")]
public JsonPatchInputFormatter( public NewtonsoftJsonPatchInputFormatter(
ILogger logger, ILogger logger,
JsonSerializerSettings serializerSettings, JsonSerializerSettings serializerSettings,
ArrayPool<char> charPool, ArrayPool<char> charPool,
@ -94,25 +95,25 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
} }
/// <summary> /// <summary>
/// Initializes a new <see cref="JsonPatchInputFormatter"/> instance. /// Initializes a new <see cref="NewtonsoftJsonPatchInputFormatter"/> instance.
/// </summary> /// </summary>
/// <param name="logger">The <see cref="ILogger"/>.</param> /// <param name="logger">The <see cref="ILogger"/>.</param>
/// <param name="serializerSettings"> /// <param name="serializerSettings">
/// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings /// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings
/// (<see cref="MvcJsonOptions.SerializerSettings"/>) or an instance /// (<see cref="MvcNewtonsoftJsonOptions.SerializerSettings"/>) or an instance
/// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned. /// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned.
/// </param> /// </param>
/// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param> /// <param name="charPool">The <see cref="ArrayPool{Char}"/>.</param>
/// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param> /// <param name="objectPoolProvider">The <see cref="ObjectPoolProvider"/>.</param>
/// <param name="options">The <see cref="MvcOptions"/>.</param> /// <param name="options">The <see cref="MvcOptions"/>.</param>
/// <param name="jsonOptions">The <see cref="MvcJsonOptions"/>.</param> /// <param name="jsonOptions">The <see cref="MvcNewtonsoftJsonOptions"/>.</param>
public JsonPatchInputFormatter( public NewtonsoftJsonPatchInputFormatter(
ILogger logger, ILogger logger,
JsonSerializerSettings serializerSettings, JsonSerializerSettings serializerSettings,
ArrayPool<char> charPool, ArrayPool<char> charPool,
ObjectPoolProvider objectPoolProvider, ObjectPoolProvider objectPoolProvider,
MvcOptions options, MvcOptions options,
MvcJsonOptions jsonOptions) MvcNewtonsoftJsonOptions jsonOptions)
: base(logger, serializerSettings, charPool, objectPoolProvider, options, jsonOptions) : base(logger, serializerSettings, charPool, objectPoolProvider, options, jsonOptions)
{ {
// Clear all values and only include json-patch+json value. // Clear all values and only include json-patch+json value.
@ -126,7 +127,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
{ {
get get
{ {
if (GetType() == typeof(JsonPatchInputFormatter)) if (GetType() == typeof(NewtonsoftJsonPatchInputFormatter))
{ {
return InputFormatterExceptionPolicy.MalformedInputExceptions; return InputFormatterExceptionPolicy.MalformedInputExceptions;
} }

View File

@ -0,0 +1,50 @@
// 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 Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{
/// <summary>
/// A RFC 7807 compliant <see cref="JsonConverter"/> for <see cref="ProblemDetails"/>.
/// </summary>
public sealed class ProblemDetailsConverter : JsonConverter
{
/// <inheritdoc />
public override bool CanConvert(Type objectType)
{
return objectType == typeof(ProblemDetails);
}
/// <inheritdoc />
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var annotatedProblemDetails = serializer.Deserialize<AnnotatedProblemDetails>(reader);
if (annotatedProblemDetails == null)
{
return null;
}
var problemDetails = (ProblemDetails)existingValue ?? new ProblemDetails();
annotatedProblemDetails.CopyTo(problemDetails);
return problemDetails;
}
/// <inheritdoc />
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
writer.WriteNull();
return;
}
var problemDetails = (ProblemDetails)value;
var annotatedProblemDetails = new AnnotatedProblemDetails(problemDetails);
serializer.Serialize(writer, annotatedProblemDetails);
}
}
}

View File

@ -4,5 +4,5 @@
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Formatters.Json.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.NewtonsoftJson.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.IntegrationTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]

View File

@ -0,0 +1,128 @@
// <auto-generated />
namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{
using System.Globalization;
using System.Reflection;
using System.Resources;
internal static class Resources
{
private static readonly ResourceManager _resourceManager
= new ResourceManager("Microsoft.AspNetCore.Mvc.NewtonsoftJson.Resources", typeof(Resources).GetTypeInfo().Assembly);
/// <summary>
/// {0} cannot be null.
/// </summary>
internal static string ContractResolverCannotBeNull
{
get => GetString("ContractResolverCannotBeNull");
}
/// <summary>
/// {0} cannot be null.
/// </summary>
internal static string FormatContractResolverCannotBeNull(object p0)
=> string.Format(CultureInfo.CurrentCulture, GetString("ContractResolverCannotBeNull"), p0);
/// <summary>
/// Cannot configure JSON casing behavior on '{0}' contract resolver. The supported contract resolver is {1}.
/// </summary>
internal static string InvalidContractResolverForJsonCasingConfiguration
{
get => GetString("InvalidContractResolverForJsonCasingConfiguration");
}
/// <summary>
/// Cannot configure JSON casing behavior on '{0}' contract resolver. The supported contract resolver is {1}.
/// </summary>
internal static string FormatInvalidContractResolverForJsonCasingConfiguration(object p0, object p1)
=> string.Format(CultureInfo.CurrentCulture, GetString("InvalidContractResolverForJsonCasingConfiguration"), p0, p1);
/// <summary>
/// Parameter '{0}' must be an instance of {1} provided by the '{2}' package. Configure the correct instance using '{3}' in your startup.
/// </summary>
internal static string JsonHelperMustBeAnInstanceOfNewtonsoftJson
{
get => GetString("JsonHelperMustBeAnInstanceOfNewtonsoftJson");
}
/// <summary>
/// Parameter '{0}' must be an instance of {1} provided by the '{2}' package. Configure the correct instance using '{3}' in your startup.
/// </summary>
internal static string FormatJsonHelperMustBeAnInstanceOfNewtonsoftJson(object p0, object p1, object p2, object p3)
=> string.Format(CultureInfo.CurrentCulture, GetString("JsonHelperMustBeAnInstanceOfNewtonsoftJson"), p0, p1, p2, p3);
/// <summary>
/// Property '{0}.{1}' must be an instance of type '{2}'.
/// </summary>
internal static string Property_MustBeInstanceOfType
{
get => GetString("Property_MustBeInstanceOfType");
}
/// <summary>
/// Property '{0}.{1}' must be an instance of type '{2}'.
/// </summary>
internal static string FormatProperty_MustBeInstanceOfType(object p0, object p1, object p2)
=> string.Format(CultureInfo.CurrentCulture, GetString("Property_MustBeInstanceOfType"), p0, p1, p2);
/// <summary>
/// Cannot deserialize {0} of type '{1}'.
/// </summary>
internal static string TempData_CannotDeserializeToken
{
get => GetString("TempData_CannotDeserializeToken");
}
/// <summary>
/// Cannot deserialize {0} of type '{1}'.
/// </summary>
internal static string FormatTempData_CannotDeserializeToken(object p0, object p1)
=> string.Format(CultureInfo.CurrentCulture, GetString("TempData_CannotDeserializeToken"), p0, p1);
/// <summary>
/// The '{0}' cannot serialize a dictionary with a key of type '{1}'. The key must be of type '{2}'.
/// </summary>
internal static string TempData_CannotSerializeDictionary
{
get => GetString("TempData_CannotSerializeDictionary");
}
/// <summary>
/// The '{0}' cannot serialize a dictionary with a key of type '{1}'. The key must be of type '{2}'.
/// </summary>
internal static string FormatTempData_CannotSerializeDictionary(object p0, object p1, object p2)
=> string.Format(CultureInfo.CurrentCulture, GetString("TempData_CannotSerializeDictionary"), p0, p1, p2);
/// <summary>
/// The '{0}' cannot serialize an object of type '{1}'.
/// </summary>
internal static string TempData_CannotSerializeType
{
get => GetString("TempData_CannotSerializeType");
}
/// <summary>
/// The '{0}' cannot serialize an object of type '{1}'.
/// </summary>
internal static string FormatTempData_CannotSerializeType(object p0, object p1)
=> string.Format(CultureInfo.CurrentCulture, GetString("TempData_CannotSerializeType"), p0, p1);
private static string GetString(string name, params string[] formatterNames)
{
var value = _resourceManager.GetString(name);
System.Diagnostics.Debug.Assert(value != null);
if (formatterNames != null)
{
for (var i = 0; i < formatterNames.Length; i++)
{
value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}");
}
}
return value;
}
}
}

View File

@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<root> <root>
<!-- <!--
Microsoft ResX Schema Microsoft ResX Schema
Version 2.0 Version 2.0
The primary goals of this format is to allow a simple XML format The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes various data types are done through the TypeConverter classes
associated with the data types. associated with the data types.
Example: Example:
... ado.net/XML headers & schema ... ... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader> <resheader name="version">2.0</resheader>
@ -26,36 +26,36 @@
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment> <comment>This is a comment</comment>
</data> </data>
There are any number of "resheader" rows that contain simple There are any number of "resheader" rows that contain simple
name/value pairs. name/value pairs.
Each data row contains a name, and value. The row also contains a Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture. text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the Classes that don't support this are serialized and stored with the
mimetype set. mimetype set.
The mimetype is used for serialized objects, and tells the The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly: extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below. read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64 mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64 mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64 mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter : using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
--> -->
@ -123,4 +123,19 @@
<data name="InvalidContractResolverForJsonCasingConfiguration" xml:space="preserve"> <data name="InvalidContractResolverForJsonCasingConfiguration" xml:space="preserve">
<value>Cannot configure JSON casing behavior on '{0}' contract resolver. The supported contract resolver is {1}.</value> <value>Cannot configure JSON casing behavior on '{0}' contract resolver. The supported contract resolver is {1}.</value>
</data> </data>
<data name="JsonHelperMustBeAnInstanceOfNewtonsoftJson" xml:space="preserve">
<value>Parameter '{0}' must be an instance of {1} provided by the '{2}' package. Configure the correct instance using '{3}' in your startup.</value>
</data>
<data name="Property_MustBeInstanceOfType" xml:space="preserve">
<value>Property '{0}.{1}' must be an instance of type '{2}'.</value>
</data>
<data name="TempData_CannotDeserializeToken" xml:space="preserve">
<value>Cannot deserialize {0} of type '{1}'.</value>
</data>
<data name="TempData_CannotSerializeDictionary" xml:space="preserve">
<value>The '{0}' cannot serialize a dictionary with a key of type '{1}'. The key must be of type '{2}'.</value>
</data>
<data name="TempData_CannotSerializeType" xml:space="preserve">
<value>The '{0}' cannot serialize an object of type '{1}'.</value>
</data>
</root> </root>

View File

@ -0,0 +1,81 @@
// 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 Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{
/// <summary>
/// A RFC 7807 compliant <see cref="JsonConverter"/> for <see cref="ValidationProblemDetails"/>.
/// </summary>
public sealed class ValidationProblemDetailsConverter : JsonConverter
{
/// <inheritdoc />
public override bool CanConvert(Type objectType)
{
return objectType == typeof(ValidationProblemDetails);
}
/// <inheritdoc />
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var annotatedProblemDetails = serializer.Deserialize<AnnotatedValidationProblemDetails>(reader);
if (annotatedProblemDetails == null)
{
return null;
}
var problemDetails = (ValidationProblemDetails)existingValue ?? new ValidationProblemDetails();
annotatedProblemDetails.CopyTo(problemDetails);
return problemDetails;
}
/// <inheritdoc />
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
writer.WriteNull();
return;
}
var problemDetails = (ValidationProblemDetails)value;
var annotatedProblemDetails = new AnnotatedValidationProblemDetails(problemDetails);
serializer.Serialize(writer, annotatedProblemDetails);
}
private class AnnotatedValidationProblemDetails : AnnotatedProblemDetails
{
/// <remarks>
/// Required for JSON.NET deserialization.
/// </remarks>
public AnnotatedValidationProblemDetails() { }
public AnnotatedValidationProblemDetails(ValidationProblemDetails problemDetails)
: base(problemDetails)
{
foreach (var kvp in problemDetails.Errors)
{
Errors[kvp.Key] = kvp.Value;
}
}
[JsonProperty(PropertyName = "errors")]
public IDictionary<string, string[]> Errors { get; } = new Dictionary<string, string[]>(StringComparer.Ordinal);
public void CopyTo(ValidationProblemDetails problemDetails)
{
base.CopyTo(problemDetails);
foreach (var kvp in Errors)
{
problemDetails.Errors[kvp.Key] = kvp.Value;
}
}
}
}
}

View File

@ -4,17 +4,17 @@
using System; using System;
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Filters; using Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
using Microsoft.Extensions.Options; using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels namespace Microsoft.AspNetCore.Mvc.ApplicationModels
{ {
internal class TempDataFilterPageApplicationModelProvider : IPageApplicationModelProvider internal class TempDataFilterPageApplicationModelProvider : IPageApplicationModelProvider
{ {
private readonly MvcViewOptions _options; private readonly TempDataSerializer _tempDataSerializer;
public TempDataFilterPageApplicationModelProvider(IOptions<MvcViewOptions> options) public TempDataFilterPageApplicationModelProvider(TempDataSerializer tempDataSerializer)
{ {
_options = options.Value; _tempDataSerializer = tempDataSerializer;
} }
// The order is set to execute after the DefaultPageApplicationModelProvider. // The order is set to execute after the DefaultPageApplicationModelProvider.
@ -34,7 +34,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
var pageApplicationModel = context.PageApplicationModel; var pageApplicationModel = context.PageApplicationModel;
var handlerType = pageApplicationModel.HandlerType.AsType(); var handlerType = pageApplicationModel.HandlerType.AsType();
var tempDataProperties = SaveTempDataPropertyFilterBase.GetTempDataProperties(handlerType, _options); var tempDataProperties = SaveTempDataPropertyFilterBase.GetTempDataProperties(_tempDataSerializer, handlerType);
if (tempDataProperties == null) if (tempDataProperties == null)
{ {
return; return;

View File

@ -7,7 +7,6 @@ using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc namespace Microsoft.AspNetCore.Mvc
{ {
@ -299,14 +298,13 @@ namespace Microsoft.AspNetCore.Mvc
/// to JSON. /// to JSON.
/// </summary> /// </summary>
/// <param name="data">The object to serialize.</param> /// <param name="data">The object to serialize.</param>
/// <param name="serializerSettings">The <see cref="JsonSerializerSettings"/> to be used by /// <param name="serializerSettings">The serializer settings to be used by the formatter.</param>
/// the formatter.</param>
/// <returns>The created <see cref="JsonResult"/> that serializes the specified <paramref name="data"/> /// <returns>The created <see cref="JsonResult"/> that serializes the specified <paramref name="data"/>
/// as JSON format for the response.</returns> /// as JSON format for the response.</returns>
/// <remarks>Callers should cache an instance of <see cref="JsonSerializerSettings"/> to avoid /// <remarks>Callers should cache an instance of serializer settings to avoid
/// recreating cached data with each call.</remarks> /// recreating cached data with each call.</remarks>
[NonAction] [NonAction]
public virtual JsonResult Json(object data, JsonSerializerSettings serializerSettings) public virtual JsonResult Json(object data, object serializerSettings)
{ {
if (serializerSettings == null) if (serializerSettings == null)
{ {

View File

@ -6,7 +6,7 @@ using System.Collections.Generic;
using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Internal; using Microsoft.AspNetCore.Internal;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Filters; using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
using Microsoft.AspNetCore.WebUtilities; using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
@ -30,11 +30,12 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
public CookieTempDataProvider( public CookieTempDataProvider(
IDataProtectionProvider dataProtectionProvider, IDataProtectionProvider dataProtectionProvider,
ILoggerFactory loggerFactory, ILoggerFactory loggerFactory,
IOptions<CookieTempDataProviderOptions> options) IOptions<CookieTempDataProviderOptions> options,
TempDataSerializer tempDataSerializer)
{ {
_dataProtector = dataProtectionProvider.CreateProtector(Purpose); _dataProtector = dataProtectionProvider.CreateProtector(Purpose);
_logger = loggerFactory.CreateLogger<CookieTempDataProvider>(); _logger = loggerFactory.CreateLogger<CookieTempDataProvider>();
_tempDataSerializer = new TempDataSerializer(); _tempDataSerializer = tempDataSerializer;
_chunkingCookieManager = new ChunkingCookieManager(); _chunkingCookieManager = new ChunkingCookieManager();
_options = options.Value; _options = options.Value;
} }

View File

@ -16,6 +16,7 @@ using Microsoft.AspNetCore.Mvc.ViewEngines;
using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers; using Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Filters; using Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
@ -169,16 +170,7 @@ namespace Microsoft.Extensions.DependencyInjection
services.TryAddSingleton<IModelExpressionProvider>(s => s.GetRequiredService<ModelExpressionProvider>()); services.TryAddSingleton<IModelExpressionProvider>(s => s.GetRequiredService<ModelExpressionProvider>());
services.TryAddSingleton<ValidationHtmlAttributeProvider, DefaultValidationHtmlAttributeProvider>(); services.TryAddSingleton<ValidationHtmlAttributeProvider, DefaultValidationHtmlAttributeProvider>();
// services.TryAddSingleton<IJsonHelper, DefaultJsonHelper>();
// JSON Helper
//
services.TryAddSingleton<IJsonHelper, JsonHelper>();
services.TryAdd(ServiceDescriptor.Singleton(serviceProvider =>
{
var options = serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value;
var charPool = serviceProvider.GetRequiredService<ArrayPool<char>>();
return new JsonOutputFormatter(options.SerializerSettings, charPool);
}));
// //
// View Components // View Components
@ -212,6 +204,7 @@ namespace Microsoft.Extensions.DependencyInjection
// This does caching so it should stay singleton // This does caching so it should stay singleton
services.TryAddSingleton<ITempDataProvider, CookieTempDataProvider>(); services.TryAddSingleton<ITempDataProvider, CookieTempDataProvider>();
services.TryAddSingleton<TempDataSerializer, DefaultTempDataSerializer>();
// //
// Antiforgery // Antiforgery

View File

@ -5,6 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Reflection; using System.Reflection;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
using Microsoft.Extensions.Internal; using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
@ -80,7 +81,9 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
} }
} }
public static IReadOnlyList<LifecycleProperty> GetTempDataProperties(Type type, MvcViewOptions viewOptions) public static IReadOnlyList<LifecycleProperty> GetTempDataProperties(
TempDataSerializer tempDataSerializer,
Type type)
{ {
List<LifecycleProperty> results = null; List<LifecycleProperty> results = null;
@ -92,7 +95,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
var tempDataAttribute = property.GetCustomAttribute<TempDataAttribute>(); var tempDataAttribute = property.GetCustomAttribute<TempDataAttribute>();
if (tempDataAttribute != null) if (tempDataAttribute != null)
{ {
ValidateProperty(propertyHelper.Property); ValidateProperty(tempDataSerializer, propertyHelper.Property);
if (results == null) if (results == null)
{ {
results = new List<LifecycleProperty>(); results = new List<LifecycleProperty>();
@ -111,7 +114,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
return results; return results;
} }
private static void ValidateProperty(PropertyInfo property) private static void ValidateProperty(TempDataSerializer tempDataSerializer, PropertyInfo property)
{ {
if (!(property.SetMethod != null && if (!(property.SetMethod != null &&
property.SetMethod.IsPublic && property.SetMethod.IsPublic &&
@ -122,16 +125,13 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
Resources.FormatTempDataProperties_PublicGetterSetter(property.DeclaringType.FullName, property.Name, nameof(TempDataAttribute))); Resources.FormatTempDataProperties_PublicGetterSetter(property.DeclaringType.FullName, property.Name, nameof(TempDataAttribute)));
} }
var propertyType = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType; if (!tempDataSerializer.CanSerializeType(property.PropertyType))
if (!TempDataSerializer.CanSerializeType(propertyType, out var errorMessage))
{ {
var messageWithPropertyInfo = Resources.FormatTempDataProperties_InvalidType( throw new InvalidOperationException(Resources.FormatTempDataProperties_InvalidType(
property.DeclaringType.FullName, tempDataSerializer.GetType().FullName,
TypeNameHelper.GetTypeDisplayName(property.DeclaringType),
property.Name, property.Name,
nameof(TempDataAttribute)); TypeNameHelper.GetTypeDisplayName(property.PropertyType)));
throw new InvalidOperationException($"{messageWithPropertyInfo} {errorMessage}");
} }
} }
} }

View File

@ -3,17 +3,17 @@
using System; using System;
using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.Extensions.Options; using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
{ {
internal class TempDataApplicationModelProvider : IApplicationModelProvider internal class TempDataApplicationModelProvider : IApplicationModelProvider
{ {
private readonly MvcViewOptions _options; private readonly TempDataSerializer _tempDataSerializer;
public TempDataApplicationModelProvider(IOptions<MvcViewOptions> options) public TempDataApplicationModelProvider(TempDataSerializer tempDataSerializer)
{ {
_options = options.Value; _tempDataSerializer = tempDataSerializer;
} }
/// <inheritdoc /> /// <inheritdoc />
@ -37,7 +37,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
{ {
var modelType = controllerModel.ControllerType.AsType(); var modelType = controllerModel.ControllerType.AsType();
var tempDataProperties = SaveTempDataPropertyFilterBase.GetTempDataProperties(modelType, _options); var tempDataProperties = SaveTempDataPropertyFilterBase.GetTempDataProperties(_tempDataSerializer, modelType);
if (tempDataProperties == null) if (tempDataProperties == null)
{ {
continue; continue;

View File

@ -0,0 +1,32 @@
// 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 Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure
{
internal class DefaultTempDataSerializer : TempDataSerializer
{
public override IDictionary<string, object> Deserialize(byte[] unprotectedData)
{
throw new InvalidOperationException(Core.Resources.FormatReferenceToNewtonsoftJsonRequired(
Resources.DeserializingTempData,
"Microsoft.AspNetCore.Mvc.NewtonsoftJson",
nameof(IMvcBuilder),
"AddNewtonsoftJson",
"ConfigureServices(...)"));
}
public override byte[] Serialize(IDictionary<string, object> values)
{
throw new InvalidOperationException(Core.Resources.FormatReferenceToNewtonsoftJsonRequired(
Resources.SerializingTempData,
"Microsoft.AspNetCore.Mvc.NewtonsoftJson",
nameof(IMvcBuilder),
"AddNewtonsoftJson",
"ConfigureServices(...)"));
}
}
}

View File

@ -0,0 +1,39 @@
// 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;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure
{
/// <summary>
/// Serializes and deserializes the contents of <see cref="ITempDataDictionary"/>.
/// </summary>
public abstract class TempDataSerializer
{
/// <summary>
/// Deserializes <paramref name="unprotectedData"/> to a <see cref="IDictionary{TKey, TValue}"/>
/// used to initialize an instance of <see cref="ITempDataDictionary"/>.
/// </summary>
/// <param name="unprotectedData">Serialized representation of <see cref="ITempDataDictionary"/>.</param>
/// <returns>The deserialized <see cref="IDictionary{TKey, TValue}"/>.</returns>
public abstract IDictionary<string, object> Deserialize(byte[] unprotectedData);
/// <summary>
/// Serializes the contents of <see cref="ITempDataDictionary"/>.
/// </summary>
/// <param name="values">The contents of <see cref="ITempDataDictionary"/>.</param>
/// <returns>The serialized bytes.</returns>
public abstract byte[] Serialize(IDictionary<string, object> values);
/// <summary>
/// Determines if the serializer supports the specified <paramref name="type"/>.
/// <para>
/// Defaults to returning <see langword="true"/> for all <see cref="Type"/> instances.
/// </para>
/// </summary>
/// <param name="type">The <see cref="Type"/>.</param>
/// <returns><see langword="true"/> if the serializer supports serializing <paramref name="type"/>, otherwise <see langword="false"/>.</returns>
public virtual bool CanSerializeType(Type type) => true;
}
}

View File

@ -16,13 +16,11 @@ Microsoft.AspNetCore.Mvc.ViewComponent</Description>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.AspNetCore.Mvc.Core" /> <Reference Include="Microsoft.AspNetCore.Mvc.Core" />
<Reference Include="Microsoft.AspNetCore.Mvc.DataAnnotations" /> <Reference Include="Microsoft.AspNetCore.Mvc.DataAnnotations" />
<Reference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" />
<Reference Include="Microsoft.AspNetCore.Antiforgery" /> <Reference Include="Microsoft.AspNetCore.Antiforgery" />
<Reference Include="Microsoft.AspNetCore.Diagnostics.Abstractions" /> <Reference Include="Microsoft.AspNetCore.Diagnostics.Abstractions" />
<Reference Include="Microsoft.AspNetCore.Html.Abstractions" /> <Reference Include="Microsoft.AspNetCore.Html.Abstractions" />
<Reference Include="Microsoft.Extensions.WebEncoders" /> <Reference Include="Microsoft.Extensions.WebEncoders" />
<Reference Include="Newtonsoft.Json.Bson" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -8,6 +8,7 @@ using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.TagHelpers, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.TagHelpers, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.NewtonsoftJson.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.RazorPages.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.RazorPages.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.TagHelpers.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.TagHelpers.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]

View File

@ -668,48 +668,6 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
internal static string FormatViewComponentResult_NameOrTypeMustBeSet(object p0, object p1) internal static string FormatViewComponentResult_NameOrTypeMustBeSet(object p0, object p1)
=> string.Format(CultureInfo.CurrentCulture, GetString("ViewComponentResult_NameOrTypeMustBeSet"), p0, p1); => string.Format(CultureInfo.CurrentCulture, GetString("ViewComponentResult_NameOrTypeMustBeSet"), p0, p1);
/// <summary>
/// Cannot deserialize {0} of type '{1}'.
/// </summary>
internal static string TempData_CannotDeserializeToken
{
get => GetString("TempData_CannotDeserializeToken");
}
/// <summary>
/// Cannot deserialize {0} of type '{1}'.
/// </summary>
internal static string FormatTempData_CannotDeserializeToken(object p0, object p1)
=> string.Format(CultureInfo.CurrentCulture, GetString("TempData_CannotDeserializeToken"), p0, p1);
/// <summary>
/// The '{0}' cannot serialize a dictionary with a key of type '{1}'. The key must be of type '{2}'.
/// </summary>
internal static string TempData_CannotSerializeDictionary
{
get => GetString("TempData_CannotSerializeDictionary");
}
/// <summary>
/// The '{0}' cannot serialize a dictionary with a key of type '{1}'. The key must be of type '{2}'.
/// </summary>
internal static string FormatTempData_CannotSerializeDictionary(object p0, object p1, object p2)
=> string.Format(CultureInfo.CurrentCulture, GetString("TempData_CannotSerializeDictionary"), p0, p1, p2);
/// <summary>
/// The '{0}' cannot serialize an object of type '{1}'.
/// </summary>
internal static string TempData_CannotSerializeType
{
get => GetString("TempData_CannotSerializeType");
}
/// <summary>
/// The '{0}' cannot serialize an object of type '{1}'.
/// </summary>
internal static string FormatTempData_CannotSerializeType(object p0, object p1)
=> string.Format(CultureInfo.CurrentCulture, GetString("TempData_CannotSerializeType"), p0, p1);
/// <summary> /// <summary>
/// The collection already contains an entry with key '{0}'. /// The collection already contains an entry with key '{0}'.
/// </summary> /// </summary>
@ -794,20 +752,6 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
internal static string FormatViewEnginesAreRequired(object p0, object p1, object p2) internal static string FormatViewEnginesAreRequired(object p0, object p1, object p2)
=> string.Format(CultureInfo.CurrentCulture, GetString("ViewEnginesAreRequired"), p0, p1, p2); => string.Format(CultureInfo.CurrentCulture, GetString("ViewEnginesAreRequired"), p0, p1, p2);
/// <summary>
/// The '{0}.{1}' property with {2} is invalid.
/// </summary>
internal static string TempDataProperties_InvalidType
{
get => GetString("TempDataProperties_InvalidType");
}
/// <summary>
/// The '{0}.{1}' property with {2} is invalid.
/// </summary>
internal static string FormatTempDataProperties_InvalidType(object p0, object p1, object p2)
=> string.Format(CultureInfo.CurrentCulture, GetString("TempDataProperties_InvalidType"), p0, p1, p2);
/// <summary> /// <summary>
/// The '{0}.{1}' property with {2} is invalid. A property using {2} must have a public getter and setter. /// The '{0}.{1}' property with {2} is invalid. A property using {2} must have a public getter and setter.
/// </summary> /// </summary>
@ -822,6 +766,48 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
internal static string FormatTempDataProperties_PublicGetterSetter(object p0, object p1, object p2) internal static string FormatTempDataProperties_PublicGetterSetter(object p0, object p1, object p2)
=> string.Format(CultureInfo.CurrentCulture, GetString("TempDataProperties_PublicGetterSetter"), p0, p1, p2); => string.Format(CultureInfo.CurrentCulture, GetString("TempDataProperties_PublicGetterSetter"), p0, p1, p2);
/// <summary>
/// TempData serializer '{0}' cannot serialize property '{1}.{2}' of type '{3}'.
/// </summary>
internal static string TempDataProperties_InvalidType
{
get => GetString("TempDataProperties_InvalidType");
}
/// <summary>
/// TempData serializer '{0}' cannot serialize property '{1}.{2}' of type '{3}'.
/// </summary>
internal static string FormatTempDataProperties_InvalidType(object p0, object p1, object p2, object p3)
=> string.Format(CultureInfo.CurrentCulture, GetString("TempDataProperties_InvalidType"), p0, p1, p2, p3);
/// <summary>
/// Deserializing TempDataDictionary
/// </summary>
internal static string DeserializingTempData
{
get => GetString("DeserializingTempData");
}
/// <summary>
/// Deserializing TempDataDictionary
/// </summary>
internal static string FormatDeserializingTempData()
=> GetString("DeserializingTempData");
/// <summary>
/// Serializing TempDataDictionary
/// </summary>
internal static string SerializingTempData
{
get => GetString("SerializingTempData");
}
/// <summary>
/// Serializing TempDataDictionary
/// </summary>
internal static string FormatSerializingTempData()
=> GetString("SerializingTempData");
private static string GetString(string name, params string[] formatterNames) private static string GetString(string name, params string[] formatterNames)
{ {
var value = _resourceManager.GetString(name); var value = _resourceManager.GetString(name);

View File

@ -0,0 +1,24 @@

// 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 Microsoft.AspNetCore.Html;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Mvc.Rendering
{
internal class DefaultJsonHelper : IJsonHelper
{
/// <inheritdoc />
public IHtmlContent Serialize(object value)
{
throw new InvalidOperationException(Core.Resources.FormatReferenceToNewtonsoftJsonRequired(
$"{nameof(IJsonHelper)}.{nameof(Serialize)}",
"Microsoft.AspNetCore.Mvc.NewtonsoftJson",
nameof(IMvcBuilder),
"AddNewtonsoftJson",
"ConfigureServices(...)"));
}
}
}

View File

@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Html;
using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc.Rendering namespace Microsoft.AspNetCore.Mvc.Rendering
{ {
@ -17,15 +16,5 @@ namespace Microsoft.AspNetCore.Mvc.Rendering
/// <param name="value">The value to serialize as JSON.</param> /// <param name="value">The value to serialize as JSON.</param>
/// <returns>A new <see cref="IHtmlContent"/> containing the serialized JSON.</returns> /// <returns>A new <see cref="IHtmlContent"/> containing the serialized JSON.</returns>
IHtmlContent Serialize(object value); IHtmlContent Serialize(object value);
/// <summary>
/// Returns serialized JSON for the <paramref name="value"/>.
/// </summary>
/// <param name="value">The value to serialize as JSON.</param>
/// <param name="serializerSettings">
/// The <see cref="JsonSerializerSettings"/> to be used by the serializer.
/// </param>
/// <returns>A new <see cref="IHtmlContent"/> containing the serialized JSON.</returns>
IHtmlContent Serialize(object value, JsonSerializerSettings serializerSettings);
} }
} }

View File

@ -259,15 +259,6 @@
<data name="ViewComponentResult_NameOrTypeMustBeSet" xml:space="preserve"> <data name="ViewComponentResult_NameOrTypeMustBeSet" xml:space="preserve">
<value>Either the '{0}' or '{1}' property must be set in order to invoke a view component.</value> <value>Either the '{0}' or '{1}' property must be set in order to invoke a view component.</value>
</data> </data>
<data name="TempData_CannotDeserializeToken" xml:space="preserve">
<value>Cannot deserialize {0} of type '{1}'.</value>
</data>
<data name="TempData_CannotSerializeDictionary" xml:space="preserve">
<value>The '{0}' cannot serialize a dictionary with a key of type '{1}'. The key must be of type '{2}'.</value>
</data>
<data name="TempData_CannotSerializeType" xml:space="preserve">
<value>The '{0}' cannot serialize an object of type '{1}'.</value>
</data>
<data name="Dictionary_DuplicateKey" xml:space="preserve"> <data name="Dictionary_DuplicateKey" xml:space="preserve">
<value>The collection already contains an entry with key '{0}'.</value> <value>The collection already contains an entry with key '{0}'.</value>
</data> </data>
@ -286,10 +277,16 @@
<data name="ViewEnginesAreRequired" xml:space="preserve"> <data name="ViewEnginesAreRequired" xml:space="preserve">
<value>'{0}.{1}' must not be empty. At least one '{2}' is required to locate a view for rendering.</value> <value>'{0}.{1}' must not be empty. At least one '{2}' is required to locate a view for rendering.</value>
</data> </data>
<data name="TempDataProperties_InvalidType" xml:space="preserve">
<value>The '{0}.{1}' property with {2} is invalid.</value>
</data>
<data name="TempDataProperties_PublicGetterSetter" xml:space="preserve"> <data name="TempDataProperties_PublicGetterSetter" xml:space="preserve">
<value>The '{0}.{1}' property with {2} is invalid. A property using {2} must have a public getter and setter.</value> <value>The '{0}.{1}' property with {2} is invalid. A property using {2} must have a public getter and setter.</value>
</data> </data>
<data name="TempDataProperties_InvalidType" xml:space="preserve">
<value>TempData serializer '{0}' cannot serialize property '{1}.{2}' of type '{3}'.</value>
</data>
<data name="DeserializingTempData" xml:space="preserve">
<value>Deserializing TempDataDictionary</value>
</data>
<data name="SerializingTempData" xml:space="preserve">
<value>Serializing TempDataDictionary</value>
</data>
</root> </root>

View File

@ -4,7 +4,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Filters; using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures namespace Microsoft.AspNetCore.Mvc.ViewFeatures
{ {
@ -17,9 +17,9 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
internal const string TempDataSessionStateKey = "__ControllerTempData"; internal const string TempDataSessionStateKey = "__ControllerTempData";
private readonly TempDataSerializer _tempDataSerializer; private readonly TempDataSerializer _tempDataSerializer;
public SessionStateTempDataProvider() public SessionStateTempDataProvider(TempDataSerializer tempDataSerializer)
{ {
_tempDataSerializer = new TempDataSerializer(); _tempDataSerializer = tempDataSerializer;
} }
/// <inheritdoc /> /// <inheritdoc />

View File

@ -13,7 +13,6 @@
<Reference Include="Microsoft.AspNetCore.Mvc.ApiExplorer" /> <Reference Include="Microsoft.AspNetCore.Mvc.ApiExplorer" />
<Reference Include="Microsoft.AspNetCore.Mvc.Cors" /> <Reference Include="Microsoft.AspNetCore.Mvc.Cors" />
<Reference Include="Microsoft.AspNetCore.Mvc.DataAnnotations" /> <Reference Include="Microsoft.AspNetCore.Mvc.DataAnnotations" />
<Reference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" />
<Reference Include="Microsoft.AspNetCore.Mvc.Localization" /> <Reference Include="Microsoft.AspNetCore.Mvc.Localization" />
<Reference Include="Microsoft.AspNetCore.Mvc.RazorPages" /> <Reference Include="Microsoft.AspNetCore.Mvc.RazorPages" />
<Reference Include="Microsoft.AspNetCore.Mvc.TagHelpers" /> <Reference Include="Microsoft.AspNetCore.Mvc.TagHelpers" />

View File

@ -49,9 +49,6 @@ namespace Microsoft.Extensions.DependencyInjection
// +1 order // +1 order
builder.AddDataAnnotations(); // +1 order builder.AddDataAnnotations(); // +1 order
// +10 order
builder.AddJsonFormatters();
builder.AddCors(); builder.AddCors();
return new MvcBuilder(builder.Services, builder.PartManager); return new MvcBuilder(builder.Services, builder.PartManager);

View File

@ -6,7 +6,7 @@
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.AspNetCore.Mvc.ApiExplorer" /> <Reference Include="Microsoft.AspNetCore.Mvc.ApiExplorer" />
<Reference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" /> <Reference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" />
<ProjectReference Include="..\Microsoft.AspNetCore.Mvc.Core.TestCommon\Microsoft.AspNetCore.Mvc.Core.TestCommon.csproj" /> <ProjectReference Include="..\Microsoft.AspNetCore.Mvc.Core.TestCommon\Microsoft.AspNetCore.Mvc.Core.TestCommon.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -91,7 +91,7 @@ namespace Microsoft.AspNetCore.Mvc
{ {
var options = Options.Create(new MvcOptions()); var options = Options.Create(new MvcOptions());
options.Value.OutputFormatters.Add(new StringOutputFormatter()); options.Value.OutputFormatters.Add(new StringOutputFormatter());
options.Value.OutputFormatters.Add(new JsonOutputFormatter( options.Value.OutputFormatters.Add(new NewtonsoftJsonOutputFormatter(
new JsonSerializerSettings(), new JsonSerializerSettings(),
ArrayPool<char>.Shared)); ArrayPool<char>.Shared));

View File

@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Testing; using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -106,7 +107,7 @@ namespace Microsoft.AspNetCore.Mvc
{ {
var options = Options.Create(new MvcOptions()); var options = Options.Create(new MvcOptions());
options.Value.OutputFormatters.Add(new StringOutputFormatter()); options.Value.OutputFormatters.Add(new StringOutputFormatter());
options.Value.OutputFormatters.Add(new JsonOutputFormatter( options.Value.OutputFormatters.Add(new NewtonsoftJsonOutputFormatter(
new JsonSerializerSettings(), new JsonSerializerSettings(),
ArrayPool<char>.Shared)); ArrayPool<char>.Shared));

View File

@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
@ -92,7 +93,7 @@ namespace Microsoft.AspNetCore.Mvc
{ {
var options = Options.Create(new MvcOptions()); var options = Options.Create(new MvcOptions());
options.Value.OutputFormatters.Add(new StringOutputFormatter()); options.Value.OutputFormatters.Add(new StringOutputFormatter());
options.Value.OutputFormatters.Add(new JsonOutputFormatter( options.Value.OutputFormatters.Add(new NewtonsoftJsonOutputFormatter(
new JsonSerializerSettings(), new JsonSerializerSettings(),
ArrayPool<char>.Shared)); ArrayPool<char>.Shared));

View File

@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Testing; using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
@ -467,7 +468,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
// Set up default output formatters. // Set up default output formatters.
MvcOptions.OutputFormatters.Add(new HttpNoContentOutputFormatter()); MvcOptions.OutputFormatters.Add(new HttpNoContentOutputFormatter());
MvcOptions.OutputFormatters.Add(new StringOutputFormatter()); MvcOptions.OutputFormatters.Add(new StringOutputFormatter());
MvcOptions.OutputFormatters.Add(new JsonOutputFormatter( MvcOptions.OutputFormatters.Add(new NewtonsoftJsonOutputFormatter(
new JsonSerializerSettings(), new JsonSerializerSettings(),
ArrayPool<char>.Shared)); ArrayPool<char>.Shared));

View File

@ -8,6 +8,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
@ -71,7 +72,7 @@ namespace Microsoft.AspNetCore.Mvc
{ {
var options = Options.Create(new MvcOptions()); var options = Options.Create(new MvcOptions());
options.Value.OutputFormatters.Add(new StringOutputFormatter()); options.Value.OutputFormatters.Add(new StringOutputFormatter());
options.Value.OutputFormatters.Add(new JsonOutputFormatter( options.Value.OutputFormatters.Add(new NewtonsoftJsonOutputFormatter(
new JsonSerializerSettings(), new JsonSerializerSettings(),
ArrayPool<char>.Shared)); ArrayPool<char>.Shared));

View File

@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
@ -72,7 +73,7 @@ namespace Microsoft.AspNetCore.Mvc
{ {
var options = Options.Create(new MvcOptions()); var options = Options.Create(new MvcOptions());
options.Value.OutputFormatters.Add(new StringOutputFormatter()); options.Value.OutputFormatters.Add(new StringOutputFormatter());
options.Value.OutputFormatters.Add(new JsonOutputFormatter( options.Value.OutputFormatters.Add(new NewtonsoftJsonOutputFormatter(
new JsonSerializerSettings(), new JsonSerializerSettings(),
ArrayPool<char>.Shared)); ArrayPool<char>.Shared));

View File

@ -0,0 +1,32 @@
// 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.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Moq;
using Xunit;
namespace Microsoft.AspNetCore.Mvc.Core
{
public class JsonResultTest
{
[Fact]
public async Task ExecuteResultAsync_ThrowsIfExecutorIsNotAvailableInServices()
{
// Arrange
var jsonResult = new JsonResult("Hello");
var message = "'JsonResult.ExecuteResultAsync' requires a reference to 'Microsoft.AspNetCore.Mvc.NewtonsoftJson'. " +
"Configure your application by adding a reference to the 'Microsoft.AspNetCore.Mvc.NewtonsoftJson' package and calling 'IMvcBuilder.AddNewtonsoftJson' " +
"inside the call to 'ConfigureServices(...)' in the application startup code.";
var actionContext = new ActionContext
{
HttpContext = new DefaultHttpContext { RequestServices = Mock.Of<IServiceProvider>() }
};
// Act & Assert
var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => jsonResult.ExecuteResultAsync(actionContext));
Assert.Equal(message, ex.Message);
}
}
}

View File

@ -10,7 +10,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" /> <Reference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" />
<ProjectReference Include="..\Microsoft.AspNetCore.Mvc.Core.TestCommon\Microsoft.AspNetCore.Mvc.Core.TestCommon.csproj" /> <ProjectReference Include="..\Microsoft.AspNetCore.Mvc.Core.TestCommon\Microsoft.AspNetCore.Mvc.Core.TestCommon.csproj" />
<ProjectReference Include="..\Microsoft.AspNetCore.Mvc.TestDiagnosticListener\Microsoft.AspNetCore.Mvc.TestDiagnosticListener.csproj" /> <ProjectReference Include="..\Microsoft.AspNetCore.Mvc.TestDiagnosticListener\Microsoft.AspNetCore.Mvc.TestDiagnosticListener.csproj" />

View File

@ -10,6 +10,7 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Logging.Testing; using Microsoft.Extensions.Logging.Testing;
@ -711,12 +712,12 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders
} }
} }
private class TestableJsonInputFormatter : JsonInputFormatter private class TestableJsonInputFormatter : NewtonsoftJsonInputFormatter
{ {
private readonly bool _throwNonInputFormatterException; private readonly bool _throwNonInputFormatterException;
public TestableJsonInputFormatter(bool throwNonInputFormatterException) public TestableJsonInputFormatter(bool throwNonInputFormatterException)
: base(GetLogger(), new JsonSerializerSettings(), ArrayPool<char>.Shared, new DefaultObjectPoolProvider(), new MvcOptions(), new MvcJsonOptions() : base(GetLogger(), new JsonSerializerSettings(), ArrayPool<char>.Shared, new DefaultObjectPoolProvider(), new MvcOptions(), new MvcNewtonsoftJsonOptions()
{ {
// The tests that use this class rely on the 2.1 behavior of this formatter. // The tests that use this class rely on the 2.1 behavior of this formatter.
AllowInputFormatterExceptionMessages = true, AllowInputFormatterExceptionMessages = true,
@ -781,12 +782,12 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders
} }
} }
private class DerivedJsonInputFormatter : JsonInputFormatter private class DerivedJsonInputFormatter : NewtonsoftJsonInputFormatter
{ {
private readonly bool _throwNonInputFormatterException; private readonly bool _throwNonInputFormatterException;
public DerivedJsonInputFormatter(bool throwNonInputFormatterException) public DerivedJsonInputFormatter(bool throwNonInputFormatterException)
: base(GetLogger(), new JsonSerializerSettings(), ArrayPool<char>.Shared, new DefaultObjectPoolProvider(), new MvcOptions(), new MvcJsonOptions() : base(GetLogger(), new JsonSerializerSettings(), ArrayPool<char>.Shared, new DefaultObjectPoolProvider(), new MvcOptions(), new MvcNewtonsoftJsonOptions()
{ {
// The tests that use this class rely on the 2.1 behavior of this formatter. // The tests that use this class rely on the 2.1 behavior of this formatter.
AllowInputFormatterExceptionMessages = true, AllowInputFormatterExceptionMessages = true,

View File

@ -10,6 +10,7 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using BasicWebSite.Models; using BasicWebSite.Models;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Xunit; using Xunit;
@ -53,7 +54,12 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
// Assert // Assert
await response.AssertStatusCodeAsync(HttpStatusCode.BadRequest); await response.AssertStatusCodeAsync(HttpStatusCode.BadRequest);
Assert.Equal("application/problem+json", response.Content.Headers.ContentType.MediaType); Assert.Equal("application/problem+json", response.Content.Headers.ContentType.MediaType);
var problemDetails = JsonConvert.DeserializeObject<ValidationProblemDetails>(await response.Content.ReadAsStringAsync()); var problemDetails = JsonConvert.DeserializeObject<ValidationProblemDetails>(
await response.Content.ReadAsStringAsync(),
new JsonSerializerSettings
{
Converters = { new ValidationProblemDetailsConverter() }
});
Assert.Collection( Assert.Collection(
problemDetails.Errors.OrderBy(kvp => kvp.Key), problemDetails.Errors.OrderBy(kvp => kvp.Key),
kvp => kvp =>
@ -273,7 +279,12 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
// Assert // Assert
await response.AssertStatusCodeAsync(HttpStatusCode.NotFound); await response.AssertStatusCodeAsync(HttpStatusCode.NotFound);
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
var problemDetails = JsonConvert.DeserializeObject<ProblemDetails>(content); var problemDetails = JsonConvert.DeserializeObject<ProblemDetails>(
content,
new JsonSerializerSettings
{
Converters = { new ProblemDetailsConverter() }
});
Assert.Equal(404, problemDetails.Status); Assert.Equal(404, problemDetails.Status);
Assert.Collection( Assert.Collection(
problemDetails.Extensions, problemDetails.Extensions,
@ -328,7 +339,12 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
// Assert // Assert
await response.AssertStatusCodeAsync(HttpStatusCode.BadRequest); await response.AssertStatusCodeAsync(HttpStatusCode.BadRequest);
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
var validationProblemDetails = JsonConvert.DeserializeObject<ValidationProblemDetails>(content); var validationProblemDetails = JsonConvert.DeserializeObject<ValidationProblemDetails>(
content,
new JsonSerializerSettings
{
Converters = { new ValidationProblemDetailsConverter() }
});
Assert.Equal("Error", validationProblemDetails.Title); Assert.Equal("Error", validationProblemDetails.Title);
Assert.Equal(400, validationProblemDetails.Status); Assert.Equal(400, validationProblemDetails.Status);

View File

@ -575,7 +575,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
// Arrange // Arrange
var type1 = typeof(ApiExplorerWebSite.Product).FullName; var type1 = typeof(ApiExplorerWebSite.Product).FullName;
var type2 = typeof(SerializableError).FullName; var type2 = typeof(SerializableError).FullName;
var expectedMediaTypes = new[] { "application/json", "text/json", "application/xml", "text/xml" }; var expectedMediaTypes = new[] { "application/json", "application/xml", "text/json", "text/xml" };
// Act // Act
var response = await Client.GetAsync( var response = await Client.GetAsync(
@ -592,13 +592,13 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
Assert.Equal(201, responseType.StatusCode); Assert.Equal(201, responseType.StatusCode);
Assert.Equal( Assert.Equal(
expectedMediaTypes, expectedMediaTypes,
responseType.ResponseFormats.Select(responseFormat => responseFormat.MediaType).ToArray()); responseType.ResponseFormats.Select(responseFormat => responseFormat.MediaType).OrderBy(o => o).ToArray());
responseType = description.SupportedResponseTypes[1]; responseType = description.SupportedResponseTypes[1];
Assert.Equal(type2, responseType.ResponseType); Assert.Equal(type2, responseType.ResponseType);
Assert.Equal(400, responseType.StatusCode); Assert.Equal(400, responseType.StatusCode);
Assert.Equal( Assert.Equal(
expectedMediaTypes, expectedMediaTypes,
responseType.ResponseFormats.Select(responseFormat => responseFormat.MediaType).ToArray()); responseType.ResponseFormats.Select(responseFormat => responseFormat.MediaType).OrderBy(o => o).ToArray());
} }
[Fact] [Fact]
@ -639,7 +639,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
// Arrange // Arrange
var type1 = typeof(ApiExplorerWebSite.Product).FullName; var type1 = typeof(ApiExplorerWebSite.Product).FullName;
var type2 = typeof(SerializableError).FullName; var type2 = typeof(SerializableError).FullName;
var expectedMediaTypes = new[] { "application/json", "text/json", "application/xml", "text/xml" }; var expectedMediaTypes = new[] { "application/json", "application/xml", "text/json", "text/xml" };
// Act // Act
var response = await Client.GetAsync( var response = await Client.GetAsync(
@ -656,13 +656,13 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
Assert.Equal(200, responseType.StatusCode); Assert.Equal(200, responseType.StatusCode);
Assert.Equal( Assert.Equal(
expectedMediaTypes, expectedMediaTypes,
responseType.ResponseFormats.Select(responseFormat => responseFormat.MediaType).ToArray()); responseType.ResponseFormats.Select(responseFormat => responseFormat.MediaType).OrderBy(o => o).ToArray());
responseType = description.SupportedResponseTypes[1]; responseType = description.SupportedResponseTypes[1];
Assert.Equal(type2, responseType.ResponseType); Assert.Equal(type2, responseType.ResponseType);
Assert.Equal(400, responseType.StatusCode); Assert.Equal(400, responseType.StatusCode);
Assert.Equal( Assert.Equal(
expectedMediaTypes, expectedMediaTypes,
responseType.ResponseFormats.Select(responseFormat => responseFormat.MediaType).ToArray()); responseType.ResponseFormats.Select(responseFormat => responseFormat.MediaType).OrderBy(o => o).ToArray());
} }
[Fact] [Fact]
@ -789,9 +789,9 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
Assert.Equal(typeof(XmlDataContractSerializerOutputFormatter).FullName, applicationXml.FormatterType); Assert.Equal(typeof(XmlDataContractSerializerOutputFormatter).FullName, applicationXml.FormatterType);
var textJson = Assert.Single(responseType.ResponseFormats, f => f.MediaType == "text/json"); var textJson = Assert.Single(responseType.ResponseFormats, f => f.MediaType == "text/json");
Assert.Equal(typeof(JsonOutputFormatter).FullName, textJson.FormatterType); Assert.Equal(typeof(NewtonsoftJsonOutputFormatter).FullName, textJson.FormatterType);
var applicationJson = Assert.Single(responseType.ResponseFormats, f => f.MediaType == "application/json"); var applicationJson = Assert.Single(responseType.ResponseFormats, f => f.MediaType == "application/json");
Assert.Equal(typeof(JsonOutputFormatter).FullName, applicationJson.FormatterType); Assert.Equal(typeof(NewtonsoftJsonOutputFormatter).FullName, applicationJson.FormatterType);
} }
[Fact] [Fact]
@ -812,10 +812,10 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
var applicationJson = Assert.Single( var applicationJson = Assert.Single(
responseType.ResponseFormats, responseType.ResponseFormats,
format => format.MediaType == "application/json"); format => format.MediaType == "application/json");
Assert.Equal(typeof(JsonOutputFormatter).FullName, applicationJson.FormatterType); Assert.Equal(typeof(NewtonsoftJsonOutputFormatter).FullName, applicationJson.FormatterType);
var textJson = Assert.Single(responseType.ResponseFormats, f => f.MediaType == "text/json"); var textJson = Assert.Single(responseType.ResponseFormats, f => f.MediaType == "text/json");
Assert.Equal(typeof(JsonOutputFormatter).FullName, textJson.FormatterType); Assert.Equal(typeof(NewtonsoftJsonOutputFormatter).FullName, textJson.FormatterType);
} }
[Fact] [Fact]
@ -840,7 +840,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
responseFormat => responseFormat =>
{ {
Assert.Equal("application/hal+json", responseFormat.MediaType); Assert.Equal("application/hal+json", responseFormat.MediaType);
Assert.Equal(typeof(JsonOutputFormatter).FullName, responseFormat.FormatterType); Assert.Equal(typeof(NewtonsoftJsonOutputFormatter).FullName, responseFormat.FormatterType);
}); });
} }
@ -869,12 +869,12 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
[ConditionalTheory] [ConditionalTheory]
// Mono issue - https://github.com/aspnet/External/issues/18 // Mono issue - https://github.com/aspnet/External/issues/18
[FrameworkSkipCondition(RuntimeFrameworks.Mono)] [FrameworkSkipCondition(RuntimeFrameworks.Mono)]
[InlineData("Controller", "text/xml", "Microsoft.AspNetCore.Mvc.Formatters.XmlDataContractSerializerOutputFormatter")] [InlineData("Controller", "text/xml", typeof(XmlDataContractSerializerOutputFormatter))]
[InlineData("Action", "application/json", "Microsoft.AspNetCore.Mvc.Formatters.JsonOutputFormatter")] [InlineData("Action", "application/json", typeof(NewtonsoftJsonOutputFormatter))]
public async Task ApiExplorer_ResponseContentType_OverrideOnAction( public async Task ApiExplorer_ResponseContentType_OverrideOnAction(
string action, string action,
string contentType, string contentType,
string formatterType) Type formatterType)
{ {
// Arrange & Act // Arrange & Act
var response = await Client.GetAsync( var response = await Client.GetAsync(
@ -889,7 +889,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
var responseType = Assert.Single(description.SupportedResponseTypes); var responseType = Assert.Single(description.SupportedResponseTypes);
var responseFormat = Assert.Single(responseType.ResponseFormats); var responseFormat = Assert.Single(responseType.ResponseFormats);
Assert.Equal(contentType, responseFormat.MediaType); Assert.Equal(contentType, responseFormat.MediaType);
Assert.Equal(formatterType, responseFormat.FormatterType); Assert.Equal(formatterType.FullName, responseFormat.FormatterType);
} }
[Fact] [Fact]

View File

@ -280,7 +280,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
Assert.Equal("text/html", response.Content.Headers.ContentType.MediaType); Assert.Equal("text/html", response.Content.Headers.ContentType.MediaType);
var actualBody = await response.Content.ReadAsStringAsync(); var actualBody = await response.Content.ReadAsStringAsync();
Assert.Equal(expectedBody, actualBody, ignoreLineEndingDifferences: true); Assert.Equal(expectedBody, actualBody.Trim(), ignoreLineEndingDifferences: true);
} }
[Fact] [Fact]
@ -302,7 +302,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
Assert.Equal("text/html", response.Content.Headers.ContentType.MediaType); Assert.Equal("text/html", response.Content.Headers.ContentType.MediaType);
var actualBody = await response.Content.ReadAsStringAsync(); var actualBody = await response.Content.ReadAsStringAsync();
Assert.Equal(expectedBody, actualBody, ignoreLineEndingDifferences: true); Assert.Equal(expectedBody, actualBody.Trim(), ignoreLineEndingDifferences: true);
} }
public static IEnumerable<object[]> HtmlHelperLinkGenerationData public static IEnumerable<object[]> HtmlHelperLinkGenerationData

View File

@ -8,6 +8,7 @@ using System.Net.Http.Headers;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.AspNetCore.Testing.xunit; using Microsoft.AspNetCore.Testing.xunit;
using Newtonsoft.Json; using Newtonsoft.Json;
using Xunit; using Xunit;

View File

@ -38,13 +38,13 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
var redirectResponse = await Client.PostAsync("TempDataProperty/CreateForView", content); var redirectResponse = await Client.PostAsync("TempDataProperty/CreateForView", content);
// Assert 1 // Assert 1
Assert.Equal(HttpStatusCode.Redirect, redirectResponse.StatusCode); await redirectResponse.AssertStatusCodeAsync(HttpStatusCode.Redirect);
// Act 2 // Act 2
var response = await Client.SendAsync(GetRequest(redirectResponse.Headers.Location.ToString(), redirectResponse)); var response = await Client.SendAsync(GetRequest(redirectResponse.Headers.Location.ToString(), redirectResponse));
// Assert 2 // Assert 2
Assert.Equal(HttpStatusCode.OK, response.StatusCode); await response.AssertStatusCodeAsync(HttpStatusCode.OK);
var body = await response.Content.ReadAsStringAsync(); var body = await response.Content.ReadAsStringAsync();
Assert.Equal(expected, body.ToString().Trim()); Assert.Equal(expected, body.ToString().Trim());
} }

View File

@ -453,7 +453,7 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
}); });
// Override the AllowInputFormatterExceptionMessages setting ModelBindingTestHelper chooses. // Override the AllowInputFormatterExceptionMessages setting ModelBindingTestHelper chooses.
var options = testContext.GetService<IOptions<MvcJsonOptions>>().Value; var options = testContext.GetService<IOptions<MvcNewtonsoftJsonOptions>>().Value;
options.AllowInputFormatterExceptionMessages = false; options.AllowInputFormatterExceptionMessages = false;
var parameterBinder = ModelBindingTestHelper.GetParameterBinder(testContext.HttpContext.RequestServices); var parameterBinder = ModelBindingTestHelper.GetParameterBinder(testContext.HttpContext.RequestServices);
@ -553,7 +553,7 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
}); });
// Override the AllowInputFormatterExceptionMessages setting ModelBindingTestHelper chooses. // Override the AllowInputFormatterExceptionMessages setting ModelBindingTestHelper chooses.
var options = testContext.GetService<IOptions<MvcJsonOptions>>().Value; var options = testContext.GetService<IOptions<MvcNewtonsoftJsonOptions>>().Value;
options.AllowInputFormatterExceptionMessages = false; options.AllowInputFormatterExceptionMessages = false;
var parameterBinder = ModelBindingTestHelper.GetParameterBinder(testContext.HttpContext.RequestServices); var parameterBinder = ModelBindingTestHelper.GetParameterBinder(testContext.HttpContext.RequestServices);

View File

@ -6,6 +6,7 @@
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.AspNetCore.Mvc" /> <Reference Include="Microsoft.AspNetCore.Mvc" />
<Reference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" />
<ProjectReference Include="..\Microsoft.AspNetCore.Mvc.Core.TestCommon\Microsoft.AspNetCore.Mvc.Core.TestCommon.csproj" /> <ProjectReference Include="..\Microsoft.AspNetCore.Mvc.Core.TestCommon\Microsoft.AspNetCore.Mvc.Core.TestCommon.csproj" />
<Reference Include="Microsoft.Extensions.Logging" /> <Reference Include="Microsoft.Extensions.Logging" />

View File

@ -191,7 +191,8 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
serviceCollection.AddSingleton(Options.Create(mvcOptions)); serviceCollection.AddSingleton(Options.Create(mvcOptions));
} }
serviceCollection.AddMvc(); serviceCollection.AddMvc()
.AddNewtonsoftJson();
serviceCollection serviceCollection
.AddSingleton<ILoggerFactory>(NullLoggerFactory.Instance) .AddSingleton<ILoggerFactory>(NullLoggerFactory.Instance)
.AddTransient<ILogger<DefaultAuthorizationService>, Logger<DefaultAuthorizationService>>(); .AddTransient<ILogger<DefaultAuthorizationService>, Logger<DefaultAuthorizationService>>();

View File

@ -5,7 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Xunit; using Xunit;
@ -28,7 +28,7 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
}, },
// Using a service type already in defaults. // Using a service type already in defaults.
ParameterType = typeof(JsonOutputFormatter) ParameterType = typeof(ITypeActivatorCache)
}; };
var testContext = ModelBindingTestHelper.GetTestContext(); var testContext = ModelBindingTestHelper.GetTestContext();
@ -43,8 +43,8 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
Assert.True(modelBindingResult.IsModelSet); Assert.True(modelBindingResult.IsModelSet);
// Model // Model
var outputFormatter = Assert.IsType<JsonOutputFormatter>(modelBindingResult.Model); var provider = Assert.IsAssignableFrom<ITypeActivatorCache>(modelBindingResult.Model);
Assert.NotNull(outputFormatter); Assert.NotNull(provider);
// ModelState // ModelState
Assert.True(modelState.IsValid); Assert.True(modelState.IsValid);
@ -65,7 +65,7 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
}, },
// Use a service type already in defaults. // Use a service type already in defaults.
ParameterType = typeof(JsonOutputFormatter), ParameterType = typeof(ITypeActivatorCache),
}; };
var testContext = ModelBindingTestHelper.GetTestContext(); var testContext = ModelBindingTestHelper.GetTestContext();
@ -79,8 +79,8 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
Assert.True(modelBindingResult.IsModelSet); Assert.True(modelBindingResult.IsModelSet);
// Model // Model
var outputFormatter = Assert.IsType<JsonOutputFormatter>(modelBindingResult.Model); var provider = Assert.IsAssignableFrom<ITypeActivatorCache>(modelBindingResult.Model);
Assert.NotNull(outputFormatter); Assert.NotNull(provider);
// ModelState // ModelState
Assert.True(modelState.IsValid); Assert.True(modelState.IsValid);
@ -101,7 +101,7 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
}, },
// Use a service type already in defaults. // Use a service type already in defaults.
ParameterType = typeof(IEnumerable<JsonOutputFormatter>), ParameterType = typeof(IEnumerable<ITypeActivatorCache>),
}; };
var testContext = ModelBindingTestHelper.GetTestContext(); var testContext = ModelBindingTestHelper.GetTestContext();
@ -115,7 +115,7 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
Assert.True(modelBindingResult.IsModelSet); Assert.True(modelBindingResult.IsModelSet);
// Model // Model
var formatterArray = Assert.IsType<JsonOutputFormatter[]>(modelBindingResult.Model); var formatterArray = Assert.IsType<ITypeActivatorCache[]>(modelBindingResult.Model);
Assert.Single(formatterArray); Assert.Single(formatterArray);
// ModelState // ModelState
@ -186,7 +186,7 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
private class Person private class Person
{ {
public JsonOutputFormatter Service { get; set; } public ITypeActivatorCache Service { get; set; }
} }
// [FromServices] cannot be associated with a type. But a [FromServices] or [ModelBinder] subclass or custom // [FromServices] cannot be associated with a type. But a [FromServices] or [ModelBinder] subclass or custom
@ -240,7 +240,7 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
// Similar to a custom IBindingSourceMetadata implementation or [ModelBinder] subclass on a custom service. // Similar to a custom IBindingSourceMetadata implementation or [ModelBinder] subclass on a custom service.
var metadataProvider = new TestModelMetadataProvider(); var metadataProvider = new TestModelMetadataProvider();
metadataProvider metadataProvider
.ForType<JsonOutputFormatter>() .ForType<ITypeActivatorCache>()
.BindingDetails(binding => binding.BindingSource = BindingSource.Services); .BindingDetails(binding => binding.BindingSource = BindingSource.Services);
var testContext = ModelBindingTestHelper.GetTestContext(metadataProvider: metadataProvider); var testContext = ModelBindingTestHelper.GetTestContext(metadataProvider: metadataProvider);
@ -250,7 +250,7 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
{ {
Name = "parameter-name", Name = "parameter-name",
BindingInfo = bindingInfo, BindingInfo = bindingInfo,
ParameterType = typeof(JsonOutputFormatter), ParameterType = typeof(ITypeActivatorCache),
}; };
// Act // Act
@ -258,7 +258,7 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
// Assert // Assert
Assert.True(modelBindingResult.IsModelSet); Assert.True(modelBindingResult.IsModelSet);
Assert.IsType<JsonOutputFormatter>(modelBindingResult.Model); Assert.IsAssignableFrom<ITypeActivatorCache>(modelBindingResult.Model);
Assert.True(modelState.IsValid); Assert.True(modelState.IsValid);
Assert.Empty(modelState); Assert.Empty(modelState);

View File

@ -36,11 +36,11 @@ namespace Microsoft.AspNetCore.Mvc.IntegrationTests
dataAnnotationOptionsSetup.Configure(Value); dataAnnotationOptionsSetup.Configure(Value);
var loggerFactory = new LoggerFactory(); var loggerFactory = new LoggerFactory();
var jsonOptions = Options.Create(new MvcJsonOptions()); var jsonOptions = Options.Create(new MvcNewtonsoftJsonOptions());
var charPool = ArrayPool<char>.Shared; var charPool = ArrayPool<char>.Shared;
var objectPoolProvider = new DefaultObjectPoolProvider(); var objectPoolProvider = new DefaultObjectPoolProvider();
var mvcJsonMvcOptionsSetup = new MvcJsonMvcOptionsSetup( var mvcJsonMvcOptionsSetup = new NewtonosftJsonMvcOptionsSetup(
loggerFactory, loggerFactory,
jsonOptions, jsonOptions,
charPool, charPool,

View File

@ -5,9 +5,9 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
public class TempDataSerializerTest public class BsonTempDataSerializerTest
{ {
public static TheoryData<object, Type> InvalidTypes public static TheoryData<object, Type> InvalidTypes
{ {
@ -29,14 +29,14 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
public void EnsureObjectCanBeSerialized_ThrowsException_OnInvalidType(object value, Type type) public void EnsureObjectCanBeSerialized_ThrowsException_OnInvalidType(object value, Type type)
{ {
// Arrange // Arrange
var testProvider = new TempDataSerializer(); var testProvider = new BsonTempDataSerializer();
// Act & Assert // Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => var exception = Assert.Throws<InvalidOperationException>(() =>
{ {
testProvider.EnsureObjectCanBeSerialized(value); testProvider.EnsureObjectCanBeSerialized(value);
}); });
Assert.Equal($"The '{typeof(TempDataSerializer).FullName}' cannot serialize " + Assert.Equal($"The '{typeof(BsonTempDataSerializer).FullName}' cannot serialize " +
$"an object of type '{type}'.", $"an object of type '{type}'.",
exception.Message); exception.Message);
} }
@ -60,14 +60,14 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
public void EnsureObjectCanBeSerialized_ThrowsException_OnInvalidDictionaryType(object value, Type type) public void EnsureObjectCanBeSerialized_ThrowsException_OnInvalidDictionaryType(object value, Type type)
{ {
// Arrange // Arrange
var testProvider = new TempDataSerializer(); var testProvider = new BsonTempDataSerializer();
// Act & Assert // Act & Assert
var exception = Assert.Throws<InvalidOperationException>(() => var exception = Assert.Throws<InvalidOperationException>(() =>
{ {
testProvider.EnsureObjectCanBeSerialized(value); testProvider.EnsureObjectCanBeSerialized(value);
}); });
Assert.Equal($"The '{typeof(TempDataSerializer).FullName}' cannot serialize a dictionary " + Assert.Equal($"The '{typeof(BsonTempDataSerializer).FullName}' cannot serialize a dictionary " +
$"with a key of type '{type}'. The key must be of type 'System.String'.", $"with a key of type '{type}'. The key must be of type 'System.String'.",
exception.Message); exception.Message);
} }
@ -98,7 +98,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
public void EnsureObjectCanBeSerialized_DoesNotThrow_OnValidType(object value) public void EnsureObjectCanBeSerialized_DoesNotThrow_OnValidType(object value)
{ {
// Arrange // Arrange
var testProvider = new TempDataSerializer(); var testProvider = new BsonTempDataSerializer();
// Act & Assert (Does not throw) // Act & Assert (Does not throw)
testProvider.EnsureObjectCanBeSerialized(value); testProvider.EnsureObjectCanBeSerialized(value);
@ -108,7 +108,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
public void DeserializeTempData_ReturnsEmptyDictionary_DataIsEmpty() public void DeserializeTempData_ReturnsEmptyDictionary_DataIsEmpty()
{ {
// Arrange // Arrange
var serializer = new TempDataSerializer(); var serializer = new BsonTempDataSerializer();
// Act // Act
var tempDataDictionary = serializer.Deserialize(new byte[0]); var tempDataDictionary = serializer.Deserialize(new byte[0]);
@ -123,7 +123,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters
{ {
// Arrange // Arrange
var key = "NullKey"; var key = "NullKey";
var testProvider = new TempDataSerializer(); var testProvider = new BsonTempDataSerializer();
var input = new Dictionary<string, object> var input = new Dictionary<string, object>
{ {
{ key, null } { key, null }

View File

@ -4,21 +4,20 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.AspNetCore.Mvc.Formatters.Json;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
using Xunit; using Xunit;
namespace Microsoft.Extensions.DependencyInjection namespace Microsoft.Extensions.DependencyInjection
{ {
public class MvcJsonOptionsExtensionsTests public class MvcNewtonsoftJsonOptionsExtensionsTest
{ {
[Fact] [Fact]
public void UseCamelCasing_WillSet_CamelCasingStrategy_NameStrategy() public void UseCamelCasing_WillSet_CamelCasingStrategy_NameStrategy()
{ {
// Arrange // Arrange
var options = new MvcJsonOptions(); var options = new MvcNewtonsoftJsonOptions();
options.SerializerSettings.ContractResolver = new DefaultContractResolver() options.SerializerSettings.ContractResolver = new DefaultContractResolver()
{ {
NamingStrategy = new DefaultNamingStrategy() NamingStrategy = new DefaultNamingStrategy()
@ -162,7 +161,7 @@ namespace Microsoft.Extensions.DependencyInjection
public void UseMemberCasing_WillSet_DefaultNamingStrategy_AsNamingStrategy() public void UseMemberCasing_WillSet_DefaultNamingStrategy_AsNamingStrategy()
{ {
// Arrange // Arrange
var options = new MvcJsonOptions(); var options = new MvcNewtonsoftJsonOptions();
options.SerializerSettings.ContractResolver = new DefaultContractResolver options.SerializerSettings.ContractResolver = new DefaultContractResolver
{ {
NamingStrategy = new CamelCaseNamingStrategy() NamingStrategy = new CamelCaseNamingStrategy()
@ -217,7 +216,7 @@ namespace Microsoft.Extensions.DependencyInjection
public void UseCamelCasing_WillThrow_IfContractResolver_IsNot_DefaultContractResolver() public void UseCamelCasing_WillThrow_IfContractResolver_IsNot_DefaultContractResolver()
{ {
// Arrange // Arrange
var options = new MvcJsonOptions(); var options = new MvcNewtonsoftJsonOptions();
options.SerializerSettings.ContractResolver = new FooContractResolver(); options.SerializerSettings.ContractResolver = new FooContractResolver();
var expectedMessage = Resources.FormatInvalidContractResolverForJsonCasingConfiguration(nameof(FooContractResolver), nameof(DefaultContractResolver)); var expectedMessage = Resources.FormatInvalidContractResolverForJsonCasingConfiguration(nameof(FooContractResolver), nameof(DefaultContractResolver));
@ -231,7 +230,7 @@ namespace Microsoft.Extensions.DependencyInjection
public void UseMemberCasing_WillThrow_IfContractResolver_IsNot_DefaultContractResolver() public void UseMemberCasing_WillThrow_IfContractResolver_IsNot_DefaultContractResolver()
{ {
// Arrange // Arrange
var options = new MvcJsonOptions(); var options = new MvcNewtonsoftJsonOptions();
options.SerializerSettings.ContractResolver = new FooContractResolver(); options.SerializerSettings.ContractResolver = new FooContractResolver();
var expectedMessage = Resources.FormatInvalidContractResolverForJsonCasingConfiguration(nameof(FooContractResolver), nameof(DefaultContractResolver)); var expectedMessage = Resources.FormatInvalidContractResolverForJsonCasingConfiguration(nameof(FooContractResolver), nameof(DefaultContractResolver));
@ -243,14 +242,14 @@ namespace Microsoft.Extensions.DependencyInjection
// NOTE: This method was created to make sure to create a different instance of contract resolver as by default // NOTE: This method was created to make sure to create a different instance of contract resolver as by default
// MvcJsonOptions uses a static shared instance of resolver which when changed causes other tests to fail. // MvcJsonOptions uses a static shared instance of resolver which when changed causes other tests to fail.
private MvcJsonOptions CreateDefaultMvcJsonOptions() private MvcNewtonsoftJsonOptions CreateDefaultMvcJsonOptions()
{ {
var options = new MvcJsonOptions(); var options = new MvcNewtonsoftJsonOptions();
options.SerializerSettings.ContractResolver = JsonSerializerSettingsProvider.CreateContractResolver(); options.SerializerSettings.ContractResolver = JsonSerializerSettingsProvider.CreateContractResolver();
return options; return options;
} }
private static string SerializeToJson(MvcJsonOptions options, object value) private static string SerializeToJson(MvcNewtonsoftJsonOptions options, object value)
{ {
return JsonConvert.SerializeObject( return JsonConvert.SerializeObject(
value: value, value: value,

View File

@ -0,0 +1,30 @@
// 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;
using Microsoft.Extensions.Options;
using Newtonsoft.Json.Serialization;
using Xunit;
namespace Microsoft.Extensions.DependencyInjection
{
public class NewtonsoftJsonMvcBuilderExtensionsTest
{
[Fact]
public void AddNewtonsoftJson_ConfiguresOptions()
{
// Arrange
var services = new ServiceCollection();
// Act
services.AddMvc()
.AddNewtonsoftJson((options) =>
{
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
// Assert
Assert.Single(services, d => d.ServiceType == typeof(IConfigureOptions<MvcNewtonsoftJsonOptions>));
}
}
}

View File

@ -0,0 +1,63 @@
// 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;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
using Microsoft.Extensions.Options;
using Newtonsoft.Json.Serialization;
using Xunit;
namespace Microsoft.Extensions.DependencyInjection
{
public class NewtonsoftJsonMvcCoreBuilderExtensionsTest
{
[Fact]
public void AddNewtonsoftJson_ConfiguresOptions()
{
// Arrange
var services = new ServiceCollection();
// Act
services.AddMvcCore()
.AddNewtonsoftJson((options) =>
{
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
// Assert
Assert.Single(services, d => d.ServiceType == typeof(IConfigureOptions<MvcNewtonsoftJsonOptions>));
}
[Fact]
public void AddServicesCore_ReplacesDefaultJsonHelper()
{
// Arrange
var services = new ServiceCollection()
.AddSingleton<IJsonHelper, DefaultJsonHelper>();
// Act
NewtonsoftJsonMvcCoreBuilderExtensions.AddServicesCore(services);
// Assert
var jsonHelper = Assert.Single(services, d => d.ServiceType == typeof(IJsonHelper));
Assert.Same(typeof(NewtonsoftJsonHelper), jsonHelper.ImplementationType);
}
[Fact]
public void AddServicesCore_ReplacesDefaultTempDataSerializer()
{
// Arrange
var services = new ServiceCollection()
.AddSingleton<TempDataSerializer, DefaultTempDataSerializer>();
// Act
NewtonsoftJsonMvcCoreBuilderExtensions.AddServicesCore(services);
// Assert
var tempDataSerializer = Assert.Single(services, d => d.ServiceType == typeof(TempDataSerializer));
Assert.Same(typeof(BsonTempDataSerializer), tempDataSerializer.ImplementationType);
}
}
}

View File

@ -8,7 +8,7 @@ using Newtonsoft.Json;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
public class JsonHelperTest public class JsonHelperTest
{ {
@ -20,8 +20,8 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
{ {
StringEscapeHandling = StringEscapeHandling.EscapeNonAscii, StringEscapeHandling = StringEscapeHandling.EscapeNonAscii,
}; };
var helper = new JsonHelper( var helper = new NewtonsoftJsonHelper(
new JsonOutputFormatter(settings, ArrayPool<char>.Shared), new NewtonsoftJsonOutputFormatter(settings, ArrayPool<char>.Shared),
ArrayPool<char>.Shared); ArrayPool<char>.Shared);
var obj = new var obj = new
{ {
@ -48,8 +48,8 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures
NamingStrategy = new CamelCaseNamingStrategy(), NamingStrategy = new CamelCaseNamingStrategy(),
}, },
}; };
var helper = new JsonHelper( var helper = new NewtonsoftJsonHelper(
new JsonOutputFormatter(settings, ArrayPool<char>.Shared), new NewtonsoftJsonOutputFormatter(settings, ArrayPool<char>.Shared),
ArrayPool<char>.Shared); ArrayPool<char>.Shared);
var obj = new var obj = new
{ {

View File

@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Mvc.Formatters.Json namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
public class JsonPatchOperationsArrayProviderTests public class JsonPatchOperationsArrayProviderTests
{ {

View File

@ -19,7 +19,7 @@ using Moq;
using Newtonsoft.Json; using Newtonsoft.Json;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Mvc.Formatters namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
public class JsonResultExecutorTest public class JsonResultExecutorTest
{ {
@ -284,7 +284,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
return new JsonResultExecutor( return new JsonResultExecutor(
new TestHttpResponseStreamWriterFactory(), new TestHttpResponseStreamWriterFactory(),
logger ?? NullLogger<JsonResultExecutor>.Instance, logger ?? NullLogger<JsonResultExecutor>.Instance,
Options.Create(new MvcJsonOptions()), Options.Create(new MvcNewtonsoftJsonOptions()),
ArrayPool<char>.Shared); ArrayPool<char>.Shared);
} }

View File

@ -7,7 +7,7 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
@ -15,7 +15,7 @@ using Microsoft.Extensions.Options;
using Newtonsoft.Json; using Newtonsoft.Json;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Mvc namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson
{ {
public class JsonResultTest public class JsonResultTest
{ {
@ -47,11 +47,11 @@ namespace Microsoft.AspNetCore.Mvc
var executor = new JsonResultExecutor( var executor = new JsonResultExecutor(
new TestHttpResponseStreamWriterFactory(), new TestHttpResponseStreamWriterFactory(),
NullLogger<JsonResultExecutor>.Instance, NullLogger<JsonResultExecutor>.Instance,
Options.Create(new MvcJsonOptions()), Options.Create(new MvcNewtonsoftJsonOptions()),
ArrayPool<char>.Shared); ArrayPool<char>.Shared);
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton(executor); services.AddSingleton<IActionResultExecutor<JsonResult>>(executor);
httpContext.RequestServices = services.BuildServiceProvider(); httpContext.RequestServices = services.BuildServiceProvider();
return httpContext; return httpContext;

View File

@ -5,7 +5,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" /> <Reference Include="Microsoft.AspNetCore.Mvc" />
<Reference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" />
<ProjectReference Include="..\Microsoft.AspNetCore.Mvc.Core.TestCommon\Microsoft.AspNetCore.Mvc.Core.TestCommon.csproj" /> <ProjectReference Include="..\Microsoft.AspNetCore.Mvc.Core.TestCommon\Microsoft.AspNetCore.Mvc.Core.TestCommon.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -21,7 +21,7 @@ using Xunit;
namespace Microsoft.AspNetCore.Mvc.Formatters namespace Microsoft.AspNetCore.Mvc.Formatters
{ {
public class JsonInputFormatterTest public class NewtonsoftJsonInputFormatterTest
{ {
private static readonly ObjectPoolProvider _objectPoolProvider = new DefaultObjectPoolProvider(); private static readonly ObjectPoolProvider _objectPoolProvider = new DefaultObjectPoolProvider();
private static readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings(); private static readonly JsonSerializerSettings _serializerSettings = new JsonSerializerSettings();
@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
{ {
// Arrange // Arrange
#pragma warning disable CS0618 #pragma warning disable CS0618
var formatter = new JsonInputFormatter( var formatter = new NewtonsoftJsonInputFormatter(
GetLogger(), GetLogger(),
_serializerSettings, _serializerSettings,
ArrayPool<char>.Shared, ArrayPool<char>.Shared,
@ -74,13 +74,13 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
public async Task Version_2_1_Constructor_BuffersRequestBody_UsingDefaultOptions() public async Task Version_2_1_Constructor_BuffersRequestBody_UsingDefaultOptions()
{ {
// Arrange // Arrange
var formatter = new JsonInputFormatter( var formatter = new NewtonsoftJsonInputFormatter(
GetLogger(), GetLogger(),
_serializerSettings, _serializerSettings,
ArrayPool<char>.Shared, ArrayPool<char>.Shared,
_objectPoolProvider, _objectPoolProvider,
new MvcOptions(), new MvcOptions(),
new MvcJsonOptions()); new MvcNewtonsoftJsonOptions());
var content = "{name: 'Person Name', Age: '30'}"; var content = "{name: 'Person Name', Age: '30'}";
var contentBytes = Encoding.UTF8.GetBytes(content); var contentBytes = Encoding.UTF8.GetBytes(content);
@ -119,7 +119,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
{ {
// Arrange // Arrange
#pragma warning disable CS0618 #pragma warning disable CS0618
var formatter = new JsonInputFormatter( var formatter = new NewtonsoftJsonInputFormatter(
GetLogger(), GetLogger(),
_serializerSettings, _serializerSettings,
ArrayPool<char>.Shared, ArrayPool<char>.Shared,
@ -162,13 +162,13 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
{ {
SuppressInputFormatterBuffering = true, SuppressInputFormatterBuffering = true,
}; };
var formatter = new JsonInputFormatter( var formatter = new NewtonsoftJsonInputFormatter(
GetLogger(), GetLogger(),
_serializerSettings, _serializerSettings,
ArrayPool<char>.Shared, ArrayPool<char>.Shared,
_objectPoolProvider, _objectPoolProvider,
mvcOptions, mvcOptions,
new MvcJsonOptions()); new MvcNewtonsoftJsonOptions());
var content = "{name: 'Person Name', Age: '30'}"; var content = "{name: 'Person Name', Age: '30'}";
var contentBytes = Encoding.UTF8.GetBytes(content); var contentBytes = Encoding.UTF8.GetBytes(content);
@ -205,13 +205,13 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
{ {
SuppressInputFormatterBuffering = false, SuppressInputFormatterBuffering = false,
}; };
var formatter = new JsonInputFormatter( var formatter = new NewtonsoftJsonInputFormatter(
GetLogger(), GetLogger(),
_serializerSettings, _serializerSettings,
ArrayPool<char>.Shared, ArrayPool<char>.Shared,
_objectPoolProvider, _objectPoolProvider,
mvcOptions, mvcOptions,
new MvcJsonOptions()); new MvcNewtonsoftJsonOptions());
var content = "{name: 'Person Name', Age: '30'}"; var content = "{name: 'Person Name', Age: '30'}";
var contentBytes = Encoding.UTF8.GetBytes(content); var contentBytes = Encoding.UTF8.GetBytes(content);
@ -570,7 +570,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
[InlineData("{", "", "Unexpected end when reading JSON. Path '', line 1, position 1.")] [InlineData("{", "", "Unexpected end when reading JSON. Path '', line 1, position 1.")]
[InlineData("{\"a\":{\"b\"}}", "a", "Invalid character after parsing property name. Expected ':' but got: }. Path 'a', line 1, position 9.")] [InlineData("{\"a\":{\"b\"}}", "a", "Invalid character after parsing property name. Expected ':' but got: }. Path 'a', line 1, position 9.")]
[InlineData("{\"age\":\"x\"}", "age", "Could not convert string to decimal: x. Path 'age', line 1, position 10.")] [InlineData("{\"age\":\"x\"}", "age", "Could not convert string to decimal: x. Path 'age', line 1, position 10.")]
[InlineData("{\"login\":1}", "login", "Error converting value 1 to type 'Microsoft.AspNetCore.Mvc.Formatters.JsonInputFormatterTest+UserLogin'. Path 'login', line 1, position 10.")] [InlineData("{\"login\":1}", "login", "Error converting value 1 to type 'Microsoft.AspNetCore.Mvc.Formatters.NewtonsoftJsonInputFormatterTest+UserLogin'. Path 'login', line 1, position 10.")]
[InlineData("{\"login\":{\"username\":\"somevalue\"}}", "login.Password", "Required property 'Password' not found in JSON. Path 'login', line 1, position 33.")] [InlineData("{\"login\":{\"username\":\"somevalue\"}}", "login.Password", "Required property 'Password' not found in JSON. Path 'login', line 1, position 33.")]
public async Task ReadAsync_WithAllowInputFormatterExceptionMessages_RegistersJsonInputExceptionsAsInputFormatterException( public async Task ReadAsync_WithAllowInputFormatterExceptionMessages_RegistersJsonInputExceptionsAsInputFormatterException(
string content, string content,
@ -624,13 +624,13 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
public async Task ReadAsync_AllowInputFormatterExceptionMessages_DoesNotWrapJsonInputExceptions() public async Task ReadAsync_AllowInputFormatterExceptionMessages_DoesNotWrapJsonInputExceptions()
{ {
// Arrange // Arrange
var formatter = new JsonInputFormatter( var formatter = new NewtonsoftJsonInputFormatter(
GetLogger(), GetLogger(),
_serializerSettings, _serializerSettings,
ArrayPool<char>.Shared, ArrayPool<char>.Shared,
_objectPoolProvider, _objectPoolProvider,
new MvcOptions(), new MvcOptions(),
new MvcJsonOptions() new MvcNewtonsoftJsonOptions()
{ {
AllowInputFormatterExceptionMessages = true, AllowInputFormatterExceptionMessages = true,
}); });
@ -653,10 +653,10 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
Assert.NotEmpty(modelError.ErrorMessage); Assert.NotEmpty(modelError.ErrorMessage);
} }
private class TestableJsonInputFormatter : JsonInputFormatter private class TestableJsonInputFormatter : NewtonsoftJsonInputFormatter
{ {
public TestableJsonInputFormatter(JsonSerializerSettings settings) public TestableJsonInputFormatter(JsonSerializerSettings settings)
: base(GetLogger(), settings, ArrayPool<char>.Shared, _objectPoolProvider, new MvcOptions(), new MvcJsonOptions()) : base(GetLogger(), settings, ArrayPool<char>.Shared, _objectPoolProvider, new MvcOptions(), new MvcNewtonsoftJsonOptions())
{ {
} }
@ -670,15 +670,15 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
return NullLogger.Instance; return NullLogger.Instance;
} }
private JsonInputFormatter CreateFormatter(JsonSerializerSettings serializerSettings = null, bool allowInputFormatterExceptionMessages = false) private NewtonsoftJsonInputFormatter CreateFormatter(JsonSerializerSettings serializerSettings = null, bool allowInputFormatterExceptionMessages = false)
{ {
return new JsonInputFormatter( return new NewtonsoftJsonInputFormatter(
GetLogger(), GetLogger(),
serializerSettings ?? _serializerSettings, serializerSettings ?? _serializerSettings,
ArrayPool<char>.Shared, ArrayPool<char>.Shared,
_objectPoolProvider, _objectPoolProvider,
new MvcOptions(), new MvcOptions(),
new MvcJsonOptions() new MvcNewtonsoftJsonOptions()
{ {
AllowInputFormatterExceptionMessages = allowInputFormatterExceptionMessages, AllowInputFormatterExceptionMessages = allowInputFormatterExceptionMessages,
}); });

Some files were not shown because too many files have changed in this diff Show More