Merge remote-tracking branch 'Mvc/rybrande/masterToSrc' into rybrande/MondoMaster
This commit is contained in:
commit
b465db3f53
|
|
@ -1,9 +1,7 @@
|
||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">$(MicrosoftNETCoreApp21PackageVersion)</RuntimeFrameworkVersion>
|
<RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp2.1' ">$(MicrosoftNETCoreApp21PackageVersion)</RuntimeFrameworkVersion>
|
||||||
<RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp2.2' ">$(MicrosoftNETCoreApp22PackageVersion)</RuntimeFrameworkVersion>
|
<RuntimeFrameworkVersion Condition=" '$(TargetFramework)' == 'netcoreapp3.0' ">$(MicrosoftNETCoreAppPackageVersion)</RuntimeFrameworkVersion>
|
||||||
<NETStandardImplicitPackageVersion Condition=" '$(TargetFramework)' == 'netstandard2.0' ">$(NETStandardLibrary20PackageVersion)</NETStandardImplicitPackageVersion>
|
<NETStandardImplicitPackageVersion Condition=" '$(TargetFramework)' == 'netstandard2.0' ">$(NETStandardLibrary20PackageVersion)</NETStandardImplicitPackageVersion>
|
||||||
<!-- aspnet/BuildTools#662 Don't police what version of NetCoreApp we use -->
|
|
||||||
<NETCoreAppMaximumVersion>99.9</NETCoreAppMaximumVersion>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -28,10 +28,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Co
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Test", "test\Microsoft.AspNetCore.Mvc.Test\Microsoft.AspNetCore.Mvc.Test.csproj", "{5F945B82-FE5F-425C-956C-8BC2F2020254}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Test", "test\Microsoft.AspNetCore.Mvc.Test\Microsoft.AspNetCore.Mvc.Test.csproj", "{5F945B82-FE5F-425C-956C-8BC2F2020254}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.WebApiCompatShim", "src\Microsoft.AspNetCore.Mvc.WebApiCompatShim\Microsoft.AspNetCore.Mvc.WebApiCompatShim.csproj", "{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.WebApiCompatShimTest", "test\Microsoft.AspNetCore.Mvc.WebApiCompatShimTest\Microsoft.AspNetCore.Mvc.WebApiCompatShimTest.csproj", "{5DE8E4D9-AACD-4B5F-819F-F091383FB996}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.TagHelpers", "src\Microsoft.AspNetCore.Mvc.TagHelpers\Microsoft.AspNetCore.Mvc.TagHelpers.csproj", "{B2347320-308E-4D2B-AEC8-005DFA68B0C9}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.TagHelpers", "src\Microsoft.AspNetCore.Mvc.TagHelpers\Microsoft.AspNetCore.Mvc.TagHelpers.csproj", "{B2347320-308E-4D2B-AEC8-005DFA68B0C9}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.TagHelpers.Test", "test\Microsoft.AspNetCore.Mvc.TagHelpers.Test\Microsoft.AspNetCore.Mvc.TagHelpers.Test.csproj", "{860119ED-3DB1-424D-8D0A-30132A8A7D96}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.TagHelpers.Test", "test\Microsoft.AspNetCore.Mvc.TagHelpers.Test\Microsoft.AspNetCore.Mvc.TagHelpers.Test.csproj", "{860119ED-3DB1-424D-8D0A-30132A8A7D96}"
|
||||||
|
|
@ -193,26 +189,6 @@ Global
|
||||||
{5F945B82-FE5F-425C-956C-8BC2F2020254}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
{5F945B82-FE5F-425C-956C-8BC2F2020254}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
{5F945B82-FE5F-425C-956C-8BC2F2020254}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
{5F945B82-FE5F-425C-956C-8BC2F2020254}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{5F945B82-FE5F-425C-956C-8BC2F2020254}.Release|x86.ActiveCfg = Release|Any CPU
|
{5F945B82-FE5F-425C-956C-8BC2F2020254}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
|
@ -628,8 +604,6 @@ Global
|
||||||
{3F6E355E-4869-41D9-943B-D54771221A7F} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
{3F6E355E-4869-41D9-943B-D54771221A7F} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
||||||
{A8AA326E-8EE8-4F11-B750-23028E0949D7} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
{A8AA326E-8EE8-4F11-B750-23028E0949D7} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
||||||
{5F945B82-FE5F-425C-956C-8BC2F2020254} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
{5F945B82-FE5F-425C-956C-8BC2F2020254} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
|
||||||
{B2347320-308E-4D2B-AEC8-005DFA68B0C9} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
|
{B2347320-308E-4D2B-AEC8-005DFA68B0C9} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
|
||||||
{860119ED-3DB1-424D-8D0A-30132A8A7D96} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
{860119ED-3DB1-424D-8D0A-30132A8A7D96} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
||||||
{F504357E-C2E1-4818-BA5C-9A2EAC25FEE5} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
{F504357E-C2E1-4818-BA5C-9A2EAC25FEE5} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
||||||
|
|
|
||||||
|
|
@ -53,12 +53,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FilesWebSite", "test\WebSit
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApplicationModelWebSite", "test\WebSites\ApplicationModelWebSite\ApplicationModelWebSite.csproj", "{CAE52CB7-0FAC-4B5B-8251-B0FF837DB657}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApplicationModelWebSite", "test\WebSites\ApplicationModelWebSite\ApplicationModelWebSite.csproj", "{CAE52CB7-0FAC-4B5B-8251-B0FF837DB657}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.WebApiCompatShim", "src\Microsoft.AspNetCore.Mvc.WebApiCompatShim\Microsoft.AspNetCore.Mvc.WebApiCompatShim.csproj", "{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApiCompatShimWebSite", "test\WebSites\WebApiCompatShimWebSite\WebApiCompatShimWebSite.csproj", "{B2B7BC91-688E-4C1E-A71F-CE948D958DDF}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.WebApiCompatShimTest", "test\Microsoft.AspNetCore.Mvc.WebApiCompatShimTest\Microsoft.AspNetCore.Mvc.WebApiCompatShimTest.csproj", "{5DE8E4D9-AACD-4B5F-819F-F091383FB996}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.TagHelpers", "src\Microsoft.AspNetCore.Mvc.TagHelpers\Microsoft.AspNetCore.Mvc.TagHelpers.csproj", "{B2347320-308E-4D2B-AEC8-005DFA68B0C9}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.TagHelpers", "src\Microsoft.AspNetCore.Mvc.TagHelpers\Microsoft.AspNetCore.Mvc.TagHelpers.csproj", "{B2347320-308E-4D2B-AEC8-005DFA68B0C9}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.TagHelpers.Test", "test\Microsoft.AspNetCore.Mvc.TagHelpers.Test\Microsoft.AspNetCore.Mvc.TagHelpers.Test.csproj", "{860119ED-3DB1-424D-8D0A-30132A8A7D96}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.TagHelpers.Test", "test\Microsoft.AspNetCore.Mvc.TagHelpers.Test\Microsoft.AspNetCore.Mvc.TagHelpers.Test.csproj", "{860119ED-3DB1-424D-8D0A-30132A8A7D96}"
|
||||||
|
|
@ -354,36 +348,6 @@ Global
|
||||||
{CAE52CB7-0FAC-4B5B-8251-B0FF837DB657}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
{CAE52CB7-0FAC-4B5B-8251-B0FF837DB657}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
{CAE52CB7-0FAC-4B5B-8251-B0FF837DB657}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
{CAE52CB7-0FAC-4B5B-8251-B0FF837DB657}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{CAE52CB7-0FAC-4B5B-8251-B0FF837DB657}.Release|x86.ActiveCfg = Release|Any CPU
|
{CAE52CB7-0FAC-4B5B-8251-B0FF837DB657}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{B2B7BC91-688E-4C1E-A71F-CE948D958DDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{B2B7BC91-688E-4C1E-A71F-CE948D958DDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{B2B7BC91-688E-4C1E-A71F-CE948D958DDF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{B2B7BC91-688E-4C1E-A71F-CE948D958DDF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{B2B7BC91-688E-4C1E-A71F-CE948D958DDF}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{B2B7BC91-688E-4C1E-A71F-CE948D958DDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{B2B7BC91-688E-4C1E-A71F-CE948D958DDF}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{B2B7BC91-688E-4C1E-A71F-CE948D958DDF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{B2B7BC91-688E-4C1E-A71F-CE948D958DDF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{B2B7BC91-688E-4C1E-A71F-CE948D958DDF}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
{B2347320-308E-4D2B-AEC8-005DFA68B0C9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
|
@ -1002,9 +966,6 @@ Global
|
||||||
{6DB9B8D0-80F7-4E70-BBB0-0B4C04D79A47} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
{6DB9B8D0-80F7-4E70-BBB0-0B4C04D79A47} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
||||||
{0EF9860B-10D7-452F-B0F4-A405B88BEBB3} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
{0EF9860B-10D7-452F-B0F4-A405B88BEBB3} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
||||||
{CAE52CB7-0FAC-4B5B-8251-B0FF837DB657} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
{CAE52CB7-0FAC-4B5B-8251-B0FF837DB657} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
||||||
{23D30B8C-04B1-4577-A604-ED27EA1E4A0E} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
|
|
||||||
{B2B7BC91-688E-4C1E-A71F-CE948D958DDF} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
|
||||||
{5DE8E4D9-AACD-4B5F-819F-F091383FB996} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
|
||||||
{B2347320-308E-4D2B-AEC8-005DFA68B0C9} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
|
{B2347320-308E-4D2B-AEC8-005DFA68B0C9} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
|
||||||
{860119ED-3DB1-424D-8D0A-30132A8A7D96} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
{860119ED-3DB1-424D-8D0A-30132A8A7D96} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
|
||||||
{920F8A0E-6F7D-4BBE-84FF-840B89099BE6} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
{920F8A0E-6F7D-4BBE-84FF-840B89099BE6} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ ASP.NET Core MVC
|
||||||
|
|
||||||
**Note: For ASP.NET MVC 5.x, Web API 2.x, and Web Pages 3.x (not ASP.NET Core), see https://github.com/aspnet/AspNetWebStack**
|
**Note: For ASP.NET MVC 5.x, Web API 2.x, and Web Pages 3.x (not ASP.NET Core), see https://github.com/aspnet/AspNetWebStack**
|
||||||
|
|
||||||
Travis: [](https://travis-ci.org/aspnet/Mvc)
|
Travis: [](https://travis-ci.org/aspnet/Mvc)
|
||||||
|
|
||||||
ASP.NET Core MVC gives you a powerful, patterns-based way to build dynamic websites that enables a clean separation of concerns and gives you full control over markup for enjoyable, agile development. ASP.NET Core MVC includes many features that enable fast, TDD-friendly development for creating sophisticated applications that use the latest web standards.
|
ASP.NET Core MVC gives you a powerful, patterns-based way to build dynamic websites that enables a clean separation of concerns and gives you full control over markup for enjoyable, agile development. ASP.NET Core MVC includes many features that enable fast, TDD-friendly development for creating sophisticated applications that use the latest web standards.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netcoreapp2.2</TargetFrameworks>
|
<TargetFrameworks>netcoreapp3.0</TargetFrameworks>
|
||||||
<TargetFrameworks Condition=" '$(DeveloperBuild)' != 'true' AND '$(OS)' == 'Windows_NT' ">$(TargetFrameworks);net461</TargetFrameworks>
|
|
||||||
<TargetFrameworks Condition="'$(BenchmarksTargetFramework)' != ''">$(BenchmarksTargetFramework)</TargetFrameworks>
|
<TargetFrameworks Condition="'$(BenchmarksTargetFramework)' != ''">$(BenchmarksTargetFramework)</TargetFrameworks>
|
||||||
|
|
||||||
<DefineConstants Condition=" '$(GenerateSqlScripts)'=='true' ">$(DefineConstants);GENERATE_SQL_SCRIPTS</DefineConstants>
|
<DefineConstants Condition=" '$(GenerateSqlScripts)'=='true' ">$(DefineConstants);GENERATE_SQL_SCRIPTS</DefineConstants>
|
||||||
|
|
@ -38,6 +37,6 @@
|
||||||
Use All meta-package and not App to include Microsoft.EntityFrameworkCore.Sqlite.
|
Use All meta-package and not App to include Microsoft.EntityFrameworkCore.Sqlite.
|
||||||
-->
|
-->
|
||||||
<ItemGroup Condition="'$(BenchmarksTargetFramework)' != ''">
|
<ItemGroup Condition="'$(BenchmarksTargetFramework)' != ''">
|
||||||
<PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.App" Version="$(MicrosoftAspNetCoreAppPackageVersion)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
"PresetHeaders": "Json",
|
"PresetHeaders": "Json",
|
||||||
"ReadyStateText": "Application started.",
|
"ReadyStateText": "Application started.",
|
||||||
"Source": {
|
"Source": {
|
||||||
"BranchOrCommit": "release/2.2",
|
"BranchOrCommit": "master",
|
||||||
"Project": "benchmarkapps/BasicApi/BasicApi.csproj",
|
"Project": "benchmarkapps/BasicApi/BasicApi.csproj",
|
||||||
"Repository": "https://github.com/aspnet/mvc.git"
|
"Repository": "https://github.com/aspnet/mvc.git"
|
||||||
}
|
}
|
||||||
|
|
@ -19,20 +19,20 @@
|
||||||
},
|
},
|
||||||
"BasicApi.GetUsingQueryString": {
|
"BasicApi.GetUsingQueryString": {
|
||||||
"ClientProperties": {
|
"ClientProperties": {
|
||||||
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/release/2.2/benchmarkapps/BasicApi/getWithToken.lua"
|
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/master/benchmarkapps/BasicApi/getWithToken.lua"
|
||||||
},
|
},
|
||||||
"Path": "/pet/findByStatus",
|
"Path": "/pet/findByStatus",
|
||||||
"Query": "?status=available"
|
"Query": "?status=available"
|
||||||
},
|
},
|
||||||
"BasicApi.GetUsingRouteValue": {
|
"BasicApi.GetUsingRouteValue": {
|
||||||
"ClientProperties": {
|
"ClientProperties": {
|
||||||
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/release/2.2/benchmarkapps/BasicApi/getWithToken.lua"
|
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/master/benchmarkapps/BasicApi/getWithToken.lua"
|
||||||
},
|
},
|
||||||
"Path": "/pet/-1"
|
"Path": "/pet/-1"
|
||||||
},
|
},
|
||||||
"BasicApi.GetUsingRouteValueWithoutAuthorization": {
|
"BasicApi.GetUsingRouteValueWithoutAuthorization": {
|
||||||
"ClientProperties": {
|
"ClientProperties": {
|
||||||
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/release/2.2/benchmarkapps/BasicApi/getWithToken.lua"
|
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/master/benchmarkapps/BasicApi/getWithToken.lua"
|
||||||
},
|
},
|
||||||
"Path": "/pet/anonymous/-1"
|
"Path": "/pet/anonymous/-1"
|
||||||
},
|
},
|
||||||
|
|
@ -41,14 +41,14 @@
|
||||||
},
|
},
|
||||||
"BasicApi.Post": {
|
"BasicApi.Post": {
|
||||||
"ClientProperties": {
|
"ClientProperties": {
|
||||||
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/release/2.2/benchmarkapps/BasicApi/postJsonWithToken.lua"
|
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/master/benchmarkapps/BasicApi/postJsonWithToken.lua"
|
||||||
},
|
},
|
||||||
"Path": "/pet"
|
"Path": "/pet"
|
||||||
},
|
},
|
||||||
"BasicApi.PostWithoutDb": {
|
"BasicApi.PostWithoutDb": {
|
||||||
"Path": "/pet/add-pet",
|
"Path": "/pet/add-pet",
|
||||||
"ClientProperties": {
|
"ClientProperties": {
|
||||||
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/release/2.2/benchmarkapps/BasicApi/postJsonWithToken.lua"
|
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/master/benchmarkapps/BasicApi/postJsonWithToken.lua"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netcoreapp2.2</TargetFrameworks>
|
<TargetFrameworks>netcoreapp3.0</TargetFrameworks>
|
||||||
<TargetFrameworks Condition=" '$(DeveloperBuild)' != 'true' AND '$(OS)' == 'Windows_NT' ">$(TargetFrameworks);net461</TargetFrameworks>
|
|
||||||
<TargetFrameworks Condition="'$(BenchmarksTargetFramework)' != ''">$(BenchmarksTargetFramework)</TargetFrameworks>
|
<TargetFrameworks Condition="'$(BenchmarksTargetFramework)' != ''">$(BenchmarksTargetFramework)</TargetFrameworks>
|
||||||
|
|
||||||
<DefineConstants Condition=" '$(GenerateSqlScripts)'=='true' ">$(DefineConstants);GENERATE_SQL_SCRIPTS</DefineConstants>
|
<DefineConstants Condition=" '$(GenerateSqlScripts)'=='true' ">$(DefineConstants);GENERATE_SQL_SCRIPTS</DefineConstants>
|
||||||
|
|
@ -38,7 +37,7 @@
|
||||||
Use All meta-package and not App to include Microsoft.EntityFrameworkCore.Sqlite.
|
Use All meta-package and not App to include Microsoft.EntityFrameworkCore.Sqlite.
|
||||||
-->
|
-->
|
||||||
<ItemGroup Condition="'$(BenchmarksTargetFramework)' != ''">
|
<ItemGroup Condition="'$(BenchmarksTargetFramework)' != ''">
|
||||||
<PackageReference Include="Microsoft.AspNetCore.All" Version="$(MicrosoftAspNetCoreAllPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.App" Version="$(MicrosoftAspNetCoreAppPackageVersion)" />
|
||||||
<PackageReference Include="Microsoft.NET.Sdk.Razor" Version="$(MicrosoftAspNetCoreAllPackageVersion)" PrivateAssets="All" />
|
<PackageReference Include="Microsoft.NET.Sdk.Razor" Version="$(MicrosoftAspNetCoreAppPackageVersion)" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
"PresetHeaders": "Html",
|
"PresetHeaders": "Html",
|
||||||
"ReadyStateText": "Application started.",
|
"ReadyStateText": "Application started.",
|
||||||
"Source": {
|
"Source": {
|
||||||
"BranchOrCommit": "release/2.2",
|
"BranchOrCommit": "master",
|
||||||
"Project": "benchmarkapps/BasicViews/BasicViews.csproj",
|
"Project": "benchmarkapps/BasicViews/BasicViews.csproj",
|
||||||
"Repository": "https://github.com/aspnet/mvc.git"
|
"Repository": "https://github.com/aspnet/mvc.git"
|
||||||
}
|
}
|
||||||
|
|
@ -20,19 +20,19 @@
|
||||||
},
|
},
|
||||||
"BasicViews.Post": {
|
"BasicViews.Post": {
|
||||||
"ClientProperties": {
|
"ClientProperties": {
|
||||||
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/release/2.2/benchmarkapps/BasicViews/postWithToken.lua"
|
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/master/benchmarkapps/BasicViews/postWithToken.lua"
|
||||||
},
|
},
|
||||||
"Path": "/Home/Index"
|
"Path": "/Home/Index"
|
||||||
},
|
},
|
||||||
"BasicViews.PostIgnoringToken": {
|
"BasicViews.PostIgnoringToken": {
|
||||||
"ClientProperties": {
|
"ClientProperties": {
|
||||||
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/release/2.2/benchmarkapps/BasicViews/postWithToken.lua"
|
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/master/benchmarkapps/BasicViews/postWithToken.lua"
|
||||||
},
|
},
|
||||||
"Path": "/Home/IndexWithoutToken"
|
"Path": "/Home/IndexWithoutToken"
|
||||||
},
|
},
|
||||||
"BasicViews.PostWithoutToken": {
|
"BasicViews.PostWithoutToken": {
|
||||||
"ClientProperties": {
|
"ClientProperties": {
|
||||||
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/release/2.2/benchmarkapps/BasicViews/post.lua"
|
"Scripts": "https://raw.githubusercontent.com/aspnet/Mvc/master/benchmarkapps/BasicViews/post.lua"
|
||||||
},
|
},
|
||||||
"Path": "/Home/IndexWithoutToken"
|
"Path": "/Home/IndexWithoutToken"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netcoreapp2.2</TargetFrameworks>
|
<TargetFrameworks>netcoreapp3.0</TargetFrameworks>
|
||||||
|
<TargetFrameworks Condition="'$(BenchmarksTargetFramework)' != ''">$(BenchmarksTargetFramework)</TargetFrameworks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<!-- These references are used when running locally -->
|
<!-- These references are used when running locally -->
|
||||||
|
|
@ -16,8 +17,8 @@
|
||||||
These references are used when running on the Benchmarks Server.
|
These references are used when running on the Benchmarks Server.
|
||||||
-->
|
-->
|
||||||
<ItemGroup Condition="'$(BenchmarksTargetFramework)' != ''">
|
<ItemGroup Condition="'$(BenchmarksTargetFramework)' != ''">
|
||||||
<PackageReference Include="Microsoft.AspNetCore.App" Version="$(MicrosoftNETCoreApp22PackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.App" Version="$(MicrosoftAspNetCoreAppPackageVersion)" />
|
||||||
<PackageReference Include="Microsoft.NET.Sdk.Razor" Version="$(MicrosoftNETCoreApp22PackageVersion)" PrivateAssets="All" />
|
<PackageReference Include="Microsoft.NET.Sdk.Razor" Version="$(MicrosoftAspNetCoreAppPackageVersion)" PrivateAssets="All" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Properties\" />
|
<Folder Include="Properties\" />
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
using System;
|
||||||
|
using Microsoft.AspNetCore.Html;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Razor;
|
||||||
|
|
||||||
|
public static class HelperExtensions
|
||||||
|
{
|
||||||
|
public static Func<T1, IHtmlContent> Helper<T1>(
|
||||||
|
this RazorPageBase page,
|
||||||
|
Func<T1, Func<object, IHtmlContent>> helper
|
||||||
|
) => p1 => helper(p1)(null);
|
||||||
|
|
||||||
|
public static Func<T1, T2, IHtmlContent> Helper<T1, T2>(
|
||||||
|
this RazorPageBase page,
|
||||||
|
Func<T1, T2, Func<object, IHtmlContent>> helper
|
||||||
|
) => (p1, p2) => helper(p1, p2)(null);
|
||||||
|
|
||||||
|
public static Func<T1, T2, T3, IHtmlContent> Helper<T1, T2, T3>(
|
||||||
|
this RazorPageBase page,
|
||||||
|
Func<T1, T2, T3, Func<object, IHtmlContent>> helper
|
||||||
|
) => (p1, p2, p3) => helper(p1, p2, p3)(null);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||||
|
<!-- Workaround https://github.com/dotnet/core-setup/issues/3726 -->
|
||||||
|
<GenerateDependencyFile>false</GenerateDependencyFile>
|
||||||
|
|
||||||
|
<_EnableAllInclusiveRazorSdk>true</_EnableAllInclusiveRazorSdk>
|
||||||
|
<RazorLangVersion>3.0</RazorLangVersion>
|
||||||
|
<RazorDefaultConfiguration>MVC-3.0</RazorDefaultConfiguration>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Mvc\Microsoft.AspNetCore.Mvc.csproj" />
|
||||||
|
<PackageReference Include="Microsoft.NET.Sdk.Razor" Version="$(MicrosoftNETSdkRazorPackageVersion)" PrivateAssets="All" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
namespace Microsoft.AspNetCore.Mvc.Performance
|
||||||
|
{
|
||||||
|
public class ViewAssemblyMarker
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Hello world
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
@using System;
|
||||||
|
@using Microsoft.AspNetCore.Html
|
||||||
|
@model System.String
|
||||||
|
@{Func<dynamic, IHtmlContent> SomeHelper = @<text>@{
|
||||||
|
@item
|
||||||
|
}</text>;}
|
||||||
|
@for (var i = 0; i < 100; i++){@SomeHelper(Model + i.ToString())}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
@using System;
|
||||||
|
@using Microsoft.AspNetCore.Html
|
||||||
|
@model System.String
|
||||||
|
@{
|
||||||
|
var SomeHelper = this.Helper((string s) => @<text>@item</text>);
|
||||||
|
}
|
||||||
|
@for (var i = 0; i < 100; i++)
|
||||||
|
{
|
||||||
|
@SomeHelper(Model + i.ToString())
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
@using System;
|
||||||
|
@using Microsoft.AspNetCore.Html
|
||||||
|
@model System.String
|
||||||
|
@for (var i = 0; i < 100; i++)
|
||||||
|
{
|
||||||
|
await Html.RenderPartialAsync("~/Views/HelperPartial_Partial.cshtml", Model + i.ToString());
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
@using System;
|
||||||
|
@using Microsoft.AspNetCore.Html
|
||||||
|
@model System.String
|
||||||
|
@for (var i = 0; i < 100; i++)
|
||||||
|
{
|
||||||
|
Html.RenderPartial("~/Views/HelperPartial_Partial.cshtml", Model + i.ToString());
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
@using System;
|
||||||
|
@using Microsoft.AspNetCore.Html
|
||||||
|
@model System.String
|
||||||
|
@addTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.PartialTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||||
|
@for (var i = 0; i < 100; i++)
|
||||||
|
{<partial name="~/Views/HelperPartial_Partial.cshtml" model="@(Model + i.ToString())" />}
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
@model System.String
|
||||||
|
@Model
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
@using System;
|
||||||
|
@using Microsoft.AspNetCore.Html
|
||||||
|
@model System.String
|
||||||
|
@{Func<string, IHtmlContent> SomeHelper = @<text>@{
|
||||||
|
@item
|
||||||
|
}</text>;}
|
||||||
|
@for (var i = 0; i < 100; i++){@SomeHelper(Model + i.ToString())}
|
||||||
|
|
@ -11,7 +11,6 @@ using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc.Abstractions;
|
using Microsoft.AspNetCore.Mvc.Abstractions;
|
||||||
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Microsoft.Extensions.Logging.Abstractions;
|
using Microsoft.Extensions.Logging.Abstractions;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Encodings.Web;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Html;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Abstractions;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Razor;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ViewEngines;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
||||||
|
using Microsoft.AspNetCore.Razor.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Routing;
|
||||||
|
using Microsoft.CodeAnalysis;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||||
|
using Microsoft.Extensions.FileProviders;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.ObjectPool;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Mvc.Performance
|
||||||
|
{
|
||||||
|
public class HelperPerformanceBenchmark : RuntimePerformanceBenchmarkBase
|
||||||
|
{
|
||||||
|
private Random _rand = new Random();
|
||||||
|
public HelperPerformanceBenchmark() : base(
|
||||||
|
"~/Views/HelperTyped.cshtml",
|
||||||
|
"~/Views/HelperDynamic.cshtml",
|
||||||
|
"~/Views/HelperPartialSync.cshtml",
|
||||||
|
"~/Views/HelperPartialAsync.cshtml",
|
||||||
|
"~/Views/HelperExtensions.cshtml",
|
||||||
|
"~/Views/HelperPartialTagHelper.cshtml")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override object Model => _rand.Next().ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<ServerGarbageCollection>true</ServerGarbageCollection>
|
<ServerGarbageCollection>true</ServerGarbageCollection>
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
|
@ -9,11 +9,15 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Mvc\Microsoft.AspNetCore.Mvc.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Mvc\Microsoft.AspNetCore.Mvc.csproj" />
|
||||||
|
<ProjectReference Include="..\Microsoft.AspNetCore.Mvc.Performance.Views\Microsoft.AspNetCore.Mvc.Performance.Views.csproj" />
|
||||||
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="BenchmarkDotNet" Version="$(BenchmarkDotNetPackageVersion)" />
|
<PackageReference Include="BenchmarkDotNet" Version="$(BenchmarkDotNetPackageVersion)" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="$(MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="$(MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion)" />
|
||||||
|
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Razor.Runtime" Version="$(MicrosoftAspNetCoreRazorRuntimePackageVersion)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ using BenchmarkDotNet.Attributes;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Mvc.Abstractions;
|
using Microsoft.AspNetCore.Mvc.Abstractions;
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Routing;
|
using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Microsoft.AspNetCore.Routing.Patterns;
|
using Microsoft.AspNetCore.Routing.Patterns;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,212 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Encodings.Web;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Html;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Abstractions;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Razor;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ViewEngines;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
||||||
|
using Microsoft.AspNetCore.Razor.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Routing;
|
||||||
|
using Microsoft.CodeAnalysis;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||||
|
using Microsoft.Extensions.FileProviders;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.ObjectPool;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Mvc.Performance
|
||||||
|
{
|
||||||
|
public class RuntimePerformanceBenchmarkBase
|
||||||
|
{
|
||||||
|
private class NullLoggerFactory : ILoggerFactory, ILogger
|
||||||
|
{
|
||||||
|
void ILoggerFactory.AddProvider(ILoggerProvider provider) {}
|
||||||
|
ILogger ILoggerFactory.CreateLogger(string categoryName) => this;
|
||||||
|
void IDisposable.Dispose() {}
|
||||||
|
IDisposable ILogger.BeginScope<TState>(TState state) => null;
|
||||||
|
bool ILogger.IsEnabled(LogLevel logLevel) => false;
|
||||||
|
void ILogger.Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class BenchmarkViewExecutor : ViewExecutor
|
||||||
|
{
|
||||||
|
public BenchmarkViewExecutor(IOptions<MvcViewOptions> viewOptions, IHttpResponseStreamWriterFactory writerFactory, ICompositeViewEngine viewEngine, ITempDataDictionaryFactory tempDataFactory, DiagnosticListener diagnosticListener, IModelMetadataProvider modelMetadataProvider)
|
||||||
|
: base(viewOptions, writerFactory, viewEngine, tempDataFactory, diagnosticListener, modelMetadataProvider)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringBuilder StringBuilder { get; } = new StringBuilder();
|
||||||
|
|
||||||
|
public override async Task ExecuteAsync(
|
||||||
|
ActionContext actionContext,
|
||||||
|
IView view,
|
||||||
|
ViewDataDictionary viewData,
|
||||||
|
ITempDataDictionary tempData,
|
||||||
|
string contentType,
|
||||||
|
int? statusCode)
|
||||||
|
{
|
||||||
|
using (var stringWriter = new StringWriter(StringBuilder))
|
||||||
|
{
|
||||||
|
var viewContext = new ViewContext(
|
||||||
|
actionContext,
|
||||||
|
view,
|
||||||
|
viewData,
|
||||||
|
tempData,
|
||||||
|
stringWriter,
|
||||||
|
ViewOptions.HtmlHelperOptions);
|
||||||
|
await ExecuteAsync(viewContext, contentType, statusCode);
|
||||||
|
await stringWriter.FlushAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class BenchmarkHostingEnvironment : IHostingEnvironment
|
||||||
|
{
|
||||||
|
public BenchmarkHostingEnvironment()
|
||||||
|
{
|
||||||
|
ApplicationName = typeof(ViewAssemblyMarker).Assembly.FullName;
|
||||||
|
WebRootFileProvider = new NullFileProvider();
|
||||||
|
ContentRootFileProvider = new NullFileProvider();
|
||||||
|
ContentRootPath = AppContext.BaseDirectory;
|
||||||
|
WebRootPath = AppContext.BaseDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string EnvironmentName { get; set; }
|
||||||
|
public string ApplicationName { get; set; }
|
||||||
|
public string WebRootPath { get; set; }
|
||||||
|
public IFileProvider WebRootFileProvider { get; set; }
|
||||||
|
public string ContentRootPath { get; set; }
|
||||||
|
public IFileProvider ContentRootFileProvider { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RuntimePerformanceBenchmarkBase(params string[] viewPaths)
|
||||||
|
{
|
||||||
|
ViewPaths = viewPaths;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual string[] ViewPaths { get; private set; }
|
||||||
|
|
||||||
|
[ParamsSource(nameof(ViewPaths))]
|
||||||
|
public string ViewPath;
|
||||||
|
|
||||||
|
protected IView View;
|
||||||
|
|
||||||
|
private ServiceProvider _serviceProvider;
|
||||||
|
private RouteData _routeData;
|
||||||
|
private ActionDescriptor _actionDescriptor;
|
||||||
|
private IServiceScope _requestScope;
|
||||||
|
private ICompositeViewEngine _viewEngine;
|
||||||
|
private BenchmarkViewExecutor _executor;
|
||||||
|
private ViewEngineResult _viewEngineResult;
|
||||||
|
private ActionContext _actionContext;
|
||||||
|
private ViewDataDictionary _viewDataDictionary;
|
||||||
|
private ITempDataDictionaryFactory _tempDataDictionaryFactory;
|
||||||
|
private ITempDataDictionary _tempData;
|
||||||
|
|
||||||
|
// runs once for every Document value
|
||||||
|
[GlobalSetup]
|
||||||
|
public void GlobalSetup()
|
||||||
|
{
|
||||||
|
var loader = new RazorCompiledItemLoader();
|
||||||
|
var viewsDll = Path.ChangeExtension(typeof(ViewAssemblyMarker).Assembly.Location, "Views.dll");
|
||||||
|
var viewsAssembly = Assembly.Load(File.ReadAllBytes(viewsDll));
|
||||||
|
var services = new ServiceCollection();
|
||||||
|
var listener = new DiagnosticListener(GetType().Assembly.FullName);
|
||||||
|
var partManager = new ApplicationPartManager();
|
||||||
|
partManager.ApplicationParts.Add(CompiledRazorAssemblyApplicationPartFactory.GetDefaultApplicationParts(viewsAssembly).Single());
|
||||||
|
var builder = services
|
||||||
|
.AddSingleton<ILoggerFactory, NullLoggerFactory>()
|
||||||
|
.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>()
|
||||||
|
.AddSingleton<DiagnosticSource>(listener)
|
||||||
|
.AddSingleton(listener)
|
||||||
|
.AddSingleton<IHostingEnvironment, BenchmarkHostingEnvironment>()
|
||||||
|
.AddSingleton<ApplicationPartManager>(partManager)
|
||||||
|
.AddScoped<BenchmarkViewExecutor>()
|
||||||
|
.AddMvc();
|
||||||
|
|
||||||
|
_serviceProvider = services.BuildServiceProvider();
|
||||||
|
_routeData = new RouteData();
|
||||||
|
_actionDescriptor = new ActionDescriptor();
|
||||||
|
_tempDataDictionaryFactory = _serviceProvider.GetRequiredService<ITempDataDictionaryFactory>();
|
||||||
|
_viewEngine = _serviceProvider.GetRequiredService<ICompositeViewEngine>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[GlobalCleanup]
|
||||||
|
public void GlobalCleanup()
|
||||||
|
{
|
||||||
|
_serviceProvider.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
[IterationSetup]
|
||||||
|
public virtual void IterationSetup()
|
||||||
|
{
|
||||||
|
_requestScope = _serviceProvider.CreateScope();
|
||||||
|
|
||||||
|
_viewEngineResult = _viewEngine.GetView(null, ViewPath, true);
|
||||||
|
_viewEngineResult.EnsureSuccessful(null);
|
||||||
|
|
||||||
|
_actionContext = new ActionContext(
|
||||||
|
new DefaultHttpContext()
|
||||||
|
{
|
||||||
|
RequestServices = _requestScope.ServiceProvider
|
||||||
|
},
|
||||||
|
_routeData,
|
||||||
|
_actionDescriptor);
|
||||||
|
|
||||||
|
_tempData = _tempDataDictionaryFactory.GetTempData(_actionContext.HttpContext);
|
||||||
|
|
||||||
|
_viewDataDictionary = new ViewDataDictionary(
|
||||||
|
_requestScope.ServiceProvider.GetRequiredService<IModelMetadataProvider>(),
|
||||||
|
_actionContext.ModelState);
|
||||||
|
_viewDataDictionary.Model = Model;
|
||||||
|
|
||||||
|
_executor = _requestScope.ServiceProvider.GetRequiredService<BenchmarkViewExecutor>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[IterationCleanup]
|
||||||
|
public virtual void IterationCleanup()
|
||||||
|
{
|
||||||
|
if (_viewEngineResult.View is IDisposable d)
|
||||||
|
{
|
||||||
|
d.Dispose();
|
||||||
|
}
|
||||||
|
_requestScope.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual object Model { get; } = null;
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public async Task<string> RenderView()
|
||||||
|
{
|
||||||
|
await _executor.ExecuteAsync(
|
||||||
|
_actionContext,
|
||||||
|
_viewEngineResult.View,
|
||||||
|
_viewDataDictionary,
|
||||||
|
_tempData,
|
||||||
|
"text/html",
|
||||||
|
200);
|
||||||
|
return _executor.StringBuilder.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,7 +6,6 @@ using BenchmarkDotNet.Attributes;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc.Abstractions;
|
using Microsoft.AspNetCore.Mvc.Abstractions;
|
||||||
using Microsoft.AspNetCore.Mvc.DataAnnotations;
|
using Microsoft.AspNetCore.Mvc.DataAnnotations;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
|
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
|
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
|
||||||
|
|
|
||||||
|
|
@ -16,97 +16,94 @@
|
||||||
<BenchmarksOnlyMySqlConnectorPackageVersion>0.43.0</BenchmarksOnlyMySqlConnectorPackageVersion>
|
<BenchmarksOnlyMySqlConnectorPackageVersion>0.43.0</BenchmarksOnlyMySqlConnectorPackageVersion>
|
||||||
<BenchmarksOnlyNpgsqlEntityFrameworkCorePostgreSQLPackageVersion>2.1.1.1</BenchmarksOnlyNpgsqlEntityFrameworkCorePostgreSQLPackageVersion>
|
<BenchmarksOnlyNpgsqlEntityFrameworkCorePostgreSQLPackageVersion>2.1.1.1</BenchmarksOnlyNpgsqlEntityFrameworkCorePostgreSQLPackageVersion>
|
||||||
<BenchmarksOnlyPomeloEntityFrameworkCoreMySqlPackageVersion>2.1.1</BenchmarksOnlyPomeloEntityFrameworkCoreMySqlPackageVersion>
|
<BenchmarksOnlyPomeloEntityFrameworkCoreMySqlPackageVersion>2.1.1</BenchmarksOnlyPomeloEntityFrameworkCoreMySqlPackageVersion>
|
||||||
<InternalAspNetCoreAnalyzersPackageVersion>2.2.0-rtm-35519</InternalAspNetCoreAnalyzersPackageVersion>
|
<InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview-181113-11</InternalAspNetCoreAnalyzersPackageVersion>
|
||||||
<MicrosoftAspNetCoreAllPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreAllPackageVersion>
|
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview-181113-11</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
|
||||||
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
|
<MicrosoftAspNetCoreAntiforgeryPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreAntiforgeryPackageVersion>
|
||||||
<MicrosoftAspNetCoreAntiforgeryPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreAntiforgeryPackageVersion>
|
<MicrosoftAspNetCoreAppPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreAppPackageVersion>
|
||||||
<MicrosoftAspNetCoreAuthenticationCookiesPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreAuthenticationCookiesPackageVersion>
|
<MicrosoftAspNetCoreAuthenticationCookiesPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreAuthenticationCookiesPackageVersion>
|
||||||
<MicrosoftAspNetCoreAuthenticationCorePackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreAuthenticationCorePackageVersion>
|
<MicrosoftAspNetCoreAuthenticationCorePackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreAuthenticationCorePackageVersion>
|
||||||
<MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion>
|
<MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreAuthenticationJwtBearerPackageVersion>
|
||||||
<MicrosoftAspNetCoreAuthenticationPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreAuthenticationPackageVersion>
|
<MicrosoftAspNetCoreAuthenticationPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreAuthenticationPackageVersion>
|
||||||
<MicrosoftAspNetCoreAuthorizationPolicyPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreAuthorizationPolicyPackageVersion>
|
<MicrosoftAspNetCoreAuthorizationPolicyPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreAuthorizationPolicyPackageVersion>
|
||||||
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
|
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.0.0-preview-181113-11</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
|
||||||
<MicrosoftAspNetCoreChunkingCookieManagerSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreChunkingCookieManagerSourcesPackageVersion>
|
<MicrosoftAspNetCoreChunkingCookieManagerSourcesPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreChunkingCookieManagerSourcesPackageVersion>
|
||||||
<MicrosoftAspNetCoreCookiePolicyPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreCookiePolicyPackageVersion>
|
<MicrosoftAspNetCoreCookiePolicyPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreCookiePolicyPackageVersion>
|
||||||
<MicrosoftAspNetCoreCorsPackageVersion>2.2.0-a-rtm-fix-wildcard-16567</MicrosoftAspNetCoreCorsPackageVersion>
|
<MicrosoftAspNetCoreCorsPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreCorsPackageVersion>
|
||||||
<MicrosoftAspNetCoreDiagnosticsAbstractionsPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreDiagnosticsAbstractionsPackageVersion>
|
<MicrosoftAspNetCoreDiagnosticsAbstractionsPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreDiagnosticsAbstractionsPackageVersion>
|
||||||
<MicrosoftAspNetCoreDiagnosticsPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreDiagnosticsPackageVersion>
|
<MicrosoftAspNetCoreDiagnosticsPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreDiagnosticsPackageVersion>
|
||||||
<MicrosoftAspNetCoreHostingAbstractions20PackageVersion>2.0.0</MicrosoftAspNetCoreHostingAbstractions20PackageVersion>
|
<MicrosoftAspNetCoreHostingAbstractions20PackageVersion>2.0.0</MicrosoftAspNetCoreHostingAbstractions20PackageVersion>
|
||||||
<MicrosoftAspNetCoreHostingAbstractionsPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreHostingAbstractionsPackageVersion>
|
<MicrosoftAspNetCoreHostingAbstractionsPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreHostingAbstractionsPackageVersion>
|
||||||
<MicrosoftAspNetCoreHostingPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreHostingPackageVersion>
|
<MicrosoftAspNetCoreHostingPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreHostingPackageVersion>
|
||||||
<MicrosoftAspNetCoreHtmlAbstractionsPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreHtmlAbstractionsPackageVersion>
|
<MicrosoftAspNetCoreHtmlAbstractionsPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreHtmlAbstractionsPackageVersion>
|
||||||
<MicrosoftAspNetCoreHttpExtensionsPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreHttpExtensionsPackageVersion>
|
<MicrosoftAspNetCoreHttpExtensionsPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreHttpExtensionsPackageVersion>
|
||||||
<MicrosoftAspNetCoreHttpPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreHttpPackageVersion>
|
<MicrosoftAspNetCoreHttpPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreHttpPackageVersion>
|
||||||
<MicrosoftAspNetCoreJsonPatchPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreJsonPatchPackageVersion>
|
<MicrosoftAspNetCoreJsonPatchPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreJsonPatchPackageVersion>
|
||||||
<MicrosoftAspNetCoreLocalizationPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreLocalizationPackageVersion>
|
<MicrosoftAspNetCoreLocalizationPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreLocalizationPackageVersion>
|
||||||
<MicrosoftAspNetCoreLocalizationRoutingPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreLocalizationRoutingPackageVersion>
|
<MicrosoftAspNetCoreLocalizationRoutingPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreLocalizationRoutingPackageVersion>
|
||||||
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
|
<MicrosoftAspNetCoreRangeHelperSourcesPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreRangeHelperSourcesPackageVersion>
|
||||||
<MicrosoftAspNetCoreRangeHelperSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreRangeHelperSourcesPackageVersion>
|
<MicrosoftAspNetCoreRazorRuntimePackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreRazorRuntimePackageVersion>
|
||||||
<MicrosoftAspNetCoreRazorDesignPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreRazorDesignPackageVersion>
|
<MicrosoftAspNetCoreRazorTagHelpersTestingSourcesPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreRazorTagHelpersTestingSourcesPackageVersion>
|
||||||
<MicrosoftAspNetCoreRazorLanguagePackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreRazorLanguagePackageVersion>
|
<MicrosoftAspNetCoreResponseCachingAbstractionsPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreResponseCachingAbstractionsPackageVersion>
|
||||||
<MicrosoftAspNetCoreRazorRuntimePackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreRazorRuntimePackageVersion>
|
<MicrosoftAspNetCoreResponseCachingPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreResponseCachingPackageVersion>
|
||||||
<MicrosoftAspNetCoreRazorTagHelpersTestingSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreRazorTagHelpersTestingSourcesPackageVersion>
|
<MicrosoftAspNetCoreRoutingAbstractionsPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreRoutingAbstractionsPackageVersion>
|
||||||
<MicrosoftAspNetCoreResponseCachingAbstractionsPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreResponseCachingAbstractionsPackageVersion>
|
<MicrosoftAspNetCoreRoutingPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreRoutingPackageVersion>
|
||||||
<MicrosoftAspNetCoreResponseCachingPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreResponseCachingPackageVersion>
|
<MicrosoftAspNetCoreServerIISIntegrationPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreServerIISIntegrationPackageVersion>
|
||||||
<MicrosoftAspNetCoreRoutingAbstractionsPackageVersion>2.2.0-a-rtm-allow-required-parameters-17081</MicrosoftAspNetCoreRoutingAbstractionsPackageVersion>
|
<MicrosoftAspNetCoreServerKestrelPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreServerKestrelPackageVersion>
|
||||||
<MicrosoftAspNetCoreRoutingPackageVersion>2.2.0-a-rtm-allow-required-parameters-17081</MicrosoftAspNetCoreRoutingPackageVersion>
|
<MicrosoftAspNetCoreSessionPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreSessionPackageVersion>
|
||||||
<MicrosoftAspNetCoreServerIISIntegrationPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreServerIISIntegrationPackageVersion>
|
<MicrosoftAspNetCoreStaticFilesPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreStaticFilesPackageVersion>
|
||||||
<MicrosoftAspNetCoreServerKestrelPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreServerKestrelPackageVersion>
|
<MicrosoftAspNetCoreTestHostPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreTestHostPackageVersion>
|
||||||
<MicrosoftAspNetCoreSessionPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreSessionPackageVersion>
|
<MicrosoftAspNetCoreTestingPackageVersion>3.0.0-preview-181113-11</MicrosoftAspNetCoreTestingPackageVersion>
|
||||||
<MicrosoftAspNetCoreStaticFilesPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreStaticFilesPackageVersion>
|
<MicrosoftAspNetCoreWebUtilitiesPackageVersion>3.0.0-alpha1-10742</MicrosoftAspNetCoreWebUtilitiesPackageVersion>
|
||||||
<MicrosoftAspNetCoreTestHostPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreTestHostPackageVersion>
|
|
||||||
<MicrosoftAspNetCoreTestingPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreTestingPackageVersion>
|
|
||||||
<MicrosoftAspNetCoreWebUtilitiesPackageVersion>2.2.0-rtm-35519</MicrosoftAspNetCoreWebUtilitiesPackageVersion>
|
|
||||||
<MicrosoftAspNetWebApiClientPackageVersion>5.2.6</MicrosoftAspNetWebApiClientPackageVersion>
|
<MicrosoftAspNetWebApiClientPackageVersion>5.2.6</MicrosoftAspNetWebApiClientPackageVersion>
|
||||||
<MicrosoftBuildUtilitiesCorePackageVersion>15.6.82</MicrosoftBuildUtilitiesCorePackageVersion>
|
<MicrosoftBuildUtilitiesCorePackageVersion>15.8.166</MicrosoftBuildUtilitiesCorePackageVersion>
|
||||||
<MicrosoftCodeAnalysisCSharpPackageVersion>2.8.0</MicrosoftCodeAnalysisCSharpPackageVersion>
|
<MicrosoftCodeAnalysisCSharpPackageVersion>2.8.0</MicrosoftCodeAnalysisCSharpPackageVersion>
|
||||||
<MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion>2.8.0</MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion>
|
<MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion>2.8.0</MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion>
|
||||||
<MicrosoftCodeAnalysisRazorPackageVersion>2.2.0-rtm-35519</MicrosoftCodeAnalysisRazorPackageVersion>
|
<MicrosoftCodeAnalysisRazorPackageVersion>3.0.0-alpha1-10742</MicrosoftCodeAnalysisRazorPackageVersion>
|
||||||
<MicrosoftDiaSymReaderNativePackageVersion>1.7.0</MicrosoftDiaSymReaderNativePackageVersion>
|
<MicrosoftDiaSymReaderNativePackageVersion>1.7.0</MicrosoftDiaSymReaderNativePackageVersion>
|
||||||
<MicrosoftExtensionsCachingMemoryPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsCachingMemoryPackageVersion>
|
<MicrosoftExtensionsCachingMemoryPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsCachingMemoryPackageVersion>
|
||||||
<MicrosoftExtensionsClosedGenericMatcherSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsClosedGenericMatcherSourcesPackageVersion>
|
<MicrosoftExtensionsClosedGenericMatcherSourcesPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsClosedGenericMatcherSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
|
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationJsonPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsConfigurationJsonPackageVersion>
|
<MicrosoftExtensionsConfigurationJsonPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsConfigurationJsonPackageVersion>
|
||||||
<MicrosoftExtensionsConfigurationPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsConfigurationPackageVersion>
|
<MicrosoftExtensionsConfigurationPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsConfigurationPackageVersion>
|
||||||
<MicrosoftExtensionsCopyOnWriteDictionarySourcesPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsCopyOnWriteDictionarySourcesPackageVersion>
|
<MicrosoftExtensionsCopyOnWriteDictionarySourcesPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsCopyOnWriteDictionarySourcesPackageVersion>
|
||||||
<MicrosoftExtensionsDependencyInjectionPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsDependencyInjectionPackageVersion>
|
<MicrosoftExtensionsDependencyInjectionPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsDependencyInjectionPackageVersion>
|
||||||
<MicrosoftExtensionsDependencyModelPackageVersion>2.1.0</MicrosoftExtensionsDependencyModelPackageVersion>
|
<MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview1-26907-05</MicrosoftExtensionsDependencyModelPackageVersion>
|
||||||
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
|
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
|
||||||
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
|
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
|
||||||
<MicrosoftExtensionsFileProvidersCompositePackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsFileProvidersCompositePackageVersion>
|
<MicrosoftExtensionsFileProvidersCompositePackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsFileProvidersCompositePackageVersion>
|
||||||
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
|
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
|
||||||
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
|
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
|
||||||
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
|
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsLocalizationPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsLocalizationPackageVersion>
|
<MicrosoftExtensionsLocalizationPackageVersion>3.0.0-alpha1-10742</MicrosoftExtensionsLocalizationPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
|
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingConsolePackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsLoggingConsolePackageVersion>
|
<MicrosoftExtensionsLoggingConsolePackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsLoggingConsolePackageVersion>
|
||||||
<MicrosoftExtensionsLoggingDebugPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsLoggingDebugPackageVersion>
|
<MicrosoftExtensionsLoggingDebugPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsLoggingDebugPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsLoggingPackageVersion>
|
<MicrosoftExtensionsLoggingPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsLoggingPackageVersion>
|
||||||
<MicrosoftExtensionsLoggingTestingPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsLoggingTestingPackageVersion>
|
<MicrosoftExtensionsLoggingTestingPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsLoggingTestingPackageVersion>
|
||||||
<MicrosoftExtensionsObjectMethodExecutorSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsObjectMethodExecutorSourcesPackageVersion>
|
<MicrosoftExtensionsObjectMethodExecutorSourcesPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsObjectMethodExecutorSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsOptionsPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsOptionsPackageVersion>
|
<MicrosoftExtensionsOptionsPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsOptionsPackageVersion>
|
||||||
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
|
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsPrimitivesPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsPrimitivesPackageVersion>
|
<MicrosoftExtensionsPrimitivesPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsPrimitivesPackageVersion>
|
||||||
<MicrosoftExtensionsPropertyActivatorSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsPropertyActivatorSourcesPackageVersion>
|
<MicrosoftExtensionsPropertyActivatorSourcesPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsPropertyActivatorSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsPropertyHelperSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsPropertyHelperSourcesPackageVersion>
|
<MicrosoftExtensionsPropertyHelperSourcesPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsPropertyHelperSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsSecurityHelperSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsSecurityHelperSourcesPackageVersion>
|
<MicrosoftExtensionsSecurityHelperSourcesPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsSecurityHelperSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
|
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
|
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
|
||||||
<MicrosoftExtensionsWebEncodersPackageVersion>2.2.0-rtm-35519</MicrosoftExtensionsWebEncodersPackageVersion>
|
<MicrosoftExtensionsWebEncodersPackageVersion>3.0.0-preview-181113-11</MicrosoftExtensionsWebEncodersPackageVersion>
|
||||||
<MicrosoftNETCoreApp20PackageVersion>2.0.9</MicrosoftNETCoreApp20PackageVersion>
|
<MicrosoftNETCoreApp20PackageVersion>2.0.9</MicrosoftNETCoreApp20PackageVersion>
|
||||||
<MicrosoftNETCoreApp21PackageVersion>2.1.3</MicrosoftNETCoreApp21PackageVersion>
|
<MicrosoftNETCoreApp21PackageVersion>2.1.3</MicrosoftNETCoreApp21PackageVersion>
|
||||||
<MicrosoftNETCoreApp22PackageVersion>2.2.0-preview3-27014-02</MicrosoftNETCoreApp22PackageVersion>
|
<MicrosoftNETCoreAppPackageVersion>3.0.0-preview1-26907-05</MicrosoftNETCoreAppPackageVersion>
|
||||||
<MicrosoftNetHttpHeadersPackageVersion>2.2.0-rtm-35519</MicrosoftNetHttpHeadersPackageVersion>
|
<MicrosoftNetHttpHeadersPackageVersion>3.0.0-alpha1-10742</MicrosoftNetHttpHeadersPackageVersion>
|
||||||
<MicrosoftNETSdkRazorPackageVersion>2.2.0-rtm-35519</MicrosoftNETSdkRazorPackageVersion>
|
<MicrosoftNETSdkRazorPackageVersion>3.0.0-alpha1-10742</MicrosoftNETSdkRazorPackageVersion>
|
||||||
<MicrosoftNETTestSdkPackageVersion>15.6.1</MicrosoftNETTestSdkPackageVersion>
|
<MicrosoftNETTestSdkPackageVersion>15.6.1</MicrosoftNETTestSdkPackageVersion>
|
||||||
<MoqPackageVersion>4.10.0</MoqPackageVersion>
|
<MoqPackageVersion>4.10.0</MoqPackageVersion>
|
||||||
<NETStandardLibrary20PackageVersion>2.0.3</NETStandardLibrary20PackageVersion>
|
<NETStandardLibrary20PackageVersion>2.0.3</NETStandardLibrary20PackageVersion>
|
||||||
<NewtonsoftJsonBsonPackageVersion>1.0.1</NewtonsoftJsonBsonPackageVersion>
|
<NewtonsoftJsonBsonPackageVersion>1.0.1</NewtonsoftJsonBsonPackageVersion>
|
||||||
<NewtonsoftJsonPackageVersion>11.0.2</NewtonsoftJsonPackageVersion>
|
<NewtonsoftJsonPackageVersion>11.0.2</NewtonsoftJsonPackageVersion>
|
||||||
<SystemComponentModelAnnotationsPackageVersion>4.5.0</SystemComponentModelAnnotationsPackageVersion>
|
<SystemComponentModelAnnotationsPackageVersion>4.6.0-preview1-26907-04</SystemComponentModelAnnotationsPackageVersion>
|
||||||
<SystemDiagnosticsDiagnosticSourcePackageVersion>4.5.0</SystemDiagnosticsDiagnosticSourcePackageVersion>
|
<SystemDiagnosticsDiagnosticSourcePackageVersion>4.6.0-preview1-26907-04</SystemDiagnosticsDiagnosticSourcePackageVersion>
|
||||||
<SystemNetHttpPackageVersion>4.3.2</SystemNetHttpPackageVersion>
|
<SystemNetHttpPackageVersion>4.3.2</SystemNetHttpPackageVersion>
|
||||||
<SystemThreadingTasksExtensionsPackageVersion>4.5.1</SystemThreadingTasksExtensionsPackageVersion>
|
<SystemThreadingTasksExtensionsPackageVersion>4.6.0-preview1-26907-04</SystemThreadingTasksExtensionsPackageVersion>
|
||||||
<XunitAnalyzersPackageVersion>0.10.0</XunitAnalyzersPackageVersion>
|
<XunitAnalyzersPackageVersion>0.10.0</XunitAnalyzersPackageVersion>
|
||||||
<XunitPackageVersion>2.3.1</XunitPackageVersion>
|
<XunitPackageVersion>2.3.1</XunitPackageVersion>
|
||||||
<XunitRunnerVisualStudioPackageVersion>2.4.0</XunitRunnerVisualStudioPackageVersion>
|
<XunitRunnerVisualStudioPackageVersion>2.4.0</XunitRunnerVisualStudioPackageVersion>
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<EnableBenchmarkValidation>true</EnableBenchmarkValidation>
|
<EnableBenchmarkValidation>true</EnableBenchmarkValidation>
|
||||||
|
<VSTestVerboseOutput Condition="'$(CI)' == 'true'">true</VSTestVerboseOutput>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
@ -14,12 +15,11 @@
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<!-- These properties are use by the automation that updates dependencies.props -->
|
<!-- These properties are use by the automation that updates dependencies.props -->
|
||||||
<LineupPackageId>Internal.AspNetCore.Universe.Lineup</LineupPackageId>
|
<LineupPackageId>Internal.AspNetCore.Universe.Lineup</LineupPackageId>
|
||||||
<LineupPackageVersion>2.2.0-*</LineupPackageVersion>
|
|
||||||
<LineupPackageRestoreSource>https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json</LineupPackageRestoreSource>
|
<LineupPackageRestoreSource>https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json</LineupPackageRestoreSource>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<DotNetCoreRuntime Include="$(MicrosoftNETCoreApp21PackageVersion)" />
|
<DotNetCoreRuntime Include="$(MicrosoftNETCoreApp21PackageVersion)" />
|
||||||
<DotNetCoreRuntime Include="$(MicrosoftNETCoreApp22PackageVersion)" />
|
<DotNetCoreRuntime Include="$(MicrosoftNETCoreAppPackageVersion)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
@ECHO OFF
|
||||||
|
PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0runWithProcDump.ps1' %*; exit $LASTEXITCODE"
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
{
|
{
|
||||||
"sdk": {
|
"sdk": {
|
||||||
"version": "2.2.100-preview2-009404"
|
"version": "3.0.100-preview-009750"
|
||||||
},
|
},
|
||||||
"msbuild-sdks": {
|
"msbuild-sdks": {
|
||||||
"Internal.AspNetCore.Sdk": "2.2.0-preview2-20181003.2"
|
"Internal.AspNetCore.Sdk": "3.0.0-build-20181114.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$cwd = $PSScriptRoot;
|
||||||
|
$job = Start-Job {
|
||||||
|
$dumpsFolder = "${using:cwd}/artifacts/dumps";
|
||||||
|
mkdir $dumpsFolder -Force;
|
||||||
|
|
||||||
|
$procDumpFolder = "${using:cwd}/obj";
|
||||||
|
mkdir $procDumpFolder -Force;
|
||||||
|
|
||||||
|
$procDumpFolder = Resolve-Path $procDumpFolder;
|
||||||
|
Invoke-WebRequest https://download.sysinternals.com/files/Procdump.zip -OutFile "$procDumpFolder/procdump.zip";
|
||||||
|
Expand-Archive "$procDumpFolder/procdump.zip" -DestinationPath "$procDumpFolder" -Force;
|
||||||
|
|
||||||
|
$sleepTime = (1 * 20 * 60)
|
||||||
|
Start-Sleep -Seconds $sleepTime;
|
||||||
|
Write-Host "Producing dumps in $dumpsFolder";
|
||||||
|
Write-Host "Process dumps to capture:"
|
||||||
|
$processes = Get-Process dotnet*, testhost*;
|
||||||
|
$processes | Format-Table;
|
||||||
|
Write-Host "Using ProcDump from $procDumpFolder/procdump.exe";
|
||||||
|
|
||||||
|
$processes |
|
||||||
|
Select-Object -ExpandProperty ID |
|
||||||
|
ForEach-Object { &"$procDumpFolder/procdump.exe" -accepteula -ma $_ $dumpsFolder }
|
||||||
|
}
|
||||||
|
Write-Host "Process dump capture job started. Running run.ps1 next";
|
||||||
|
./run.ps1 default-build @args
|
||||||
|
# Receive-Job $job
|
||||||
|
Stop-Job $job
|
||||||
|
Remove-Job $job
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
write-host $_
|
||||||
|
exit -1;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
namespace MvcSandbox.Controllers
|
||||||
|
{
|
||||||
|
[Route("[controller]/[action]")]
|
||||||
|
public class LoginController : Controller
|
||||||
|
{
|
||||||
|
public IActionResult Index()
|
||||||
|
{
|
||||||
|
return View();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Routing;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Builder
|
||||||
|
{
|
||||||
|
public static class HealthChecksEndpointRouteBuilderExtensions
|
||||||
|
{
|
||||||
|
private static readonly Random _random = new Random();
|
||||||
|
|
||||||
|
public static IEndpointConventionBuilder MapHealthChecks(this IEndpointRouteBuilder builder, string pattern)
|
||||||
|
{
|
||||||
|
return builder.MapGet(
|
||||||
|
pattern,
|
||||||
|
async httpContext =>
|
||||||
|
{
|
||||||
|
await httpContext.Response.WriteAsync(_random.Next() % 2 == 0 ? "Up!" : "Down!");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netcoreapp2.2</TargetFrameworks>
|
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||||
<TargetFrameworks Condition=" '$(DeveloperBuild)' != 'true' AND '$(OS)' == 'Windows_NT' ">$(TargetFrameworks);net461</TargetFrameworks>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
|
@ -11,10 +10,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Mvc\Microsoft.AspNetCore.Mvc.csproj" />
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Mvc\Microsoft.AspNetCore.Mvc.csproj" />
|
||||||
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="$(MicrosoftAspNetCoreDiagnosticsPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="$(MicrosoftAspNetCoreDiagnosticsPackageVersion)" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="$(MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="$(MicrosoftAspNetCoreRazorDesignPackageVersion)" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="$(MicrosoftAspNetCoreServerIISIntegrationPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="$(MicrosoftAspNetCoreServerIISIntegrationPackageVersion)" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="$(MicrosoftAspNetCoreServerKestrelPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="$(MicrosoftAspNetCoreServerKestrelPackageVersion)" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
|
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="$(MicrosoftAspNetCoreStaticFilesPackageVersion)" />
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,15 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
|
@ -20,14 +26,43 @@ namespace MvcSandbox
|
||||||
// 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.
|
||||||
public void Configure(IApplicationBuilder app)
|
public void Configure(IApplicationBuilder app)
|
||||||
{
|
{
|
||||||
app.UseDeveloperExceptionPage();
|
app.UseEndpointRouting(builder =>
|
||||||
app.UseStaticFiles();
|
|
||||||
app.UseMvc(routes =>
|
|
||||||
{
|
{
|
||||||
routes.MapRoute(
|
builder.MapGet(
|
||||||
|
requestDelegate: WriteEndpoints,
|
||||||
|
pattern: "/endpoints",
|
||||||
|
displayName: "Home");
|
||||||
|
|
||||||
|
builder.MapControllerRoute(
|
||||||
name: "default",
|
name: "default",
|
||||||
template: "{controller=Home}/{action=Index}/{id?}");
|
template: "{controller=Home}/{action=Index}/{id?}");
|
||||||
|
|
||||||
|
builder.MapApplication();
|
||||||
|
|
||||||
|
builder.MapHealthChecks("/healthz");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.UseDeveloperExceptionPage();
|
||||||
|
app.UseStaticFiles();
|
||||||
|
|
||||||
|
app.UseEndpoint();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Task WriteEndpoints(HttpContext httpContext)
|
||||||
|
{
|
||||||
|
var dataSource = httpContext.RequestServices.GetRequiredService<CompositeEndpointDataSource>();
|
||||||
|
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
sb.AppendLine("Endpoints:");
|
||||||
|
foreach (var endpoint in dataSource.Endpoints.OfType<RouteEndpoint>().OrderBy(e => e.RoutePattern.RawText, StringComparer.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
sb.AppendLine($"- {endpoint.RoutePattern.RawText} '{endpoint.DisplayName}'");
|
||||||
|
}
|
||||||
|
|
||||||
|
var response = httpContext.Response;
|
||||||
|
response.StatusCode = 200;
|
||||||
|
response.ContentType = "text/plain";
|
||||||
|
return response.WriteAsync(sb.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
|
|
|
||||||
|
|
@ -109,8 +109,8 @@ namespace Microsoft.Extensions.ApiDescription.Tool.Commands
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var finished = Task.WhenAny(resultTask, Task.Delay(TimeSpan.FromMinutes(1)));
|
var finishedIndex = Task.WaitAny(resultTask, Task.Delay(TimeSpan.FromMinutes(1)));
|
||||||
if (!ReferenceEquals(resultTask, finished))
|
if (finishedIndex != 0)
|
||||||
{
|
{
|
||||||
Reporter.WriteWarning(Resources.FormatMethodTimedOut(methodName, serviceName, 1));
|
Reporter.WriteWarning(Resources.FormatMethodTimedOut(methodName, serviceName, 1));
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -121,6 +121,8 @@ namespace Microsoft.Extensions.ApiDescription.Tool.Commands
|
||||||
using (var outStream = File.Create(context.OutputPath))
|
using (var outStream = File.Create(context.OutputPath))
|
||||||
{
|
{
|
||||||
stream.CopyTo(outStream);
|
stream.CopyTo(outStream);
|
||||||
|
|
||||||
|
outStream.Flush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,9 @@
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<RootNamespace>Microsoft.Extensions.ApiDescription.Tool</RootNamespace>
|
<RootNamespace>Microsoft.Extensions.ApiDescription.Tool</RootNamespace>
|
||||||
<TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
|
<TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
|
||||||
|
<VerifyVersion>false</VerifyVersion>
|
||||||
|
<VersionPrefix>$(ExperimentalVersionPrefix)</VersionPrefix>
|
||||||
|
<VersionSuffix>$(ExperimentalVersionSuffix)</VersionSuffix>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup Condition="'$(TargetFramework)' == 'net461'">
|
<ItemGroup Condition="'$(TargetFramework)' == 'net461'">
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
<Description>ASP.NET Core MVC abstractions and interfaces for action invocation and dispatching, authorization, action filters, formatters, model binding, routing, validation, and more.
|
<Description>ASP.NET Core MVC abstractions and interfaces for action invocation and dispatching, authorization, action filters, formatters, model binding, routing, validation, and more.
|
||||||
Commonly used types:
|
Commonly used types:
|
||||||
Microsoft.AspNetCore.Mvc.IActionResult</Description>
|
Microsoft.AspNetCore.Mvc.IActionResult</Description>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||||
<NoWarn>$(NoWarn);CS1591</NoWarn>
|
<NoWarn>$(NoWarn);CS1591</NoWarn>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
<PackageTags>aspnetcore;aspnetcoremvc</PackageTags>
|
<PackageTags>aspnetcore;aspnetcoremvc</PackageTags>
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,10 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Mvc.Abstractions;
|
using Microsoft.AspNetCore.Mvc.Abstractions;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
||||||
using Microsoft.AspNetCore.Mvc.Controllers;
|
using Microsoft.AspNetCore.Mvc.Controllers;
|
||||||
using Microsoft.AspNetCore.Mvc.Formatters;
|
using Microsoft.AspNetCore.Mvc.Formatters;
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Microsoft.AspNetCore.Routing.Template;
|
using Microsoft.AspNetCore.Routing.Template;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Description>ASP.NET Core MVC API explorer functionality for discovering metadata such as the list of controllers and actions, and their URLs and allowed HTTP methods.</Description>
|
<Description>ASP.NET Core MVC API explorer functionality for discovering metadata such as the list of controllers and actions, and their URLs and allowed HTTP methods.</Description>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||||
<NoWarn>$(NoWarn);CS1591</NoWarn>
|
<NoWarn>$(NoWarn);CS1591</NoWarn>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
<PackageTags>aspnetcore;aspnetcoremvc</PackageTags>
|
<PackageTags>aspnetcore;aspnetcoremvc</PackageTags>
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,11 @@ using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc.Abstractions;
|
using Microsoft.AspNetCore.Mvc.Abstractions;
|
||||||
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.ActionConstraints
|
||||||
{
|
{
|
||||||
public class ActionConstraintCache
|
internal class ActionConstraintCache
|
||||||
{
|
{
|
||||||
private readonly IActionDescriptorCollectionProvider _collectionProvider;
|
private readonly IActionDescriptorCollectionProvider _collectionProvider;
|
||||||
private readonly IActionConstraintProvider[] _actionConstraintProviders;
|
private readonly IActionConstraintProvider[] _actionConstraintProviders;
|
||||||
|
|
@ -2,9 +2,8 @@
|
||||||
// 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 System;
|
using System;
|
||||||
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.ActionConstraints
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A default implementation of <see cref="IActionConstraintProvider"/>.
|
/// A default implementation of <see cref="IActionConstraintProvider"/>.
|
||||||
|
|
@ -14,7 +13,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// <see cref="IActionConstraintMetadata"/> implements <see cref="IActionConstraint"/> or
|
/// <see cref="IActionConstraintMetadata"/> implements <see cref="IActionConstraint"/> or
|
||||||
/// <see cref="IActionConstraintFactory"/>/
|
/// <see cref="IActionConstraintFactory"/>/
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public class DefaultActionConstraintProvider : IActionConstraintProvider
|
internal class DefaultActionConstraintProvider : IActionConstraintProvider
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public int Order => -1000;
|
public int Order => -1000;
|
||||||
|
|
@ -61,4 +60,4 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4,12 +4,10 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
|
||||||
using Microsoft.Extensions.Primitives;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.ActionConstraints
|
||||||
{
|
{
|
||||||
public class HttpMethodActionConstraint : IActionConstraint
|
internal class HttpMethodActionConstraint : IActionConstraint
|
||||||
{
|
{
|
||||||
public static readonly int HttpMethodConstraintOrder = 100;
|
public static readonly int HttpMethodConstraintOrder = 100;
|
||||||
|
|
||||||
|
|
@ -1,15 +1,13 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
namespace Microsoft.AspNetCore.Mvc.ActionConstraints
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// An <see cref="IActionConstraint"/> constraint that identifies a type which can be used to select an action
|
/// An <see cref="IActionConstraint"/> constraint that identifies a type which can be used to select an action
|
||||||
/// based on incoming request.
|
/// based on incoming request.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IConsumesActionConstraint : IActionConstraint
|
internal interface IConsumesActionConstraint : IActionConstraint
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents data used to build an <c>ApiDescription</c>, stored as part of the
|
/// Represents data used to build an <c>ApiDescription</c>, stored as part of the
|
||||||
/// <see cref="Abstractions.ActionDescriptor.Properties"/>.
|
/// <see cref="Abstractions.ActionDescriptor.Properties"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ApiDescriptionActionData
|
internal class ApiDescriptionActionData
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The <c>ApiDescription.GroupName</c> of <c>ApiDescription</c> objects for the associated
|
/// The <c>ApiDescription.GroupName</c> of <c>ApiDescription</c> objects for the associated
|
||||||
|
|
@ -15,4 +15,4 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string GroupName { get; set; }
|
public string GroupName { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,189 @@
|
||||||
|
// 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.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
|
{
|
||||||
|
internal static class ActionAttributeRouteModel
|
||||||
|
{
|
||||||
|
public static IEnumerable<SelectorModel> FlattenSelectors(ActionModel actionModel)
|
||||||
|
{
|
||||||
|
// Loop through all attribute routes defined on the controller.
|
||||||
|
// These perform a cross-product with all of the action-level attribute routes.
|
||||||
|
var controllerSelectors = actionModel.Controller.Selectors
|
||||||
|
.Where(sm => sm.AttributeRouteModel != null)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
// We also include metadata and action constraints from the controller
|
||||||
|
// even when there are no routes, or when an action overrides the route template.
|
||||||
|
SelectorModel additionalSelector = null;
|
||||||
|
if (actionModel.Controller.Selectors.Count > 0)
|
||||||
|
{
|
||||||
|
// This logic seems arbitrary but there's a good reason for it.
|
||||||
|
//
|
||||||
|
// When we build the controller level selectors, any metadata or action constraints
|
||||||
|
// that aren't IRouteTemplateProvider will be included in all selectors. So we
|
||||||
|
// pick any selector and then grab all of the stuff that isn't IRouteTemplateProvider
|
||||||
|
// then we've found all of the items that aren't routes.
|
||||||
|
//
|
||||||
|
// This is fragile wrt application model customizing the data - but no one has
|
||||||
|
// run into an issue with this and its pretty esoteric.
|
||||||
|
additionalSelector = new SelectorModel(actionModel.Controller.Selectors.First());
|
||||||
|
additionalSelector.AttributeRouteModel = null;
|
||||||
|
|
||||||
|
for (var i = additionalSelector.ActionConstraints.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (additionalSelector.ActionConstraints[i] is IRouteTemplateProvider)
|
||||||
|
{
|
||||||
|
additionalSelector.ActionConstraints.RemoveAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = additionalSelector.EndpointMetadata.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (additionalSelector.EndpointMetadata[i] is IRouteTemplateProvider)
|
||||||
|
{
|
||||||
|
additionalSelector.EndpointMetadata.RemoveAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var actionConstraints = new List<IActionConstraintMetadata>();
|
||||||
|
|
||||||
|
foreach (var actionSelector in actionModel.Selectors)
|
||||||
|
{
|
||||||
|
var actionRouteModel = actionSelector.AttributeRouteModel;
|
||||||
|
|
||||||
|
// We check the action to see if the template allows combination behavior
|
||||||
|
// (It doesn't start with / or ~/) so that in the case where we have multiple
|
||||||
|
// [Route] attributes on the controller we don't end up creating multiple
|
||||||
|
if (actionRouteModel != null && actionRouteModel.IsAbsoluteTemplate)
|
||||||
|
{
|
||||||
|
// We're overriding the routes from the controller, but any *unbound* constraints
|
||||||
|
// still apply.
|
||||||
|
var selector = new SelectorModel(actionSelector);
|
||||||
|
|
||||||
|
selector.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(
|
||||||
|
left: null,
|
||||||
|
right: actionRouteModel);
|
||||||
|
|
||||||
|
AddActionConstraints(selector, additionalSelector?.ActionConstraints);
|
||||||
|
AddEndpointMetadata(selector, additionalSelector?.EndpointMetadata);
|
||||||
|
|
||||||
|
yield return selector;
|
||||||
|
}
|
||||||
|
else if (controllerSelectors.Count > 0)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < controllerSelectors.Count; i++)
|
||||||
|
{
|
||||||
|
var controllerSelector = controllerSelectors[i];
|
||||||
|
|
||||||
|
// We're using the attribute routes from the controller
|
||||||
|
var selector = new SelectorModel(actionSelector);
|
||||||
|
|
||||||
|
selector.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(
|
||||||
|
controllerSelector.AttributeRouteModel,
|
||||||
|
actionRouteModel);
|
||||||
|
|
||||||
|
AddActionConstraints(selector, controllerSelector.ActionConstraints);
|
||||||
|
AddEndpointMetadata(selector, controllerSelector.EndpointMetadata);
|
||||||
|
|
||||||
|
// No need to include the additional selector here because it would duplicate
|
||||||
|
// data in controllerSelector.
|
||||||
|
|
||||||
|
yield return selector;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// There are no routes on the controller, but any *unbound* constraints
|
||||||
|
// still apply.
|
||||||
|
var selector = new SelectorModel(actionSelector);
|
||||||
|
|
||||||
|
selector.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(
|
||||||
|
left: null,
|
||||||
|
right: actionRouteModel);
|
||||||
|
|
||||||
|
AddActionConstraints(selector, additionalSelector?.ActionConstraints);
|
||||||
|
AddEndpointMetadata(selector, additionalSelector?.EndpointMetadata);
|
||||||
|
|
||||||
|
yield return selector;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddActionConstraints(SelectorModel selector, IList<IActionConstraintMetadata> actionConstraints)
|
||||||
|
{
|
||||||
|
if (actionConstraints != null)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < actionConstraints.Count;i++)
|
||||||
|
{
|
||||||
|
selector.ActionConstraints.Add(actionConstraints[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddEndpointMetadata(SelectorModel selector, IList<object> metadata)
|
||||||
|
{
|
||||||
|
if (metadata != null)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < metadata.Count; i++)
|
||||||
|
{
|
||||||
|
selector.EndpointMetadata.Add(metadata[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<(AttributeRouteModel route, SelectorModel actionSelector, SelectorModel controllerSelector)> GetAttributeRoutes(ActionModel actionModel)
|
||||||
|
{
|
||||||
|
var controllerAttributeRoutes = actionModel.Controller.Selectors
|
||||||
|
.Where(sm => sm.AttributeRouteModel != null)
|
||||||
|
.Select(sm => sm.AttributeRouteModel)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
foreach (var actionSelectorModel in actionModel.Selectors)
|
||||||
|
{
|
||||||
|
var actionRouteModel = actionSelectorModel.AttributeRouteModel;
|
||||||
|
|
||||||
|
// We check the action to see if the template allows combination behavior
|
||||||
|
// (It doesn't start with / or ~/) so that in the case where we have multiple
|
||||||
|
// [Route] attributes on the controller we don't end up creating multiple
|
||||||
|
if (actionRouteModel != null && actionRouteModel.IsAbsoluteTemplate)
|
||||||
|
{
|
||||||
|
var route = AttributeRouteModel.CombineAttributeRouteModel(
|
||||||
|
left: null,
|
||||||
|
right: actionRouteModel);
|
||||||
|
|
||||||
|
yield return (route, actionSelectorModel, null);
|
||||||
|
}
|
||||||
|
else if (controllerAttributeRoutes.Count > 0)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < actionModel.Controller.Selectors.Count; i++)
|
||||||
|
{
|
||||||
|
// We're using the attribute routes from the controller
|
||||||
|
var controllerSelector = actionModel.Controller.Selectors[i];
|
||||||
|
|
||||||
|
var route = AttributeRouteModel.CombineAttributeRouteModel(
|
||||||
|
controllerSelector.AttributeRouteModel,
|
||||||
|
actionRouteModel);
|
||||||
|
|
||||||
|
yield return (route, actionSelectorModel, controllerSelector);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var route = AttributeRouteModel.CombineAttributeRouteModel(
|
||||||
|
left: null,
|
||||||
|
right: actionRouteModel);
|
||||||
|
|
||||||
|
yield return (route, actionSelectorModel, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -50,6 +50,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
|
|
||||||
ActionMethod = other.ActionMethod;
|
ActionMethod = other.ActionMethod;
|
||||||
ActionName = other.ActionName;
|
ActionName = other.ActionName;
|
||||||
|
RouteParameterTransformer = other.RouteParameterTransformer;
|
||||||
|
|
||||||
// Not making a deep copy of the controller, this action still belongs to the same controller.
|
// Not making a deep copy of the controller, this action still belongs to the same controller.
|
||||||
Controller = other.Controller;
|
Controller = other.Controller;
|
||||||
|
|
@ -93,6 +94,18 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
|
|
||||||
public IList<ParameterModel> Parameters { get; }
|
public IList<ParameterModel> Parameters { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets an <see cref="IOutboundParameterTransformer"/> that will be used to transform
|
||||||
|
/// built-in route parameters such as <c>action</c>, <c>controller</c>, and <c>area</c> as well as
|
||||||
|
/// additional parameters specified by <see cref="RouteValues"/> into static segments in the route template.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// <para>
|
||||||
|
/// This feature only applies when using endpoint routing.
|
||||||
|
/// </para>
|
||||||
|
/// </remarks>
|
||||||
|
public IOutboundParameterTransformer RouteParameterTransformer { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a collection of route values that must be present in the
|
/// Gets a collection of route values that must be present in the
|
||||||
/// <see cref="RouteData.Values"/> for the corresponding action to be selected.
|
/// <see cref="RouteData.Values"/> for the corresponding action to be selected.
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
|
||||||
|
|
@ -4,14 +4,13 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Mvc.ApplicationModels;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Applies conventions to a <see cref="ApplicationModel"/>.
|
/// Applies conventions to a <see cref="ApplicationModel"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class ApplicationModelConventions
|
internal static class ApplicationModelConventions
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Applies conventions to a <see cref="ApplicationModel"/>.
|
/// Applies conventions to a <see cref="ApplicationModel"/>.
|
||||||
|
|
@ -0,0 +1,361 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
|
using Microsoft.AspNetCore.Routing;
|
||||||
|
using Microsoft.Extensions.Internal;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A facade service for creating application models.
|
||||||
|
/// </summary>
|
||||||
|
internal class ApplicationModelFactory
|
||||||
|
{
|
||||||
|
private readonly IApplicationModelProvider[] _applicationModelProviders;
|
||||||
|
private readonly IList<IApplicationModelConvention> _conventions;
|
||||||
|
|
||||||
|
public ApplicationModelFactory(
|
||||||
|
IEnumerable<IApplicationModelProvider> applicationModelProviders,
|
||||||
|
IOptions<MvcOptions> options)
|
||||||
|
{
|
||||||
|
if (applicationModelProviders == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(applicationModelProviders));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(options));
|
||||||
|
}
|
||||||
|
|
||||||
|
_applicationModelProviders = applicationModelProviders.OrderBy(p => p.Order).ToArray();
|
||||||
|
_conventions = options.Value.Conventions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApplicationModel CreateApplicationModel(IEnumerable<TypeInfo> controllerTypes)
|
||||||
|
{
|
||||||
|
if (controllerTypes == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(controllerTypes));
|
||||||
|
}
|
||||||
|
|
||||||
|
var context = new ApplicationModelProviderContext(controllerTypes);
|
||||||
|
|
||||||
|
for (var i = 0; i < _applicationModelProviders.Length; i++)
|
||||||
|
{
|
||||||
|
_applicationModelProviders[i].OnProvidersExecuting(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = _applicationModelProviders.Length - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
_applicationModelProviders[i].OnProvidersExecuted(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplicationModelConventions.ApplyConventions(context.Result, _conventions);
|
||||||
|
|
||||||
|
return context.Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<TResult> Flatten<TResult>(
|
||||||
|
ApplicationModel application,
|
||||||
|
Func<ApplicationModel, ControllerModel, ActionModel, SelectorModel, TResult> flattener)
|
||||||
|
{
|
||||||
|
var results = new List<TResult>();
|
||||||
|
var errors = new Dictionary<MethodInfo, IList<string>>();
|
||||||
|
|
||||||
|
var actionsByMethod = new Dictionary<MethodInfo, List<(ActionModel, SelectorModel)>>();
|
||||||
|
var actionsByRouteName = new Dictionary<string, List<(ActionModel, SelectorModel)>>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
var routeTemplateErrors = new List<string>();
|
||||||
|
|
||||||
|
foreach (var controller in application.Controllers)
|
||||||
|
{
|
||||||
|
foreach (var action in controller.Actions)
|
||||||
|
{
|
||||||
|
foreach (var selector in ActionAttributeRouteModel.FlattenSelectors(action))
|
||||||
|
{
|
||||||
|
// PostProcess attribute routes so we can observe any errors.
|
||||||
|
ReplaceAttributeRouteTokens(controller, action, selector, routeTemplateErrors);
|
||||||
|
|
||||||
|
// Add to the data structures we use to find errors.
|
||||||
|
AddActionToMethodInfoMap(actionsByMethod, action, selector);
|
||||||
|
AddActionToRouteNameMap(actionsByRouteName, action, selector);
|
||||||
|
|
||||||
|
var result = flattener(application, controller, action, selector);
|
||||||
|
Debug.Assert(result != null);
|
||||||
|
|
||||||
|
results.Add(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var attributeRoutingConfigurationErrors = new Dictionary<MethodInfo, string>();
|
||||||
|
foreach (var (method, actions) in actionsByMethod)
|
||||||
|
{
|
||||||
|
ValidateActionGroupConfiguration(
|
||||||
|
method,
|
||||||
|
actions,
|
||||||
|
attributeRoutingConfigurationErrors);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attributeRoutingConfigurationErrors.Any())
|
||||||
|
{
|
||||||
|
var message = CreateAttributeRoutingAggregateErrorMessage(attributeRoutingConfigurationErrors.Values);
|
||||||
|
|
||||||
|
throw new InvalidOperationException(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
var namedRoutedErrors = ValidateNamedAttributeRoutedActions(actionsByRouteName);
|
||||||
|
if (namedRoutedErrors.Any())
|
||||||
|
{
|
||||||
|
var message = CreateAttributeRoutingAggregateErrorMessage(namedRoutedErrors);
|
||||||
|
throw new InvalidOperationException(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (routeTemplateErrors.Any())
|
||||||
|
{
|
||||||
|
var message = CreateAttributeRoutingAggregateErrorMessage(routeTemplateErrors);
|
||||||
|
throw new InvalidOperationException(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ReplaceAttributeRouteTokens(
|
||||||
|
ControllerModel controller,
|
||||||
|
ActionModel action,
|
||||||
|
SelectorModel selector,
|
||||||
|
List<string> errors)
|
||||||
|
{
|
||||||
|
if (selector.AttributeRouteModel == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var routeValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
|
||||||
|
{
|
||||||
|
{ "action", action.ActionName },
|
||||||
|
{ "controller", controller.ControllerName },
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var kvp in action.RouteValues)
|
||||||
|
{
|
||||||
|
routeValues.TryAdd(kvp.Key, kvp.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var kvp in controller.RouteValues)
|
||||||
|
{
|
||||||
|
routeValues.TryAdd(kvp.Key, kvp.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
selector.AttributeRouteModel.Template = AttributeRouteModel.ReplaceTokens(
|
||||||
|
selector.AttributeRouteModel.Template,
|
||||||
|
routeValues,
|
||||||
|
action.RouteParameterTransformer);
|
||||||
|
|
||||||
|
if (selector.AttributeRouteModel.Name != null)
|
||||||
|
{
|
||||||
|
selector.AttributeRouteModel.Name = AttributeRouteModel.ReplaceTokens(
|
||||||
|
selector.AttributeRouteModel.Name,
|
||||||
|
routeValues,
|
||||||
|
action.RouteParameterTransformer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (InvalidOperationException ex)
|
||||||
|
{
|
||||||
|
// Routing will throw an InvalidOperationException here if we can't parse/replace tokens
|
||||||
|
// in the template.
|
||||||
|
var message = Resources.FormatAttributeRoute_IndividualErrorMessage(
|
||||||
|
action.DisplayName,
|
||||||
|
Environment.NewLine,
|
||||||
|
ex.Message);
|
||||||
|
|
||||||
|
errors.Add(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddActionToMethodInfoMap(
|
||||||
|
Dictionary<MethodInfo, List<(ActionModel, SelectorModel)>> actionsByMethod,
|
||||||
|
ActionModel action,
|
||||||
|
SelectorModel selector)
|
||||||
|
{
|
||||||
|
if (!actionsByMethod.TryGetValue(action.ActionMethod, out var actions))
|
||||||
|
{
|
||||||
|
actions = new List<(ActionModel, SelectorModel)>();
|
||||||
|
actionsByMethod.Add(action.ActionMethod, actions);
|
||||||
|
}
|
||||||
|
|
||||||
|
actions.Add((action, selector));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddActionToRouteNameMap(
|
||||||
|
Dictionary<string, List<(ActionModel action, SelectorModel selector)>> actionsByRouteName,
|
||||||
|
ActionModel action,
|
||||||
|
SelectorModel selector)
|
||||||
|
{
|
||||||
|
var routeName = selector.AttributeRouteModel?.Name;
|
||||||
|
if (selector.AttributeRouteModel?.Name == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!actionsByRouteName.TryGetValue(routeName, out var actions))
|
||||||
|
{
|
||||||
|
actions = new List<(ActionModel, SelectorModel)>();
|
||||||
|
actionsByRouteName.Add(routeName, actions);
|
||||||
|
}
|
||||||
|
|
||||||
|
actions.Add((action, selector));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<string> AddErrorNumbers(IEnumerable<string> namedRoutedErrors)
|
||||||
|
{
|
||||||
|
return namedRoutedErrors
|
||||||
|
.Select((error, i) =>
|
||||||
|
Resources.FormatAttributeRoute_AggregateErrorMessage_ErrorNumber(
|
||||||
|
i + 1,
|
||||||
|
Environment.NewLine,
|
||||||
|
error))
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<string> ValidateNamedAttributeRoutedActions(
|
||||||
|
Dictionary<string, List<(ActionModel action, SelectorModel selector)>> actionsByRouteName)
|
||||||
|
{
|
||||||
|
var namedRouteErrors = new List<string>();
|
||||||
|
|
||||||
|
foreach (var (routeName, actions) in actionsByRouteName)
|
||||||
|
{
|
||||||
|
// We are looking for attribute routed actions that have the same name but
|
||||||
|
// different route templates. We pick the first template of the group and
|
||||||
|
// we compare it against the rest of the templates that have that same name
|
||||||
|
// associated.
|
||||||
|
// The moment we find one that is different we report the whole group to the
|
||||||
|
// user in the error message so that he can see the different actions and the
|
||||||
|
// different templates for a given named attribute route.
|
||||||
|
var template = actions[0].selector.AttributeRouteModel.Template;
|
||||||
|
|
||||||
|
for (var i = 1; i < actions.Count; i++)
|
||||||
|
{
|
||||||
|
var other = actions[i].selector.AttributeRouteModel.Template;
|
||||||
|
|
||||||
|
if (!template.Equals(other, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
var descriptions = actions.Select(a =>
|
||||||
|
{
|
||||||
|
return Resources.FormatAttributeRoute_DuplicateNames_Item(a.action.DisplayName, a.selector.AttributeRouteModel.Template);
|
||||||
|
});
|
||||||
|
|
||||||
|
var message = Resources.FormatAttributeRoute_DuplicateNames(routeName, Environment.NewLine, string.Join(Environment.NewLine, descriptions));
|
||||||
|
namedRouteErrors.Add(message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return namedRouteErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ValidateActionGroupConfiguration(
|
||||||
|
MethodInfo method,
|
||||||
|
List<(ActionModel action, SelectorModel selector)> actions,
|
||||||
|
IDictionary<MethodInfo, string> routingConfigurationErrors)
|
||||||
|
{
|
||||||
|
var hasAttributeRoutedActions = false;
|
||||||
|
var hasConventionallyRoutedActions = false;
|
||||||
|
|
||||||
|
for (var i = 0; i < actions.Count; i++)
|
||||||
|
{
|
||||||
|
if (actions[i].selector.AttributeRouteModel == null)
|
||||||
|
{
|
||||||
|
hasConventionallyRoutedActions = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hasAttributeRoutedActions = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate that no method result in attribute and non attribute actions at the same time.
|
||||||
|
// By design, mixing attribute and conventionally actions in the same method is not allowed.
|
||||||
|
//
|
||||||
|
// Assuming the controller doesn't specify a route template, this example would not be allowed:
|
||||||
|
//
|
||||||
|
// [HttpGet]
|
||||||
|
// [HttpPost("Foo")]
|
||||||
|
// public void Foo() { }
|
||||||
|
if (hasAttributeRoutedActions && hasConventionallyRoutedActions)
|
||||||
|
{
|
||||||
|
var message = CreateMixedRoutedActionDescriptorsErrorMessage(method, actions);
|
||||||
|
routingConfigurationErrors.Add(method, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string CreateMixedRoutedActionDescriptorsErrorMessage(
|
||||||
|
MethodInfo method,
|
||||||
|
List<(ActionModel action, SelectorModel selector)> actions)
|
||||||
|
{
|
||||||
|
// Text to show as the attribute route template for conventionally routed actions.
|
||||||
|
var nullTemplate = Resources.AttributeRoute_NullTemplateRepresentation;
|
||||||
|
|
||||||
|
var actionDescriptions = new List<string>();
|
||||||
|
for (var i = 0; i < actions.Count; i++)
|
||||||
|
{
|
||||||
|
var (action, selector) = actions[i];
|
||||||
|
var routeTemplate = selector.AttributeRouteModel?.Template ?? nullTemplate;
|
||||||
|
|
||||||
|
var verbs = selector.ActionConstraints?.OfType<HttpMethodActionConstraint>().FirstOrDefault()?.HttpMethods;
|
||||||
|
|
||||||
|
var formattedVerbs = string.Empty;
|
||||||
|
if (verbs != null)
|
||||||
|
{
|
||||||
|
formattedVerbs = string.Join(", ", verbs.OrderBy(v => v, StringComparer.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
|
|
||||||
|
var description = Resources.FormatAttributeRoute_MixedAttributeAndConventionallyRoutedActions_ForMethod_Item(
|
||||||
|
action.DisplayName,
|
||||||
|
routeTemplate,
|
||||||
|
formattedVerbs);
|
||||||
|
|
||||||
|
actionDescriptions.Add(description);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sample error message:
|
||||||
|
//
|
||||||
|
// A method 'MyApplication.CustomerController.Index' must not define attributed actions and
|
||||||
|
// non attributed actions at the same time:
|
||||||
|
// Action: 'MyApplication.CustomerController.Index' - Route Template: 'Products' - HTTP Verbs: 'PUT'
|
||||||
|
// Action: 'MyApplication.CustomerController.Index' - Route Template: '(none)' - HTTP Verbs: 'POST'
|
||||||
|
//
|
||||||
|
// Use 'AcceptVerbsAttribute' to create a single route that allows multiple HTTP verbs and defines a route,
|
||||||
|
// or set a route template in all attributes that constrain HTTP verbs.
|
||||||
|
|
||||||
|
var formattedMethodInfo = $"{TypeNameHelper.GetTypeDisplayName(method.ReflectedType)}.{method.Name} ({method.ReflectedType.Assembly.GetName().Name})";
|
||||||
|
return Resources.FormatAttributeRoute_MixedAttributeAndConventionallyRoutedActions_ForMethod(
|
||||||
|
formattedMethodInfo,
|
||||||
|
Environment.NewLine,
|
||||||
|
string.Join(Environment.NewLine, actionDescriptions));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string CreateAttributeRoutingAggregateErrorMessage(IEnumerable<string> individualErrors)
|
||||||
|
{
|
||||||
|
var errorMessages = AddErrorNumbers(individualErrors);
|
||||||
|
|
||||||
|
var message = Resources.FormatAttributeRoute_AggregateErrorMessage(
|
||||||
|
Environment.NewLine,
|
||||||
|
string.Join(Environment.NewLine + Environment.NewLine, errorMessages));
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,12 +5,11 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc.ApplicationModels;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Authorization;
|
using Microsoft.AspNetCore.Mvc.Authorization;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
{
|
{
|
||||||
public class AuthorizationApplicationModelProvider : IApplicationModelProvider
|
internal class AuthorizationApplicationModelProvider : IApplicationModelProvider
|
||||||
{
|
{
|
||||||
private readonly IAuthorizationPolicyProvider _policyProvider;
|
private readonly IAuthorizationPolicyProvider _policyProvider;
|
||||||
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,259 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Abstractions;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Controllers;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
|
using Resources = Microsoft.AspNetCore.Mvc.Core.Resources;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Creates instances of <see cref="ControllerActionDescriptor"/> from application model
|
||||||
|
/// types.
|
||||||
|
/// </summary>
|
||||||
|
internal static class ControllerActionDescriptorBuilder
|
||||||
|
{
|
||||||
|
public static IList<ControllerActionDescriptor> Build(ApplicationModel application)
|
||||||
|
{
|
||||||
|
return ApplicationModelFactory.Flatten(application, CreateActionDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ControllerActionDescriptor CreateActionDescriptor(
|
||||||
|
ApplicationModel application,
|
||||||
|
ControllerModel controller,
|
||||||
|
ActionModel action,
|
||||||
|
SelectorModel selector)
|
||||||
|
{
|
||||||
|
var actionDescriptor = new ControllerActionDescriptor
|
||||||
|
{
|
||||||
|
ActionName = action.ActionName,
|
||||||
|
MethodInfo = action.ActionMethod,
|
||||||
|
};
|
||||||
|
|
||||||
|
actionDescriptor.ControllerName = controller.ControllerName;
|
||||||
|
actionDescriptor.ControllerTypeInfo = controller.ControllerType;
|
||||||
|
AddControllerPropertyDescriptors(actionDescriptor, controller);
|
||||||
|
|
||||||
|
AddActionConstraints(actionDescriptor, selector);
|
||||||
|
AddEndpointMetadata(actionDescriptor, selector);
|
||||||
|
AddAttributeRoute(actionDescriptor, selector);
|
||||||
|
AddParameterDescriptors(actionDescriptor, action);
|
||||||
|
AddActionFilters(actionDescriptor, action.Filters, controller.Filters, application.Filters);
|
||||||
|
AddApiExplorerInfo(actionDescriptor, application, controller, action);
|
||||||
|
AddRouteValues(actionDescriptor, controller, action);
|
||||||
|
AddProperties(actionDescriptor, action, controller, application);
|
||||||
|
|
||||||
|
return actionDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddControllerPropertyDescriptors(ActionDescriptor actionDescriptor, ControllerModel controller)
|
||||||
|
{
|
||||||
|
actionDescriptor.BoundProperties = controller.ControllerProperties
|
||||||
|
.Where(p => p.BindingInfo != null)
|
||||||
|
.Select(CreateParameterDescriptor)
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddParameterDescriptors(ActionDescriptor actionDescriptor, ActionModel action)
|
||||||
|
{
|
||||||
|
var parameterDescriptors = new List<ParameterDescriptor>();
|
||||||
|
foreach (var parameter in action.Parameters)
|
||||||
|
{
|
||||||
|
var parameterDescriptor = CreateParameterDescriptor(parameter);
|
||||||
|
parameterDescriptors.Add(parameterDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
actionDescriptor.Parameters = parameterDescriptors;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ParameterDescriptor CreateParameterDescriptor(ParameterModel parameterModel)
|
||||||
|
{
|
||||||
|
var parameterDescriptor = new ControllerParameterDescriptor()
|
||||||
|
{
|
||||||
|
Name = parameterModel.ParameterName,
|
||||||
|
ParameterType = parameterModel.ParameterInfo.ParameterType,
|
||||||
|
BindingInfo = parameterModel.BindingInfo,
|
||||||
|
ParameterInfo = parameterModel.ParameterInfo,
|
||||||
|
};
|
||||||
|
|
||||||
|
return parameterDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ParameterDescriptor CreateParameterDescriptor(PropertyModel propertyModel)
|
||||||
|
{
|
||||||
|
var parameterDescriptor = new ControllerBoundPropertyDescriptor()
|
||||||
|
{
|
||||||
|
BindingInfo = propertyModel.BindingInfo,
|
||||||
|
Name = propertyModel.PropertyName,
|
||||||
|
ParameterType = propertyModel.PropertyInfo.PropertyType,
|
||||||
|
PropertyInfo = propertyModel.PropertyInfo,
|
||||||
|
};
|
||||||
|
|
||||||
|
return parameterDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddApiExplorerInfo(
|
||||||
|
ControllerActionDescriptor actionDescriptor,
|
||||||
|
ApplicationModel application,
|
||||||
|
ControllerModel controller,
|
||||||
|
ActionModel action)
|
||||||
|
{
|
||||||
|
var isVisible =
|
||||||
|
action.ApiExplorer?.IsVisible ??
|
||||||
|
controller.ApiExplorer?.IsVisible ??
|
||||||
|
application.ApiExplorer?.IsVisible ??
|
||||||
|
false;
|
||||||
|
|
||||||
|
var isVisibleSetOnActionOrController =
|
||||||
|
action.ApiExplorer?.IsVisible ??
|
||||||
|
controller.ApiExplorer?.IsVisible ??
|
||||||
|
false;
|
||||||
|
|
||||||
|
// ApiExplorer isn't supported on conventional-routed actions, but we still allow you to configure
|
||||||
|
// it at the application level when you have a mix of controller types. We'll just skip over enabling
|
||||||
|
// ApiExplorer for conventional-routed controllers when this happens.
|
||||||
|
var isVisibleSetOnApplication = application.ApiExplorer?.IsVisible ?? false;
|
||||||
|
|
||||||
|
if (isVisibleSetOnActionOrController && !IsAttributeRouted(actionDescriptor))
|
||||||
|
{
|
||||||
|
// ApiExplorer is only supported on attribute routed actions.
|
||||||
|
throw new InvalidOperationException(Resources.FormatApiExplorer_UnsupportedAction(
|
||||||
|
actionDescriptor.DisplayName));
|
||||||
|
}
|
||||||
|
else if (isVisibleSetOnApplication && !IsAttributeRouted(actionDescriptor))
|
||||||
|
{
|
||||||
|
// This is the case where we're going to be lenient, just ignore it.
|
||||||
|
}
|
||||||
|
else if (isVisible)
|
||||||
|
{
|
||||||
|
Debug.Assert(IsAttributeRouted(actionDescriptor));
|
||||||
|
|
||||||
|
var apiExplorerActionData = new ApiDescriptionActionData()
|
||||||
|
{
|
||||||
|
GroupName = action.ApiExplorer?.GroupName ?? controller.ApiExplorer?.GroupName,
|
||||||
|
};
|
||||||
|
|
||||||
|
actionDescriptor.SetProperty(apiExplorerActionData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddProperties(
|
||||||
|
ControllerActionDescriptor actionDescriptor,
|
||||||
|
ActionModel action,
|
||||||
|
ControllerModel controller,
|
||||||
|
ApplicationModel application)
|
||||||
|
{
|
||||||
|
foreach (var item in application.Properties)
|
||||||
|
{
|
||||||
|
actionDescriptor.Properties[item.Key] = item.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in controller.Properties)
|
||||||
|
{
|
||||||
|
actionDescriptor.Properties[item.Key] = item.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in action.Properties)
|
||||||
|
{
|
||||||
|
actionDescriptor.Properties[item.Key] = item.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddActionFilters(
|
||||||
|
ControllerActionDescriptor actionDescriptor,
|
||||||
|
IEnumerable<IFilterMetadata> actionFilters,
|
||||||
|
IEnumerable<IFilterMetadata> controllerFilters,
|
||||||
|
IEnumerable<IFilterMetadata> globalFilters)
|
||||||
|
{
|
||||||
|
actionDescriptor.FilterDescriptors =
|
||||||
|
actionFilters.Select(f => new FilterDescriptor(f, FilterScope.Action))
|
||||||
|
.Concat(controllerFilters.Select(f => new FilterDescriptor(f, FilterScope.Controller)))
|
||||||
|
.Concat(globalFilters.Select(f => new FilterDescriptor(f, FilterScope.Global)))
|
||||||
|
.OrderBy(d => d, FilterDescriptorOrderComparer.Comparer)
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddActionConstraints(ControllerActionDescriptor actionDescriptor, SelectorModel selectorModel)
|
||||||
|
{
|
||||||
|
if (selectorModel.ActionConstraints?.Count > 0)
|
||||||
|
{
|
||||||
|
actionDescriptor.ActionConstraints = new List<IActionConstraintMetadata>(selectorModel.ActionConstraints);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddEndpointMetadata(ControllerActionDescriptor actionDescriptor, SelectorModel selectorModel)
|
||||||
|
{
|
||||||
|
if (selectorModel.EndpointMetadata?.Count > 0)
|
||||||
|
{
|
||||||
|
actionDescriptor.EndpointMetadata = new List<object>(selectorModel.EndpointMetadata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddAttributeRoute(ControllerActionDescriptor actionDescriptor, SelectorModel selectorModel)
|
||||||
|
{
|
||||||
|
if (selectorModel.AttributeRouteModel != null)
|
||||||
|
{
|
||||||
|
actionDescriptor.AttributeRouteInfo = new AttributeRouteInfo
|
||||||
|
{
|
||||||
|
Template = selectorModel.AttributeRouteModel.Template,
|
||||||
|
Order = selectorModel.AttributeRouteModel.Order ?? 0,
|
||||||
|
Name = selectorModel.AttributeRouteModel.Name,
|
||||||
|
SuppressLinkGeneration = selectorModel.AttributeRouteModel.SuppressLinkGeneration,
|
||||||
|
SuppressPathMatching = selectorModel.AttributeRouteModel.SuppressPathMatching,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddRouteValues(
|
||||||
|
ControllerActionDescriptor actionDescriptor,
|
||||||
|
ControllerModel controller,
|
||||||
|
ActionModel action)
|
||||||
|
{
|
||||||
|
// Apply all the constraints defined on the action, then controller (for example, [Area])
|
||||||
|
// to the actions. Also keep track of all the constraints that require preventing actions
|
||||||
|
// without the constraint to match. For example, actions without an [Area] attribute on their
|
||||||
|
// controller should not match when a value has been given for area when matching a url or
|
||||||
|
// generating a link.
|
||||||
|
foreach (var kvp in action.RouteValues)
|
||||||
|
{
|
||||||
|
// Skip duplicates
|
||||||
|
if (!actionDescriptor.RouteValues.ContainsKey(kvp.Key))
|
||||||
|
{
|
||||||
|
actionDescriptor.RouteValues.Add(kvp.Key, kvp.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var kvp in controller.RouteValues)
|
||||||
|
{
|
||||||
|
// Skip duplicates - this also means that a value on the action will take precedence
|
||||||
|
if (!actionDescriptor.RouteValues.ContainsKey(kvp.Key))
|
||||||
|
{
|
||||||
|
actionDescriptor.RouteValues.Add(kvp.Key, kvp.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lastly add the 'default' values
|
||||||
|
if (!actionDescriptor.RouteValues.ContainsKey("action"))
|
||||||
|
{
|
||||||
|
actionDescriptor.RouteValues.Add("action", action.ActionName ?? string.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!actionDescriptor.RouteValues.ContainsKey("controller"))
|
||||||
|
{
|
||||||
|
actionDescriptor.RouteValues.Add("controller", controller.ControllerName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsAttributeRouted(ActionDescriptor actionDescriptor)
|
||||||
|
{
|
||||||
|
return actionDescriptor.AttributeRouteInfo != null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,45 +3,34 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Microsoft.AspNetCore.Mvc.Abstractions;
|
using Microsoft.AspNetCore.Mvc.Abstractions;
|
||||||
using Microsoft.AspNetCore.Mvc.ApplicationModels;
|
|
||||||
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
||||||
using Microsoft.AspNetCore.Mvc.Controllers;
|
using Microsoft.AspNetCore.Mvc.Controllers;
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
{
|
{
|
||||||
public class ControllerActionDescriptorProvider : IActionDescriptorProvider
|
internal class ControllerActionDescriptorProvider : IActionDescriptorProvider
|
||||||
{
|
{
|
||||||
private readonly ApplicationPartManager _partManager;
|
private readonly ApplicationPartManager _partManager;
|
||||||
private readonly IApplicationModelProvider[] _applicationModelProviders;
|
private readonly ApplicationModelFactory _applicationModelFactory;
|
||||||
private readonly IEnumerable<IApplicationModelConvention> _conventions;
|
|
||||||
|
|
||||||
public ControllerActionDescriptorProvider(
|
public ControllerActionDescriptorProvider(
|
||||||
ApplicationPartManager partManager,
|
ApplicationPartManager partManager,
|
||||||
IEnumerable<IApplicationModelProvider> applicationModelProviders,
|
ApplicationModelFactory applicationModelFactory)
|
||||||
IOptions<MvcOptions> optionsAccessor)
|
|
||||||
{
|
{
|
||||||
if (partManager == null)
|
if (partManager == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(partManager));
|
throw new ArgumentNullException(nameof(partManager));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (applicationModelProviders == null)
|
if (applicationModelFactory == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(applicationModelProviders));
|
throw new ArgumentNullException(nameof(applicationModelFactory));
|
||||||
}
|
|
||||||
|
|
||||||
if (optionsAccessor == null)
|
|
||||||
{
|
|
||||||
throw new ArgumentNullException(nameof(optionsAccessor));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_partManager = partManager;
|
_partManager = partManager;
|
||||||
_applicationModelProviders = applicationModelProviders.OrderBy(p => p.Order).ToArray();
|
_applicationModelFactory = applicationModelFactory;
|
||||||
_conventions = optionsAccessor.Value.Conventions;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Order => -1000;
|
public int Order => -1000;
|
||||||
|
|
@ -63,7 +52,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void OnProvidersExecuted(ActionDescriptorProviderContext context)
|
public void OnProvidersExecuted(ActionDescriptorProviderContext context)
|
||||||
{
|
{
|
||||||
// After all of the providers have run, we need to provide a 'null' for each all of route values that
|
// After all of the providers have run, we need to provide a 'null' for each all of route values that
|
||||||
// participate in action selection.
|
// participate in action selection.
|
||||||
//
|
//
|
||||||
// This is important for scenarios like Razor Pages, that use the 'page' route value. An action that
|
// This is important for scenarios like Razor Pages, that use the 'page' route value. An action that
|
||||||
|
|
@ -95,29 +84,11 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected internal IEnumerable<ControllerActionDescriptor> GetDescriptors()
|
internal IEnumerable<ControllerActionDescriptor> GetDescriptors()
|
||||||
{
|
|
||||||
var applicationModel = BuildModel();
|
|
||||||
ApplicationModelConventions.ApplyConventions(applicationModel, _conventions);
|
|
||||||
return ControllerActionDescriptorBuilder.Build(applicationModel);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected internal ApplicationModel BuildModel()
|
|
||||||
{
|
{
|
||||||
var controllerTypes = GetControllerTypes();
|
var controllerTypes = GetControllerTypes();
|
||||||
var context = new ApplicationModelProviderContext(controllerTypes);
|
var application = _applicationModelFactory.CreateApplicationModel(controllerTypes);
|
||||||
|
return ControllerActionDescriptorBuilder.Build(application);
|
||||||
for (var i = 0; i < _applicationModelProviders.Length; i++)
|
|
||||||
{
|
|
||||||
_applicationModelProviders[i].OnProvidersExecuting(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = _applicationModelProviders.Length - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
_applicationModelProviders[i].OnProvidersExecuted(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
return context.Result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<TypeInfo> GetControllerTypes()
|
private IEnumerable<TypeInfo> GetControllerTypes()
|
||||||
|
|
@ -7,7 +7,6 @@ using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
||||||
using Microsoft.AspNetCore.Mvc.ApiExplorer;
|
using Microsoft.AspNetCore.Mvc.ApiExplorer;
|
||||||
using Microsoft.AspNetCore.Mvc.ApplicationModels;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.AspNetCore.Mvc.Routing;
|
using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
|
|
@ -15,9 +14,9 @@ using Microsoft.AspNetCore.Routing;
|
||||||
using Microsoft.Extensions.Internal;
|
using Microsoft.Extensions.Internal;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
{
|
{
|
||||||
public class DefaultApplicationModelProvider : IApplicationModelProvider
|
internal class DefaultApplicationModelProvider : IApplicationModelProvider
|
||||||
{
|
{
|
||||||
private readonly MvcOptions _mvcOptions;
|
private readonly MvcOptions _mvcOptions;
|
||||||
private readonly IModelMetadataProvider _modelMetadataProvider;
|
private readonly IModelMetadataProvider _modelMetadataProvider;
|
||||||
|
|
@ -39,7 +38,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
public int Order => -1000;
|
public int Order => -1000;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public virtual void OnProvidersExecuting(ApplicationModelProviderContext context)
|
public void OnProvidersExecuting(ApplicationModelProviderContext context)
|
||||||
{
|
{
|
||||||
if (context == null)
|
if (context == null)
|
||||||
{
|
{
|
||||||
|
|
@ -98,7 +97,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public virtual void OnProvidersExecuted(ApplicationModelProviderContext context)
|
public void OnProvidersExecuted(ApplicationModelProviderContext context)
|
||||||
{
|
{
|
||||||
// Intentionally empty.
|
// Intentionally empty.
|
||||||
}
|
}
|
||||||
|
|
@ -108,7 +107,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="typeInfo">The <see cref="TypeInfo"/>.</param>
|
/// <param name="typeInfo">The <see cref="TypeInfo"/>.</param>
|
||||||
/// <returns>A <see cref="ControllerModel"/> for the given <see cref="TypeInfo"/>.</returns>
|
/// <returns>A <see cref="ControllerModel"/> for the given <see cref="TypeInfo"/>.</returns>
|
||||||
protected virtual ControllerModel CreateControllerModel(TypeInfo typeInfo)
|
internal ControllerModel CreateControllerModel(TypeInfo typeInfo)
|
||||||
{
|
{
|
||||||
if (typeInfo == null)
|
if (typeInfo == null)
|
||||||
{
|
{
|
||||||
|
|
@ -215,7 +214,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="propertyInfo">The <see cref="PropertyInfo"/>.</param>
|
/// <param name="propertyInfo">The <see cref="PropertyInfo"/>.</param>
|
||||||
/// <returns>A <see cref="PropertyModel"/> for the given <see cref="PropertyInfo"/>.</returns>
|
/// <returns>A <see cref="PropertyModel"/> for the given <see cref="PropertyInfo"/>.</returns>
|
||||||
protected virtual PropertyModel CreatePropertyModel(PropertyInfo propertyInfo)
|
internal PropertyModel CreatePropertyModel(PropertyInfo propertyInfo)
|
||||||
{
|
{
|
||||||
if (propertyInfo == null)
|
if (propertyInfo == null)
|
||||||
{
|
{
|
||||||
|
|
@ -263,7 +262,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// An <see cref="ActionModel"/> instance for the given action <see cref="MethodInfo"/> or
|
/// An <see cref="ActionModel"/> instance for the given action <see cref="MethodInfo"/> or
|
||||||
/// <c>null</c> if the <paramref name="methodInfo"/> does not represent an action.
|
/// <c>null</c> if the <paramref name="methodInfo"/> does not represent an action.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
protected virtual ActionModel CreateActionModel(
|
internal ActionModel CreateActionModel(
|
||||||
TypeInfo typeInfo,
|
TypeInfo typeInfo,
|
||||||
MethodInfo methodInfo)
|
MethodInfo methodInfo)
|
||||||
{
|
{
|
||||||
|
|
@ -381,7 +380,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Override this method to provide custom logic to determine which methods are considered actions.
|
/// Override this method to provide custom logic to determine which methods are considered actions.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected virtual bool IsAction(TypeInfo typeInfo, MethodInfo methodInfo)
|
internal bool IsAction(TypeInfo typeInfo, MethodInfo methodInfo)
|
||||||
{
|
{
|
||||||
if (typeInfo == null)
|
if (typeInfo == null)
|
||||||
{
|
{
|
||||||
|
|
@ -445,7 +444,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="parameterInfo">The <see cref="ParameterInfo"/>.</param>
|
/// <param name="parameterInfo">The <see cref="ParameterInfo"/>.</param>
|
||||||
/// <returns>A <see cref="ParameterModel"/> for the given <see cref="ParameterInfo"/>.</returns>
|
/// <returns>A <see cref="ParameterModel"/> for the given <see cref="ParameterInfo"/>.</returns>
|
||||||
protected virtual ParameterModel CreateParameterModel(ParameterInfo parameterInfo)
|
internal ParameterModel CreateParameterModel(ParameterInfo parameterInfo)
|
||||||
{
|
{
|
||||||
if (parameterInfo == null)
|
if (parameterInfo == null)
|
||||||
{
|
{
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.AspNetCore.Routing.Template;
|
using Microsoft.AspNetCore.Routing.Template;
|
||||||
using Resources = Microsoft.AspNetCore.Mvc.Core.Resources;
|
using Resources = Microsoft.AspNetCore.Mvc.Core.Resources;
|
||||||
|
|
@ -99,14 +98,14 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
|
|
||||||
private bool ParameterExistsInAnyRoute(ActionModel action, string parameterName)
|
private bool ParameterExistsInAnyRoute(ActionModel action, string parameterName)
|
||||||
{
|
{
|
||||||
foreach (var (route, _, _) in ActionAttributeRouteModel.GetAttributeRoutes(action))
|
foreach (var selector in ActionAttributeRouteModel.FlattenSelectors(action))
|
||||||
{
|
{
|
||||||
if (route == null)
|
if (selector.AttributeRouteModel == null)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var parsedTemplate = TemplateParser.Parse(route.Template);
|
var parsedTemplate = TemplateParser.Parse(selector.AttributeRouteModel.Template);
|
||||||
if (parsedTemplate.GetParameter(parameterName) != null)
|
if (parsedTemplate.GetParameter(parameterName) != null)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
|
||||||
{
|
{
|
||||||
if (ShouldApply(action))
|
if (ShouldApply(action))
|
||||||
{
|
{
|
||||||
action.Properties[typeof(IOutboundParameterTransformer)] = _parameterTransformer;
|
action.RouteParameterTransformer = _parameterTransformer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,10 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
|
||||||
{
|
{
|
||||||
internal static HashSet<string> ReferenceAssemblies { get; } = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
|
internal static HashSet<string> ReferenceAssemblies { get; } = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
|
||||||
{
|
{
|
||||||
// The deps file for the Microsoft.AspNetCore.All shared runtime is authored in a way where it does not say
|
// The deps file for the Microsoft.AspNetCore.App shared runtime is authored in a way where it does not say
|
||||||
// it depends on Microsoft.AspNetCore.Mvc even though it does. Explicitly list it so that referencing this runtime causes
|
// it depends on Microsoft.AspNetCore.Mvc even though it does. Explicitly list it so that referencing this runtime causes
|
||||||
// assembly discovery to work correctly.
|
// assembly discovery to work correctly.
|
||||||
"Microsoft.AspNetCore.All",
|
"Microsoft.AspNetCore.App",
|
||||||
"Microsoft.AspNetCore.Mvc",
|
"Microsoft.AspNetCore.Mvc",
|
||||||
"Microsoft.AspNetCore.Mvc.Abstractions",
|
"Microsoft.AspNetCore.Mvc.Abstractions",
|
||||||
"Microsoft.AspNetCore.Mvc.ApiExplorer",
|
"Microsoft.AspNetCore.Mvc.ApiExplorer",
|
||||||
|
|
@ -28,7 +28,6 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
|
||||||
"Microsoft.AspNetCore.Mvc.Formatters.Xml",
|
"Microsoft.AspNetCore.Mvc.Formatters.Xml",
|
||||||
"Microsoft.AspNetCore.Mvc.Localization",
|
"Microsoft.AspNetCore.Mvc.Localization",
|
||||||
"Microsoft.AspNetCore.Mvc.Razor",
|
"Microsoft.AspNetCore.Mvc.Razor",
|
||||||
"Microsoft.AspNetCore.Mvc.Razor.Extensions",
|
|
||||||
"Microsoft.AspNetCore.Mvc.RazorPages",
|
"Microsoft.AspNetCore.Mvc.RazorPages",
|
||||||
"Microsoft.AspNetCore.Mvc.TagHelpers",
|
"Microsoft.AspNetCore.Mvc.TagHelpers",
|
||||||
"Microsoft.AspNetCore.Mvc.ViewFeatures",
|
"Microsoft.AspNetCore.Mvc.ViewFeatures",
|
||||||
|
|
@ -154,7 +153,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
|
||||||
// Internal for unit testing
|
// Internal for unit testing
|
||||||
internal static IEnumerable<RuntimeLibrary> GetCandidateLibraries(DependencyContext dependencyContext)
|
internal static IEnumerable<RuntimeLibrary> GetCandidateLibraries(DependencyContext dependencyContext)
|
||||||
{
|
{
|
||||||
// When using Microsoft.AspNetCore.App \ Microsoft.AspNetCore.All shared runtimes, entries in the RuntimeLibraries
|
// When using the Microsoft.AspNetCore.App shared runtimes, entries in the RuntimeLibraries
|
||||||
// get "erased" and it is no longer accurate to query to determine a library's dependency closure.
|
// get "erased" and it is no longer accurate to query to determine a library's dependency closure.
|
||||||
// We'll use CompileLibraries to calculate the dependency graph and runtime library to resolve assemblies to inspect.
|
// We'll use CompileLibraries to calculate the dependency graph and runtime library to resolve assemblies to inspect.
|
||||||
var candidatesResolver = new CandidateResolver(dependencyContext.CompileLibraries, ReferenceAssemblies);
|
var candidatesResolver = new CandidateResolver(dependencyContext.CompileLibraries, ReferenceAssemblies);
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,9 @@ using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Authorization.Policy;
|
using Microsoft.AspNetCore.Authorization.Policy;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ApplicationModels;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 System.Collections.Generic;
|
||||||
|
using Microsoft.AspNetCore.Routing;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Builder
|
||||||
|
{
|
||||||
|
internal class DefaultEndpointConventionBuilder : IEndpointConventionBuilder
|
||||||
|
{
|
||||||
|
public DefaultEndpointConventionBuilder()
|
||||||
|
{
|
||||||
|
Conventions = new List<Action<EndpointModel>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Action<EndpointModel>> Conventions { get; }
|
||||||
|
|
||||||
|
public void Apply(Action<EndpointModel> convention)
|
||||||
|
{
|
||||||
|
Conventions.Add(convention);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,10 +4,9 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Internal;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
@ -90,9 +89,7 @@ namespace Microsoft.AspNetCore.Builder
|
||||||
if (options.Value.EnableEndpointRouting)
|
if (options.Value.EnableEndpointRouting)
|
||||||
{
|
{
|
||||||
var mvcEndpointDataSource = app.ApplicationServices
|
var mvcEndpointDataSource = app.ApplicationServices
|
||||||
.GetRequiredService<IEnumerable<EndpointDataSource>>()
|
.GetRequiredService<MvcEndpointDataSource>();
|
||||||
.OfType<MvcEndpointDataSource>()
|
|
||||||
.First();
|
|
||||||
var parameterPolicyFactory = app.ApplicationServices
|
var parameterPolicyFactory = app.ApplicationServices
|
||||||
.GetRequiredService<ParameterPolicyFactory>();
|
.GetRequiredService<ParameterPolicyFactory>();
|
||||||
|
|
||||||
|
|
@ -122,11 +119,21 @@ namespace Microsoft.AspNetCore.Builder
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Include all controllers with attribute routing and Razor pages
|
||||||
|
var defaultEndpointConventionBuilder = new DefaultEndpointConventionBuilder();
|
||||||
|
mvcEndpointDataSource.AttributeRoutingConventionResolvers.Add((actionDescriptor) =>
|
||||||
|
{
|
||||||
|
return defaultEndpointConventionBuilder;
|
||||||
|
});
|
||||||
|
|
||||||
if (!app.Properties.TryGetValue(EndpointRoutingRegisteredKey, out _))
|
if (!app.Properties.TryGetValue(EndpointRoutingRegisteredKey, out _))
|
||||||
{
|
{
|
||||||
// Matching middleware has not been registered yet
|
// Matching middleware has not been registered yet
|
||||||
// For back-compat register middleware so an endpoint is matched and then immediately used
|
// For back-compat register middleware so an endpoint is matched and then immediately used
|
||||||
app.UseEndpointRouting();
|
app.UseEndpointRouting(routerBuilder =>
|
||||||
|
{
|
||||||
|
routerBuilder.DataSources.Add(mvcEndpointDataSource);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return app.UseEndpoint();
|
return app.UseEndpoint();
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Routing.Patterns;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Builder
|
namespace Microsoft.AspNetCore.Builder
|
||||||
{
|
{
|
||||||
internal class MvcEndpointInfo
|
internal class MvcEndpointInfo : DefaultEndpointConventionBuilder
|
||||||
{
|
{
|
||||||
public MvcEndpointInfo(
|
public MvcEndpointInfo(
|
||||||
string name,
|
string name,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,121 @@
|
||||||
|
// 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.Linq;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Controllers;
|
||||||
|
using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
|
using Microsoft.AspNetCore.Routing;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Builder
|
||||||
|
{
|
||||||
|
public static class MvcEndpointRouteBuilderExtensions
|
||||||
|
{
|
||||||
|
public static IEndpointConventionBuilder MapApplication(
|
||||||
|
this IEndpointRouteBuilder routeBuilder)
|
||||||
|
{
|
||||||
|
return MapActionDescriptors(routeBuilder, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEndpointConventionBuilder MapAssembly<TContainingType>(
|
||||||
|
this IEndpointRouteBuilder routeBuilder)
|
||||||
|
{
|
||||||
|
return MapActionDescriptors(routeBuilder, typeof(TContainingType));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEndpointConventionBuilder MapActionDescriptors(
|
||||||
|
this IEndpointRouteBuilder routeBuilder,
|
||||||
|
Type containingType)
|
||||||
|
{
|
||||||
|
var mvcEndpointDataSource = routeBuilder.DataSources.OfType<MvcEndpointDataSource>().FirstOrDefault();
|
||||||
|
|
||||||
|
if (mvcEndpointDataSource == null)
|
||||||
|
{
|
||||||
|
mvcEndpointDataSource = routeBuilder.ServiceProvider.GetRequiredService<MvcEndpointDataSource>();
|
||||||
|
routeBuilder.DataSources.Add(mvcEndpointDataSource);
|
||||||
|
}
|
||||||
|
|
||||||
|
var conventionBuilder = new DefaultEndpointConventionBuilder();
|
||||||
|
|
||||||
|
var assemblyFilter = containingType?.Assembly;
|
||||||
|
|
||||||
|
mvcEndpointDataSource.AttributeRoutingConventionResolvers.Add(actionDescriptor =>
|
||||||
|
{
|
||||||
|
// Filter a descriptor by the assembly
|
||||||
|
// Note that this will only filter actions on controllers
|
||||||
|
// Does not support filtering Razor pages embedded in assemblies
|
||||||
|
if (assemblyFilter != null)
|
||||||
|
{
|
||||||
|
if (actionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
|
||||||
|
{
|
||||||
|
if (controllerActionDescriptor.ControllerTypeInfo.Assembly != assemblyFilter)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return conventionBuilder;
|
||||||
|
});
|
||||||
|
|
||||||
|
return conventionBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEndpointConventionBuilder MapControllerRoute(
|
||||||
|
this IEndpointRouteBuilder routeBuilder,
|
||||||
|
string name,
|
||||||
|
string template)
|
||||||
|
{
|
||||||
|
return MapControllerRoute(routeBuilder, name, template, defaults: null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEndpointConventionBuilder MapControllerRoute(
|
||||||
|
this IEndpointRouteBuilder routeBuilder,
|
||||||
|
string name,
|
||||||
|
string template,
|
||||||
|
object defaults)
|
||||||
|
{
|
||||||
|
return MapControllerRoute(routeBuilder, name, template, defaults, constraints: null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEndpointConventionBuilder MapControllerRoute(
|
||||||
|
this IEndpointRouteBuilder routeBuilder,
|
||||||
|
string name,
|
||||||
|
string template,
|
||||||
|
object defaults,
|
||||||
|
object constraints)
|
||||||
|
{
|
||||||
|
return MapControllerRoute(routeBuilder, name, template, defaults, constraints, dataTokens: null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEndpointConventionBuilder MapControllerRoute(
|
||||||
|
this IEndpointRouteBuilder routeBuilder,
|
||||||
|
string name,
|
||||||
|
string template,
|
||||||
|
object defaults,
|
||||||
|
object constraints,
|
||||||
|
object dataTokens)
|
||||||
|
{
|
||||||
|
var mvcEndpointDataSource = routeBuilder.DataSources.OfType<MvcEndpointDataSource>().FirstOrDefault();
|
||||||
|
|
||||||
|
if (mvcEndpointDataSource == null)
|
||||||
|
{
|
||||||
|
mvcEndpointDataSource = routeBuilder.ServiceProvider.GetRequiredService<MvcEndpointDataSource>();
|
||||||
|
routeBuilder.DataSources.Add(mvcEndpointDataSource);
|
||||||
|
}
|
||||||
|
|
||||||
|
var endpointInfo = new MvcEndpointInfo(
|
||||||
|
name,
|
||||||
|
template,
|
||||||
|
new RouteValueDictionary(defaults),
|
||||||
|
new RouteValueDictionary(constraints),
|
||||||
|
new RouteValueDictionary(dataTokens),
|
||||||
|
routeBuilder.ServiceProvider.GetRequiredService<ParameterPolicyFactory>());
|
||||||
|
|
||||||
|
mvcEndpointDataSource.ConventionalEndpointInfos.Add(endpointInfo);
|
||||||
|
|
||||||
|
return endpointInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,6 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Authentication;
|
using Microsoft.AspNetCore.Authentication;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
||||||
using Microsoft.AspNetCore.Mvc.ApiExplorer;
|
using Microsoft.AspNetCore.Mvc.ApiExplorer;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
using Microsoft.AspNetCore.Mvc.Formatters;
|
using Microsoft.AspNetCore.Mvc.Formatters;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.Net.Http.Headers;
|
using Microsoft.Net.Http.Headers;
|
||||||
using Resources = Microsoft.AspNetCore.Mvc.Core.Resources;
|
using Resources = Microsoft.AspNetCore.Mvc.Core.Resources;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc
|
namespace Microsoft.AspNetCore.Mvc
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding.Internal;
|
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
|
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
|
||||||
using Microsoft.AspNetCore.Mvc.Routing;
|
using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,9 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
{
|
{
|
||||||
public delegate Task ControllerBinderDelegate(
|
internal delegate Task ControllerBinderDelegate(
|
||||||
ControllerContext controllerContext,
|
ControllerContext controllerContext,
|
||||||
object controller,
|
object controller,
|
||||||
Dictionary<string, object> arguments);
|
Dictionary<string, object> arguments);
|
||||||
|
|
@ -7,10 +7,10 @@ using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Mvc.Controllers;
|
using Microsoft.AspNetCore.Mvc.Controllers;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
{
|
{
|
||||||
// Note: changes made to binding behavior in type should also be made to PageBinderFactory.
|
// Note: changes made to binding behavior in type should also be made to PageBinderFactory.
|
||||||
public static class ControllerBinderDelegateProvider
|
internal static class ControllerBinderDelegateProvider
|
||||||
{
|
{
|
||||||
public static ControllerBinderDelegate CreateBinderDelegate(
|
public static ControllerBinderDelegate CreateBinderDelegate(
|
||||||
ParameterBinder parameterBinder,
|
ParameterBinder parameterBinder,
|
||||||
|
|
@ -5,11 +5,10 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Controllers
|
namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
{
|
{
|
||||||
public class ControllerFactoryProvider : IControllerFactoryProvider
|
internal class ControllerFactoryProvider : IControllerFactoryProvider
|
||||||
{
|
{
|
||||||
private readonly IControllerActivatorProvider _activatorProvider;
|
private readonly IControllerActivatorProvider _activatorProvider;
|
||||||
private readonly Func<ControllerContext, object> _factoryCreateController;
|
private readonly Func<ControllerContext, object> _factoryCreateController;
|
||||||
|
|
@ -19,10 +18,7 @@ namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
public ControllerFactoryProvider(
|
public ControllerFactoryProvider(
|
||||||
IControllerActivatorProvider activatorProvider,
|
IControllerActivatorProvider activatorProvider,
|
||||||
IControllerFactory controllerFactory,
|
IControllerFactory controllerFactory,
|
||||||
#pragma warning disable PUB0001 // Pubternal type in public API
|
IEnumerable<IControllerPropertyActivator> propertyActivators)
|
||||||
IEnumerable<IControllerPropertyActivator> propertyActivators
|
|
||||||
#pragma warning restore PUB0001
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
if (activatorProvider == null)
|
if (activatorProvider == null)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -3,14 +3,14 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Controllers
|
namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <see cref="IControllerActivator"/> that uses type activation to create controllers.
|
/// <see cref="IControllerActivator"/> that uses type activation to create controllers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DefaultControllerActivator : IControllerActivator
|
internal class DefaultControllerActivator : IControllerActivator
|
||||||
{
|
{
|
||||||
private readonly ITypeActivatorCache _typeActivatorCache;
|
private readonly ITypeActivatorCache _typeActivatorCache;
|
||||||
|
|
||||||
|
|
@ -18,9 +18,7 @@ namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
/// Creates a new <see cref="DefaultControllerActivator"/>.
|
/// Creates a new <see cref="DefaultControllerActivator"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="typeActivatorCache">The <see cref="ITypeActivatorCache"/>.</param>
|
/// <param name="typeActivatorCache">The <see cref="ITypeActivatorCache"/>.</param>
|
||||||
#pragma warning disable PUB0001 // Pubternal type in public API
|
|
||||||
public DefaultControllerActivator(ITypeActivatorCache typeActivatorCache)
|
public DefaultControllerActivator(ITypeActivatorCache typeActivatorCache)
|
||||||
#pragma warning restore PUB0001
|
|
||||||
{
|
{
|
||||||
if (typeActivatorCache == null)
|
if (typeActivatorCache == null)
|
||||||
{
|
{
|
||||||
|
|
@ -31,7 +29,7 @@ namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public virtual object Create(ControllerContext controllerContext)
|
public object Create(ControllerContext controllerContext)
|
||||||
{
|
{
|
||||||
if (controllerContext == null)
|
if (controllerContext == null)
|
||||||
{
|
{
|
||||||
|
|
@ -59,7 +57,7 @@ namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public virtual void Release(ControllerContext context, object controller)
|
public void Release(ControllerContext context, object controller)
|
||||||
{
|
{
|
||||||
if (context == null)
|
if (context == null)
|
||||||
{
|
{
|
||||||
|
|
@ -71,8 +69,7 @@ namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
throw new ArgumentNullException(nameof(controller));
|
throw new ArgumentNullException(nameof(controller));
|
||||||
}
|
}
|
||||||
|
|
||||||
var disposable = controller as IDisposable;
|
if (controller is IDisposable disposable)
|
||||||
if (disposable != null)
|
|
||||||
{
|
{
|
||||||
disposable.Dispose();
|
disposable.Dispose();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,14 +5,13 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Controllers
|
namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Default implementation for <see cref="IControllerFactory"/>.
|
/// Default implementation for <see cref="IControllerFactory"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DefaultControllerFactory : IControllerFactory
|
internal class DefaultControllerFactory : IControllerFactory
|
||||||
{
|
{
|
||||||
private readonly IControllerActivator _controllerActivator;
|
private readonly IControllerActivator _controllerActivator;
|
||||||
private readonly IControllerPropertyActivator[] _propertyActivators;
|
private readonly IControllerPropertyActivator[] _propertyActivators;
|
||||||
|
|
@ -29,10 +28,7 @@ namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
/// </param>
|
/// </param>
|
||||||
public DefaultControllerFactory(
|
public DefaultControllerFactory(
|
||||||
IControllerActivator controllerActivator,
|
IControllerActivator controllerActivator,
|
||||||
#pragma warning disable PUB0001 // Pubternal type in public API
|
IEnumerable<IControllerPropertyActivator> propertyActivators)
|
||||||
IEnumerable<IControllerPropertyActivator> propertyActivators
|
|
||||||
#pragma warning restore PUB0001
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
if (controllerActivator == null)
|
if (controllerActivator == null)
|
||||||
{
|
{
|
||||||
|
|
@ -48,13 +44,8 @@ namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
_propertyActivators = propertyActivators.ToArray();
|
_propertyActivators = propertyActivators.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The <see cref="IControllerActivator"/> used to create a controller.
|
|
||||||
/// </summary>
|
|
||||||
protected IControllerActivator ControllerActivator => _controllerActivator;
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public virtual object CreateController(ControllerContext context)
|
public object CreateController(ControllerContext context)
|
||||||
{
|
{
|
||||||
if (context == null)
|
if (context == null)
|
||||||
{
|
{
|
||||||
|
|
@ -78,7 +69,7 @@ namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public virtual void ReleaseController(ControllerContext context, object controller)
|
public void ReleaseController(ControllerContext context, object controller)
|
||||||
{
|
{
|
||||||
if (context == null)
|
if (context == null)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,12 @@ using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using Microsoft.AspNetCore.Mvc.Controllers;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.Extensions.Internal;
|
using Microsoft.Extensions.Internal;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
{
|
{
|
||||||
public class DefaultControllerPropertyActivator : IControllerPropertyActivator
|
internal class DefaultControllerPropertyActivator : IControllerPropertyActivator
|
||||||
{
|
{
|
||||||
private static readonly Func<Type, PropertyActivator<ControllerContext>[]> _getPropertiesToActivate =
|
private static readonly Func<Type, PropertyActivator<ControllerContext>[]> _getPropertiesToActivate =
|
||||||
GetPropertiesToActivate;
|
GetPropertiesToActivate;
|
||||||
|
|
@ -2,11 +2,10 @@
|
||||||
// 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 System;
|
using System;
|
||||||
using Microsoft.AspNetCore.Mvc.Controllers;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Controllers
|
||||||
{
|
{
|
||||||
public interface IControllerPropertyActivator
|
internal interface IControllerPropertyActivator
|
||||||
{
|
{
|
||||||
void Activate(ControllerContext context, object controller);
|
void Activate(ControllerContext context, object controller);
|
||||||
|
|
||||||
|
|
@ -4,14 +4,15 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
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;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.Extensions.DependencyInjection
|
||||||
{
|
{
|
||||||
public class ApiBehaviorOptionsSetup :
|
internal class ApiBehaviorOptionsSetup :
|
||||||
ConfigureCompatibilityOptions<ApiBehaviorOptions>,
|
ConfigureCompatibilityOptions<ApiBehaviorOptions>,
|
||||||
IConfigureOptions<ApiBehaviorOptions>
|
IConfigureOptions<ApiBehaviorOptions>
|
||||||
{
|
{
|
||||||
|
|
@ -3,14 +3,13 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.Extensions.DependencyInjection
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Allows fine grained configuration of MVC services.
|
/// Allows fine grained configuration of MVC services.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MvcBuilder : IMvcBuilder
|
internal class MvcBuilder : IMvcBuilder
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new <see cref="MvcBuilder"/> instance.
|
/// Initializes a new <see cref="MvcBuilder"/> instance.
|
||||||
|
|
@ -39,4 +38,4 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public ApplicationPartManager PartManager { get; }
|
public ApplicationPartManager PartManager { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3,14 +3,13 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.Extensions.DependencyInjection
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Allows fine grained configuration of essential MVC services.
|
/// Allows fine grained configuration of essential MVC services.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MvcCoreBuilder : IMvcCoreBuilder
|
internal class MvcCoreBuilder : IMvcCoreBuilder
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new <see cref="MvcCoreBuilder"/> instance.
|
/// Initializes a new <see cref="MvcCoreBuilder"/> instance.
|
||||||
|
|
@ -41,4 +40,4 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public IServiceCollection Services { get; }
|
public IServiceCollection Services { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -11,7 +11,6 @@ using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
||||||
using Microsoft.AspNetCore.Mvc.Controllers;
|
using Microsoft.AspNetCore.Mvc.Controllers;
|
||||||
using Microsoft.AspNetCore.Mvc.Formatters;
|
using Microsoft.AspNetCore.Mvc.Formatters;
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||||
|
|
||||||
namespace Microsoft.Extensions.DependencyInjection
|
namespace Microsoft.Extensions.DependencyInjection
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,12 @@ using Microsoft.AspNetCore.Mvc.Routing;
|
||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.Extensions.DependencyInjection
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets up MVC default options for <see cref="RouteOptions"/>.
|
/// Sets up MVC default options for <see cref="RouteOptions"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MvcCoreRouteOptionsSetup : IConfigureOptions<RouteOptions>
|
internal class MvcCoreRouteOptionsSetup : IConfigureOptions<RouteOptions>
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Configures the <see cref="RouteOptions"/>.
|
/// Configures the <see cref="RouteOptions"/>.
|
||||||
|
|
@ -13,7 +13,6 @@ using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
||||||
using Microsoft.AspNetCore.Mvc.Controllers;
|
using Microsoft.AspNetCore.Mvc.Controllers;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
|
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
|
||||||
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
|
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
|
||||||
|
|
@ -159,7 +158,7 @@ namespace Microsoft.Extensions.DependencyInjection
|
||||||
// Action Discovery
|
// Action Discovery
|
||||||
//
|
//
|
||||||
// These are consumed only when creating action descriptors, then they can be deallocated
|
// These are consumed only when creating action descriptors, then they can be deallocated
|
||||||
|
services.TryAddSingleton<ApplicationModelFactory>();
|
||||||
services.TryAddEnumerable(
|
services.TryAddEnumerable(
|
||||||
ServiceDescriptor.Transient<IApplicationModelProvider, DefaultApplicationModelProvider>());
|
ServiceDescriptor.Transient<IApplicationModelProvider, DefaultApplicationModelProvider>());
|
||||||
services.TryAddEnumerable(
|
services.TryAddEnumerable(
|
||||||
|
|
@ -270,8 +269,7 @@ namespace Microsoft.Extensions.DependencyInjection
|
||||||
//
|
//
|
||||||
// Endpoint Routing / Endpoints
|
// Endpoint Routing / Endpoints
|
||||||
//
|
//
|
||||||
services.TryAddEnumerable(
|
services.TryAddSingleton<MvcEndpointDataSource>();
|
||||||
ServiceDescriptor.Singleton<EndpointDataSource, MvcEndpointDataSource>());
|
|
||||||
services.TryAddSingleton<MvcEndpointInvokerFactory>();
|
services.TryAddSingleton<MvcEndpointInvokerFactory>();
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,13 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
namespace Microsoft.Extensions.DependencyInjection
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A marker class used to determine if all the MVC services were added
|
/// A marker class used to determine if all the MVC services were added
|
||||||
/// to the <see cref="IServiceCollection"/> before MVC is configured.
|
/// to the <see cref="IServiceCollection"/> before MVC is configured.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MvcMarkerService
|
internal class MvcMarkerService
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc
|
namespace Microsoft.AspNetCore.Mvc
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Net.Http.Headers;
|
using Microsoft.Net.Http.Headers;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Net.Http.Headers;
|
using Microsoft.Net.Http.Headers;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,14 +4,13 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A filter implementation which delegates to the controller for action filter interfaces.
|
/// A filter implementation which delegates to the controller for action filter interfaces.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ControllerActionFilter : IAsyncActionFilter, IOrderedFilter
|
internal class ControllerActionFilter : IAsyncActionFilter, IOrderedFilter
|
||||||
{
|
{
|
||||||
// Controller-filter methods run farthest from the action by default.
|
// Controller-filter methods run farthest from the action by default.
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|
@ -55,7 +54,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task ExecuteActionFilter(
|
private static async Task ExecuteActionFilter(
|
||||||
ActionExecutingContext context,
|
ActionExecutingContext context,
|
||||||
ActionExecutionDelegate next,
|
ActionExecutionDelegate next,
|
||||||
IActionFilter actionFilter)
|
IActionFilter actionFilter)
|
||||||
{
|
{
|
||||||
|
|
@ -66,4 +65,4 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4,14 +4,13 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A filter implementation which delegates to the controller for result filter interfaces.
|
/// A filter implementation which delegates to the controller for result filter interfaces.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ControllerResultFilter : IAsyncResultFilter, IOrderedFilter
|
internal class ControllerResultFilter : IAsyncResultFilter, IOrderedFilter
|
||||||
{
|
{
|
||||||
// Controller-filter methods run farthest from the result by default.
|
// Controller-filter methods run farthest from the result by default.
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|
@ -66,4 +65,4 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4,11 +4,10 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
{
|
{
|
||||||
public class DefaultFilterProvider : IFilterProvider
|
internal class DefaultFilterProvider : IFilterProvider
|
||||||
{
|
{
|
||||||
public int Order => -1000;
|
public int Order => -1000;
|
||||||
|
|
||||||
|
|
@ -35,7 +34,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void ProvideFilter(FilterProviderContext context, FilterItem filterItem)
|
public void ProvideFilter(FilterProviderContext context, FilterItem filterItem)
|
||||||
{
|
{
|
||||||
if (filterItem.Filter != null)
|
if (filterItem.Filter != null)
|
||||||
{
|
{
|
||||||
|
|
@ -44,8 +43,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
|
|
||||||
var filter = filterItem.Descriptor.Filter;
|
var filter = filterItem.Descriptor.Filter;
|
||||||
|
|
||||||
var filterFactory = filter as IFilterFactory;
|
if (!(filter is IFilterFactory filterFactory))
|
||||||
if (filterFactory == null)
|
|
||||||
{
|
{
|
||||||
filterItem.Filter = filter;
|
filterItem.Filter = filter;
|
||||||
filterItem.IsReusable = true;
|
filterItem.IsReusable = true;
|
||||||
|
|
@ -72,9 +70,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
Debug.Assert(actualFilter != null, "actualFilter should not be null");
|
Debug.Assert(actualFilter != null, "actualFilter should not be null");
|
||||||
Debug.Assert(filterMetadata != null, "filterMetadata should not be null");
|
Debug.Assert(filterMetadata != null, "filterMetadata should not be null");
|
||||||
|
|
||||||
var container = actualFilter as IFilterContainer;
|
if (actualFilter is IFilterContainer container)
|
||||||
|
|
||||||
if (container != null)
|
|
||||||
{
|
{
|
||||||
container.FilterDefinition = filterMetadata;
|
container.FilterDefinition = filterMetadata;
|
||||||
}
|
}
|
||||||
|
|
@ -3,16 +3,15 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using Microsoft.AspNetCore.Http.Features;
|
using Microsoft.AspNetCore.Http.Features;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A filter that sets <see cref="IHttpMaxRequestBodySizeFeature.MaxRequestBodySize"/>
|
/// A filter that sets <see cref="IHttpMaxRequestBodySizeFeature.MaxRequestBodySize"/>
|
||||||
/// to <c>null</c>.
|
/// to <c>null</c>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DisableRequestSizeLimitFilter : IAuthorizationFilter, IRequestSizePolicy
|
internal class DisableRequestSizeLimitFilter : IAuthorizationFilter, IRequestSizePolicy
|
||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
|
|
@ -29,8 +28,8 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// to <c>null</c>.
|
/// to <c>null</c>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context">The <see cref="AuthorizationFilterContext"/>.</param>
|
/// <param name="context">The <see cref="AuthorizationFilterContext"/>.</param>
|
||||||
/// <remarks>If <see cref="IHttpMaxRequestBodySizeFeature"/> is not enabled or is read-only,
|
/// <remarks>If <see cref="IHttpMaxRequestBodySizeFeature"/> is not enabled or is read-only,
|
||||||
/// the <see cref="DisableRequestSizeLimitAttribute"/> is not applied.</remarks>
|
/// the <see cref="DisableRequestSizeLimitAttribute"/> is not applied.</remarks>
|
||||||
public void OnAuthorization(AuthorizationFilterContext context)
|
public void OnAuthorization(AuthorizationFilterContext context)
|
||||||
{
|
{
|
||||||
if (context == null)
|
if (context == null)
|
||||||
|
|
@ -1,9 +1,7 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A one-way cursor for filters.
|
/// A one-way cursor for filters.
|
||||||
|
|
@ -25,7 +23,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
/// Result
|
/// Result
|
||||||
///
|
///
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public struct FilterCursor
|
internal struct FilterCursor
|
||||||
{
|
{
|
||||||
private readonly IFilterMetadata[] _filters;
|
private readonly IFilterMetadata[] _filters;
|
||||||
private int _index;
|
private int _index;
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
{
|
{
|
||||||
public readonly struct FilterCursorItem<TFilter, TFilterAsync>
|
internal readonly struct FilterCursorItem<TFilter, TFilterAsync>
|
||||||
{
|
{
|
||||||
public FilterCursorItem(TFilter filter, TFilterAsync filterAsync)
|
public FilterCursorItem(TFilter filter, TFilterAsync filterAsync)
|
||||||
{
|
{
|
||||||
|
|
@ -5,9 +5,9 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
{
|
{
|
||||||
public class FilterDescriptorOrderComparer : IComparer<FilterDescriptor>
|
internal class FilterDescriptorOrderComparer : IComparer<FilterDescriptor>
|
||||||
{
|
{
|
||||||
public static FilterDescriptorOrderComparer Comparer { get; } = new FilterDescriptorOrderComparer();
|
public static FilterDescriptorOrderComparer Comparer { get; } = new FilterDescriptorOrderComparer();
|
||||||
|
|
||||||
|
|
@ -4,11 +4,10 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
{
|
{
|
||||||
public static class FilterFactory
|
internal static class FilterFactory
|
||||||
{
|
{
|
||||||
public static FilterFactoryResult GetAllFilters(
|
public static FilterFactoryResult GetAllFilters(
|
||||||
IFilterProvider[] filterProviders,
|
IFilterProvider[] filterProviders,
|
||||||
|
|
@ -1,11 +1,9 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
|
||||||
{
|
{
|
||||||
public readonly struct FilterFactoryResult
|
internal readonly struct FilterFactoryResult
|
||||||
{
|
{
|
||||||
public FilterFactoryResult(
|
public FilterFactoryResult(
|
||||||
FilterItem[] cacheableFilters,
|
FilterItem[] cacheableFilters,
|
||||||
|
|
@ -1,19 +1,17 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A feature in <see cref="Microsoft.AspNetCore.Http.HttpContext.Features"/> which is used to capture the
|
/// A feature in <see cref="Microsoft.AspNetCore.Http.HttpContext.Features"/> which is used to capture the
|
||||||
/// currently executing context of a resource filter. This feature is used in the final middleware
|
/// currently executing context of a resource filter. This feature is used in the final middleware
|
||||||
/// of a middleware filter's pipeline to keep the request flow through the rest of the MVC layers.
|
/// of a middleware filter's pipeline to keep the request flow through the rest of the MVC layers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IMiddlewareFilterFeature
|
internal interface IMiddlewareFilterFeature
|
||||||
{
|
{
|
||||||
ResourceExecutingContext ResourceExecutingContext { get; }
|
ResourceExecutingContext ResourceExecutingContext { get; }
|
||||||
|
|
||||||
ResourceExecutionDelegate ResourceExecutionDelegate { get; }
|
ResourceExecutionDelegate ResourceExecutionDelegate { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,14 +1,12 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A filter which sets the appropriate headers related to Response caching.
|
/// A filter which sets the appropriate headers related to Response caching.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IResponseCacheFilter : IFilterMetadata
|
internal interface IResponseCacheFilter : IFilterMetadata
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A filter which executes a user configured middleware pipeline.
|
/// A filter which executes a user configured middleware pipeline.
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using Microsoft.AspNetCore.Mvc.Filters;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
||||||
using Microsoft.AspNetCore.Mvc.Internal;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc
|
namespace Microsoft.AspNetCore.Mvc
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,12 @@ using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Builds a middleware pipeline after receiving the pipeline from a pipeline provider
|
/// Builds a middleware pipeline after receiving the pipeline from a pipeline provider
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MiddlewareFilterBuilder
|
internal class MiddlewareFilterBuilder
|
||||||
{
|
{
|
||||||
// 'GetOrAdd' call on the dictionary is not thread safe and we might end up creating the pipeline more
|
// 'GetOrAdd' call on the dictionary is not thread safe and we might end up creating the pipeline more
|
||||||
// once. To prevent this Lazy<> is used. In the worst case multiple Lazy<> objects are created for multiple
|
// once. To prevent this Lazy<> is used. In the worst case multiple Lazy<> objects are created for multiple
|
||||||
|
|
@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
{
|
{
|
||||||
internal class MiddlewareFilterBuilderStartupFilter : IStartupFilter
|
internal class MiddlewareFilterBuilderStartupFilter : IStartupFilter
|
||||||
{
|
{
|
||||||
|
|
@ -23,4 +23,4 @@ namespace Microsoft.AspNetCore.Mvc.Internal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -8,13 +8,13 @@ using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Mvc.Core;
|
using Microsoft.AspNetCore.Mvc.Core;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Mvc.Internal
|
namespace Microsoft.AspNetCore.Mvc.Filters
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Calls into user provided 'Configure' methods for configuring a middleware pipeline. The semantics of finding
|
/// Calls into user provided 'Configure' methods for configuring a middleware pipeline. The semantics of finding
|
||||||
/// the 'Configure' methods is similar to the application Startup class.
|
/// the 'Configure' methods is similar to the application Startup class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MiddlewareFilterConfigurationProvider
|
internal class MiddlewareFilterConfigurationProvider
|
||||||
{
|
{
|
||||||
public Action<IApplicationBuilder> CreateConfigureDelegate(Type configurationType)
|
public Action<IApplicationBuilder> CreateConfigureDelegate(Type configurationType)
|
||||||
{
|
{
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue