diff --git a/.azure/pipelines/benchmarks.yml b/.azure/pipelines/benchmarks.yml
new file mode 100644
index 0000000000..6e319f80da
--- /dev/null
+++ b/.azure/pipelines/benchmarks.yml
@@ -0,0 +1,15 @@
+# This configuration builds the repository and runs benchmarks
+
+# Don't run CI for this config
+trigger: none
+
+jobs:
+- template: jobs/default-build.yml
+ parameters:
+ jobName: Windows_Build
+ jobDisplayName: "Build only : Windows"
+ agentOs: Windows
+ buildArgs: -ci -all -pack
+ artifacts:
+ - path: artifacts/
+ includeForks: true
diff --git a/.azure/pipelines/ci-official.yml b/.azure/pipelines/ci-official.yml
deleted file mode 100644
index 4c268252e6..0000000000
--- a/.azure/pipelines/ci-official.yml
+++ /dev/null
@@ -1,222 +0,0 @@
-trigger:
- branches:
- include:
- - master
- - release/*
- exclude:
- - release/2.0
-
-name: $(Date:yyMMdd)-$(Rev:rr)
-
-phases:
-- phase: Windows
- queue:
- name: DotNetCore-Windows
- timeoutInMinutes: 120
- matrix:
- Release:
- BuildConfiguration: Release
- variables:
- CI: true
- DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
-
- # This variable is required by MicroBuildSigningPlugin to determine permissions for codesigning.
- TeamName: AspNetCore
-
- # SignType = { test, real }
- # This is prefixed underscore because variables automatically become environment variables (and therefore MSBuild properties),
- # and this one was causing issues in MSBuild projects which use the $(SignType) MSbuild prop.
- _SignType: real
-
- steps:
- - task: NodeTool@0
- displayName: Install Node 10.x
- inputs:
- versionSpec: 10.x
- - task: MicroBuildSigningPlugin@1
- displayName: Install MicroBuild plugin
- condition: and(succeeded(), in(variables['_SignType'], 'test', 'real'))
- inputs:
- signType: $(_SignType)
- zipSources: false
- # TODO: configure build.cmd to build both x64 and x86 in one invocation
- - script: build.cmd -ci /p:SkipTests=true /p:Configuration=$(BuildConfiguration) /p:BuildNumber=$(Build.BuildNumber) /t:Build /t:BuildSharedFx /p:SharedFxRID=win-x64 /t:BuildFallbackArchive
- displayName: Build NuGet packages and win-x64 runtime
- - script: build.cmd -ci /p:SkipTests=true /p:Configuration=$(BuildConfiguration) /p:BuildNumber=$(Build.BuildNumber) /t:BuildSharedFx /p:SharedFxRID=win-x86
- displayName: Build win-x86 runtime
- - script: build.cmd -ci /p:SkipTests=true /p:Configuration=$(BuildConfiguration) /p:BuildNumber=$(Build.BuildNumber) /t:BuildSharedFx /p:SharedFxRID=win-arm
- displayName: Build win-arm runtime
- - powershell: >
- src/Installers/Windows/clone_and_build_ancm.ps1
- -GitCredential '$(dn-bot-devdiv-build-rw-code-rw)'
- -Config $(BuildConfiguration)
- -BuildNumber $(Build.BuildNumber)
- -SignType $(_SignType)
- displayName: Build ANCM installers
- # TODO: configure harvesting to run as a part of build.cmd
- - powershell: >
- src/Installers/Windows/build.ps1
- -x64 artifacts/runtime/aspnetcore-runtime-internal-3.0.0-alpha1-$(Build.BuildNumber)-win-x64.zip
- -x86 artifacts/runtime/aspnetcore-runtime-internal-3.0.0-alpha1-$(Build.BuildNumber)-win-x86.zip
- -Config $(BuildConfiguration)
- -BuildNumber $(Build.BuildNumber)
- -SignType $(_SignType)
- displayName: Build Windows installers
- - task: PublishTestResults@2
- displayName: Publish test results
- condition: always()
- inputs:
- testRunner: vstest
- testResultsFiles: 'artifacts/logs/**/*.trx'
- - task: PublishBuildArtifacts@1
- displayName: Upload artifacts
- condition: eq(variables['system.pullrequest.isfork'], false)
- inputs:
- pathtoPublish: ./artifacts/
- artifactName: artifacts-Windows-Release
- artifactType: Container
- # Detect OSS Components in use in the product. Only needs to run on one OS in the matrix.
- - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
- displayName: 'Component Detection'
- inputs:
- # This funky GUID represents the product "ASP.NET and EF Core"
- governanceProduct: 'c641993b-8380-e811-80c3-0004ffb4789e'
- snapshotForceEnabled: true
- - task: MicroBuildCleanup@1
- displayName: Cleanup MicroBuild tasks
- condition: always()
-
-- phase: macOS
- dependsOn: Windows
- queue:
- name: Hosted macOS Preview
- matrix:
- Release:
- BuildConfiguration: Release
- variables:
- CI: true
- DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
- steps:
- - task: DownloadBuildArtifacts@0
- displayName: Download artifacts
- inputs:
- artifactName: artifacts-Windows-Release
- downloadPath: $(Build.SourcesDirectory)/.deps
- itemPattern: '**/*.nupkg'
- # Workaround https://github.com/Microsoft/vsts-tasks/issues/6739
- - task: CopyFiles@2
- displayName: Copy package assets to correct folder
- inputs:
- sourceFolder: $(Build.SourcesDirectory)/.deps/artifacts-Windows-Release
- targetFolder: $(Build.SourcesDirectory)/.deps
- - script: >
- ./build.sh
- --ci
- /t:Prepare
- /t:Restore
- /t:GeneratePropsFiles
- /t:BuildSharedFx
- /p:SharedFxRID=osx-x64
- /p:BuildNumber=$(Build.BuildNumber)
- displayName: Build osx-x64 runtime
- - task: PublishTestResults@2
- displayName: Publish test results
- condition: always()
- inputs:
- testRunner: vstest
- testResultsFiles: 'artifacts/logs/**/*.trx'
- - task: PublishBuildArtifacts@1
- displayName: Upload artifacts
- condition: eq(variables['system.pullrequest.isfork'], false)
- inputs:
- pathtoPublish: ./artifacts/
- artifactName: artifacts-macOS-Release
- artifactType: Container
-
-- phase: Linux
- dependsOn:
- - Windows
- - macOS
- queue:
- name: DotNetCore-Linux
- matrix:
- Release:
- BuildConfiguration: Release
- variables:
- CI: true
- DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
- steps:
- - task: DownloadBuildArtifacts@0
- displayName: Download artifacts
- inputs:
- artifactName: artifacts-Windows-Release
- downloadPath: $(Build.SourcesDirectory)/.deps
- itemPattern: '**/*.nupkg'
- - task: DownloadBuildArtifacts@0
- displayName: Download Windows artifacts
- inputs:
- artifactName: artifacts-Windows-Release
- downloadPath: $(Build.SourcesDirectory)/.r
- itemPattern: '**/aspnetcore-runtime-*'
- - task: DownloadBuildArtifacts@0
- displayName: Download macOS artifacts
- inputs:
- artifactName: artifacts-macOS-Release
- downloadPath: $(Build.SourcesDirectory)/.r
- itemPattern: '**/aspnetcore-runtime-*'
- # Workaround https://github.com/Microsoft/vsts-tasks/issues/6739
- - task: CopyFiles@2
- displayName: Copy package assets to correct folder
- inputs:
- sourceFolder: $(Build.SourcesDirectory)/.deps/artifacts-Windows-Release
- targetFolder: $(Build.SourcesDirectory)/.deps
- # TODO: Make the cumulative zips build in their own step
- - task: CopyFiles@2
- displayName: Copy package assets to correct folder
- inputs:
- sourceFolder: $(Build.SourcesDirectory)/.r/artifacts-Windows-Release
- targetFolder: $(Build.SourcesDirectory)/artifacts/
- - task: CopyFiles@2
- displayName: Copy package assets to correct folder
- inputs:
- sourceFolder: $(Build.SourcesDirectory)/.r/artifacts-macOS-Release
- targetFolder: $(Build.SourcesDirectory)/artifacts/
- - script: >
- ./build.sh
- --ci
- /t:Prepare
- /t:Restore
- /t:GeneratePropsFiles
- /t:BuildSharedFx
- /p:SharedFxRID=linux-x64
- /p:BuildNumber=$(Build.BuildNumber)
- displayName: Build linux-x64 runtime
- - script: >
- ./build.sh
- --ci
- /t:BuildSharedFx
- /p:SharedFxRID=linux-arm
- /p:BuildNumber=$(Build.BuildNumber)
- displayName: Build linux-arm runtime
- - script: >
- ./dockerbuild.sh
- alpine
- /t:Prepare
- /t:GeneratePropsFiles
- /t:BuildSharedFx
- /p:SharedFxRID=linux-musl-x64
- /p:BuildNumber=$(Build.BuildNumber)
- displayName: Build linux-musl-x64 runtime
- - task: PublishTestResults@2
- displayName: Publish test results
- condition: always()
- inputs:
- testRunner: vstest
- testResultsFiles: 'artifacts/logs/**/*.trx'
- - task: PublishBuildArtifacts@1
- displayName: Upload artifacts
- condition: eq(variables['system.pullrequest.isfork'], false)
- inputs:
- pathtoPublish: ./artifacts/
- artifactName: artifacts-Linux-Release
- artifactType: Container
diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml
index cb73aafae5..b4bb44fad4 100644
--- a/.azure/pipelines/ci.yml
+++ b/.azure/pipelines/ci.yml
@@ -1,48 +1,352 @@
-# Don't run CI for this config yet. We're not ready to move official builds on to Azure Pipelines
-trigger: none
+#
+# See https://docs.microsoft.com/en-us/vsts/pipelines/yaml-schema for details on this file.
+#
+
+# Configure which branches trigger builds
+trigger:
+ batch: true
+ branches:
+ include:
+ - master
+ - release/*
+ - internal/release/*
+ - ci/*
# Run PR validation on all branches
pr:
+ autoCancel: true
branches:
include:
- '*'
jobs:
+- job: Code_check
+ displayName: Code check
+ workspace:
+ clean: all
+ pool:
+ vmImage: vs2017-win2016
+ steps:
+ - powershell: ./eng/scripts/CodeCheck.ps1 -ci
+ displayName: Run eng/scripts/CodeCheck.ps1
+
+# Build Windows (x64/x86)
- template: jobs/default-build.yml
parameters:
- jobName: Windows_Build
- jobDisplayName: "Build and test: Windows"
+ codeSign: true
+ jobName: Windows_build
+ jobDisplayName: "Build: Windows x64/x86"
+ agentOs: Windows
+ buildSteps:
+ - script: "echo ##vso[build.addbuildtag]daily-build"
+ condition: and(ne(variables['Build.Reason'], 'PullRequest'), ne(variables['IsFinalBuild'], 'true'))
+ displayName: 'Set CI tags'
+ - script: "echo ##vso[build.addbuildtag]release-candidate"
+ condition: and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['IsFinalBuild'], 'true'))
+ displayName: 'Set CI tags'
+ # !!! NOTE !!! Some of these steps have disabled code signing.
+ # This is intentional to workaround https://github.com/dotnet/arcade/issues/1957 which always re-submits for code-signing, even
+ # if they have already been signed. This results in slower builds due to re-submitting the same .nupkg many times for signing.
+ # The sign settings have been configured to
+
+ - script: ./eng/scripts/cibuild.cmd -arch x64 /p:DisableCodeSigning=true
+ displayName: Build x64
+ # TODO: make it possible to build for one Windows architecture at a time
+ # This is going to actually build x86 native assets. See https://github.com/aspnet/AspNetCore/issues/7196
+
+ # Build the x86 shared framework
+ # Set DisableSignCheck because we'll run sign check in an explicit step after installers build
+ - script: ./eng/scripts/cibuild.cmd -arch x86 /t:BuildSharedFx /p:DisableCodeSigning=true
+ displayName: Build x86
+
+ # This is in a separate build step with -forceCoreMsbuild to workaround MAX_PATH limitations - https://github.com/Microsoft/msbuild/issues/53
+ - script: ./build.cmd -ci -sign -forceCoreMsbuild /p:DisableCodeSigning=true -projects ./src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj
+ displayName: Build SiteExtension
+
+ # This runs code-signing on all packages, zips, and jar files as defined in build/CodeSign.targets. If https://github.com/dotnet/arcade/issues/1957 is resolved,
+ # consider running code-signing inline with the other previous steps.
+ # Sign check is disabled because it is run in a separate step below, after installers are built.
+ - script: ./build.cmd -ci -sign /t:CodeSign /p:SignType=$(_SignType) /p:DisableSignCheck=true
+ displayName: Code sign packages
+
+ # Windows installers bundle both x86 and x64 assets
+ - powershell: ./src/Installers/Windows/build.ps1 -ci /p:SignType=$(_SignType)
+ displayName: Build Installers
+
+ # Run sign check to verify everything was code signed.
+ - script: ./build.cmd -ci -sign /t:SignCheck /p:SignType=$(_SignType)
+ displayName: Run sign check
+ condition: eq(variables['_SignType'], 'real')
+
+ # Detect OSS Components in use in the product. Only needs to run on one OS in the matrix.
+ - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
+ displayName: Detect components
+ condition: eq(variables['system.pullrequest.isfork'], false)
+ artifacts:
+ - name: Windows_Packages
+ path: artifacts/packages/
+ - name: Windows_VSIX
+ path: artifacts/VSSetup/
+ - name: Windows_Manifests
+ path: artifacts/manifests/
+ - name: Windows_Installers
+ path: artifacts/installers/
+ - name: Windows_Logs
+ path: artifacts/logs/
+ publishOnError: true
+
+# Build Windows ARM
+- template: jobs/default-build.yml
+ parameters:
+ codeSign: true
+ jobName: Windows_arm_build
+ jobDisplayName: "Build: Windows ARM"
+ agentOs: Windows
+ buildScript: ./eng/scripts/cibuild.cmd -NoBuildNodeJS -NoBuildJava
+ buildArgs: -arch arm /p:SignType=$(_SignType)
+ installNodeJs: false
+ installJdk: false
+ afterBuild:
+ # Remove packages that are not rid-specific.
+ # TODO add a flag so builds only produce runtime packages
+ - powershell: gci artifacts/packages/ -recurse -exclude 'runtime.*' -file | rm -ea ignore
+ artifacts:
+ - name: Windows_arm_Packages
+ path: artifacts/packages/
+ - name: Windows_arm_Manifests
+ path: artifacts/manifests/
+ - name: Windows_arm_Installers
+ path: artifacts/installers/
+ - name: Windows_arm_Logs
+ path: artifacts/logs/
+ publishOnError: true
+
+# Build MacOS
+- template: jobs/default-build.yml
+ parameters:
+ jobName: MacOs_x64_build
+ jobDisplayName: "Build: macOS"
+ agentOs: macOs
+ buildScript: ./eng/scripts/cibuild.sh
+ buildArgs: --no-build-nodejs --no-build-java
+ installNodeJs: false
+ afterBuild:
+ # Remove packages that are not rid-specific.
+ # TODO add a flag so macOS/Linux builds only produce runtime packages
+ - script: if [ -d 'artifacts/packages' ]; then find artifacts/packages/ -type f -not -name 'runtime.*' -delete; fi
+ condition: always()
+ artifacts:
+ - name: MacOS_x64_Packages
+ path: artifacts/packages/
+ - name: MacOS_x64_Manifests
+ path: artifacts/manifests/
+ - name: MacOS_x64_Installers
+ path: artifacts/installers/
+ - name: MacOS_x64_Logs
+ path: artifacts/logs/
+ publishOnError: true
+- template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: MacOS_x64
+
+# Build Linux x64
+- template: jobs/default-build.yml
+ parameters:
+ jobName: Linux_x64_build
+ jobDisplayName: "Build: Linux x64"
+ agentOs: Linux
+ installNodeJs: false
+ buildSteps:
+ - script: ./eng/scripts/cibuild.sh --arch x64 --no-build-nodejs --no-build-java
+ displayName: Run cibuild.sh
+ - script: |
+ rm -rf .dotnet/
+ git clean -xfd src/
+ ./dockerbuild.sh bionic \
+ --ci --pack --all --no-build-nodejs --no-build-java \
+ --arch x64 \
+ -e KOREBUILD_SKIP_INSTALL_NETFX=0 \
+ /t:BuildSharedFx \
+ /p:BuildRuntimeArchive=false \
+ /p:LinuxInstallerType=deb
+ displayName: Build Debian installers
+ - script: |
+ rm -rf .dotnet/
+ git clean -xfd src/
+ ./dockerbuild.sh rhel \
+ --ci --pack --all --no-build-nodejs --no-build-java \
+ --arch x64 \
+ -e KOREBUILD_SKIP_INSTALL_NETFX=0 \
+ /t:BuildSharedFx \
+ /p:BuildRuntimeArchive=false \
+ /p:LinuxInstallerType=rpm
+ displayName: Build RPM installers
+ afterBuild:
+ # Remove packages that are not rid-specific.
+ # TODO add a flag so macOS/Linux builds only produce runtime packages
+ - script: if [ -d 'artifacts/packages' ]; then find artifacts/packages/ -type f -not -name 'runtime.*' -delete; fi
+ condition: always()
+ artifacts:
+ - name: Linux_x64_Packages
+ path: artifacts/packages/
+ - name: Linux_x64_Manifests
+ path: artifacts/manifests/
+ - name: Linux_x64_Installers
+ path: artifacts/installers/
+ - name: Linux_x64_Logs
+ path: artifacts/logs/
+ publishOnError: true
+- template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: Linux_x64
+
+# Build Linux ARM
+- template: jobs/default-build.yml
+ parameters:
+ jobName: Linux_arm_build
+ jobDisplayName: "Build: Linux ARM"
+ agentOs: Linux
+ buildScript: ./eng/scripts/cibuild.sh
+ buildArgs: --arch arm --no-build-nodejs --no-build-java
+ installNodeJs: false
+ afterBuild:
+ # Remove packages that are not rid-specific.
+ # TODO add a flag so macOS/Linux builds only produce runtime packages
+ - script: if [ -d 'artifacts/packages' ]; then find artifacts/packages/ -type f -not -name 'runtime.*' -delete; fi
+ condition: always()
+ artifacts:
+ - name: Linux_arm_Packages
+ path: artifacts/packages/
+ - name: Linux_arm_Manifests
+ path: artifacts/manifests/
+ - name: Linux_arm_Installers
+ path: artifacts/installers/
+ - name: Linux_arm_Logs
+ path: artifacts/logs/
+ publishOnError: true
+- template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: Linux_arm
+
+# Build Linux ARM64
+- template: jobs/default-build.yml
+ parameters:
+ jobName: Linux_arm64_build
+ jobDisplayName: "Build: Linux ARM64"
+ agentOs: Linux
+ buildScript: ./eng/scripts/cibuild.sh
+ buildArgs: --arch arm64 --no-build-nodejs --no-build-java
+ installNodeJs: false
+ afterBuild:
+ # Remove packages that are not rid-specific.
+ # TODO add a flag so macOS/Linux builds only produce runtime packages
+ - script: if [ -d 'artifacts/packages' ]; then find artifacts/packages/ -type f -not -name 'runtime.*' -delete; fi
+ condition: always()
+ artifacts:
+ - name: Linux_arm64_Packages
+ path: artifacts/packages/
+ - name: Linux_arm64_Manifests
+ path: artifacts/manifests/
+ - name: Linux_arm64_Installers
+ path: artifacts/installers/
+ - name: Linux_arm64_Logs
+ path: artifacts/logs/
+ publishOnError: true
+- template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: Linux_arm64
+
+# Build Linux Musl x64
+- template: jobs/default-build.yml
+ parameters:
+ jobName: Linux_musl_x64_build
+ jobDisplayName: "Build: Linux Musl x64"
+ agentOs: Linux
+ buildScript: ./dockerbuild.sh alpine
+ buildArgs: --ci --pack --all -e KOREBUILD_SKIP_INSTALL_NETFX=0 --arch x64 --os-name linux-musl --no-build-nodejs --no-build-java -p:RepositoryBranch=$(Build.SourceBranchName)
+ installNodeJs: false
+ afterBuild:
+ # Remove packages that are not rid-specific.
+ # TODO add a flag so macOS/Linux builds only produce runtime packages
+ - script: if [ -d 'artifacts/packages' ]; then find artifacts/packages/ -type f -not -name 'runtime.*' -delete; fi
+ condition: always()
+ artifacts:
+ - name: Linux_musl_x64_Packages
+ path: artifacts/packages/
+ - name: Linux_musl_x64_Manifests
+ path: artifacts/manifests/
+ - name: Linux_musl_x64_Installers
+ path: artifacts/installers/
+ - name: Linux_musl_x64_Logs
+ path: artifacts/logs/
+ publishOnError: true
+- template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: Linux_musl_x64
+
+# Test jobs
+- template: jobs/default-build.yml
+ parameters:
+ condition: ne(variables['SkipTests'], 'true')
+ jobName: Windows_Test
+ jobDisplayName: "Test: Windows Server 2016 x64"
agentOs: Windows
buildScript: ./eng/scripts/cibuild.cmd
+ buildArgs: -test "/p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISForwardsCompatibilityTests=true"
beforeBuild:
- powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1"
displayName: Setup IISExpress test certificates and schema
- buildArgs: "/p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISForwardsCompatibilityTests=true"
+ artifacts:
+ - name: Windows_Test_Logs
+ path: artifacts/logs/
+ publishOnError: true
- template: jobs/default-build.yml
parameters:
- jobName: MacOs_Build
- jobDisplayName: "Build and test: macOS"
+ condition: ne(variables['SkipTests'], 'true')
+ jobName: MacOs_Test
+ jobDisplayName: "Test: macOS 10.13"
agentOs: macOs
buildScript: ./eng/scripts/cibuild.sh
+ buildArgs: --test
+ beforeBuild:
+ - bash: "./eng/scripts/install-nginx-mac.sh"
+ displayName: Installing Nginx
+ artifacts:
+ - name: MacOS_Test_Logs
+ path: artifacts/logs/
+ publishOnError: true
- template: jobs/default-build.yml
parameters:
- jobName: Linux_Build
- jobDisplayName: "Build and test: Linux"
+ condition: ne(variables['SkipTests'], 'true')
+ jobName: Linux_Test
+ jobDisplayName: "Test: Ubuntu 16.04 x64"
agentOs: Linux
buildScript: ./eng/scripts/cibuild.sh
+ buildArgs: --test
+ beforeBuild:
+ - bash: "./eng/scripts/install-nginx-linux.sh"
+ displayName: Installing Nginx
+ artifacts:
+ - name: Linux_Test_Logs
+ path: artifacts/logs/
+ publishOnError: true
- template: jobs/iisintegration-job.yml
parameters:
+ condition: ne(variables['SkipTests'], 'true')
TestGroupName: IIS
skipArgs: " /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISTests=false /p:SkipIISExpressTests=true /p:SkipIISForwardsCompatibilityTests=true"
- template: jobs/iisintegration-job.yml
parameters:
+ condition: ne(variables['SkipTests'], 'true')
TestGroupName: IISExpress
skipArgs: "/p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISTests=true /p:SkipIISExpressTests=false /p:SkipIISForwardsCompatibilityTests=true"
- template: jobs/iisintegration-job.yml
parameters:
+ condition: ne(variables['SkipTests'], 'true')
TestGroupName: IISForwardCompat
skipArgs: "/p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISForwardsCompatibilityTests=false"
- template: jobs/iisintegration-job.yml
parameters:
+ condition: ne(variables['SkipTests'], 'true')
TestGroupName: IISBackCompat
- skipArgs: "/p:SkipIISBackwardsCompatibilityTests=false /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISForwardsCompatibilityTests=true"
\ No newline at end of file
+ skipArgs: "/p:SkipIISBackwardsCompatibilityTests=false /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISForwardsCompatibilityTests=true"
diff --git a/.azure/pipelines/e2e-tests.yml b/.azure/pipelines/e2e-tests.yml
deleted file mode 100644
index fecf598d59..0000000000
--- a/.azure/pipelines/e2e-tests.yml
+++ /dev/null
@@ -1,134 +0,0 @@
-trigger: none
-phases:
-- phase: Host_Windows
- queue:
- name: Hosted VS2017
- parallel: 8
- matrix:
- Portable_Node8:
- Test.RuntimeIdentifier: none
- Node.Version: 8.x
- Portable_Node10:
- Test.RuntimeIdentifier: none
- Node.Version: 10.x
- SelfContainedWindows_Node8:
- Test.RuntimeIdentifier: win-x64
- Node.Version: 8.x
- SelfContainedWindows_Node10:
- Test.RuntimeIdentifier: win-x64
- Node.Version: 10.x
- SelfContainedLinux_Node8:
- Test.RuntimeIdentifier: linux-x64
- Node.Version: 8.x
- SelfContainedLinux_Node10:
- Test.RuntimeIdentifier: linux-x64
- Node.Version: 10.x
- SelfContainedMacOs_Node8:
- Test.RuntimeIdentifier: osx-x64
- Node.Version: 8.x
- SelfContainedMacOs_Node10:
- Test.RuntimeIdentifier: osx-x64
- Node.Version: 10.x
- steps:
- - task: NodeTool@0
- displayName: Install Node $(Node.Version)
- inputs:
- versionSpec: $(Node.Version)
- - powershell: |
- test/Cli.FunctionalTests/run-tests.ps1 -ci -ProdConManifestUrl $env:PRODCONMANIFESTURL -TestRuntimeIdentifier $(Test.RuntimeIdentifier) -AdditionalRestoreSources $env:ADDITIONALRESTORESOURCES
- condition: ne(variables['PB_SkipTests'], 'true')
- displayName: Run E2E tests
- - task: PublishTestResults@2
- displayName: Publish test results
- condition: always()
- inputs:
- testRunner: vstest
- testResultsFiles: 'artifacts/logs/**/*.trx'
-- phase: Host_macOS
- queue:
- name: Hosted macOS
- parallel: 8
- matrix:
- Portable_Node8:
- Test.RuntimeIdentifier: none
- Node.Version: 8.x
- Portable_Node10:
- Test.RuntimeIdentifier: none
- Node.Version: 10.x
- SelfContainedWindows_Node8:
- Test.RuntimeIdentifier: win-x64
- Node.Version: 8.x
- SelfContainedWindows_Node10:
- Test.RuntimeIdentifier: win-x64
- Node.Version: 10.x
- SelfContainedLinux_Node8:
- Test.RuntimeIdentifier: linux-x64
- Node.Version: 8.x
- SelfContainedLinux_Node10:
- Test.RuntimeIdentifier: linux-x64
- Node.Version: 10.x
- SelfContainedMacOs_Node8:
- Test.RuntimeIdentifier: osx-x64
- Node.Version: 8.x
- SelfContainedMacOs_Node10:
- Test.RuntimeIdentifier: osx-x64
- Node.Version: 10.x
- steps:
- - task: NodeTool@0
- displayName: Install Node $(Node.Version)
- inputs:
- versionSpec: $(Node.Version)
- - powershell: |
- test/Cli.FunctionalTests/run-tests.ps1 -ci -ProdConManifestUrl $env:PRODCONMANIFESTURL -TestRuntimeIdentifier $(Test.RuntimeIdentifier) -AdditionalRestoreSources $env:ADDITIONALRESTORESOURCES
- condition: ne(variables['PB_SkipTests'], 'true')
- displayName: Run E2E tests
- - task: PublishTestResults@2
- displayName: Publish test results
- condition: always()
- inputs:
- testRunner: vstest
- testResultsFiles: 'artifacts/logs/**/*.trx'
-- phase: Host_Linux
- queue:
- name: Hosted Linux Preview
- parallel: 8
- matrix:
- Portable_Node8:
- Test.RuntimeIdentifier: none
- Node.Version: 8.x
- Portable_Node10:
- Test.RuntimeIdentifier: none
- Node.Version: 10.x
- SelfContainedWindows_Node8:
- Test.RuntimeIdentifier: win-x64
- Node.Version: 8.x
- SelfContainedWindows_Node10:
- Test.RuntimeIdentifier: win-x64
- Node.Version: 10.x
- SelfContainedLinux_Node8:
- Test.RuntimeIdentifier: linux-x64
- Node.Version: 8.x
- SelfContainedLinux_Node10:
- Test.RuntimeIdentifier: linux-x64
- Node.Version: 10.x
- SelfContainedMacOs_Node8:
- Test.RuntimeIdentifier: osx-x64
- Node.Version: 8.x
- SelfContainedMacOs_Node10:
- Test.RuntimeIdentifier: osx-x64
- Node.Version: 10.x
- steps:
- - task: NodeTool@0
- displayName: Install Node $(Node.Version)
- inputs:
- versionSpec: $(Node.Version)
- - powershell: |
- test/Cli.FunctionalTests/run-tests.ps1 -ci -ProdConManifestUrl $env:PRODCONMANIFESTURL -TestRuntimeIdentifier $(Test.RuntimeIdentifier) -AdditionalRestoreSources $env:ADDITIONALRESTORESOURCES
- condition: ne(variables['PB_SkipTests'], 'true')
- displayName: Run E2E tests
- - task: PublishTestResults@2
- displayName: Publish test results
- condition: always()
- inputs:
- testRunner: vstest
- testResultsFiles: 'artifacts/logs/**/*.trx'
diff --git a/.azure/pipelines/jobs/codesign-xplat.yml b/.azure/pipelines/jobs/codesign-xplat.yml
new file mode 100644
index 0000000000..ca6897f364
--- /dev/null
+++ b/.azure/pipelines/jobs/codesign-xplat.yml
@@ -0,0 +1,31 @@
+# This runs code signing for .nupkg files built on MacOS or Linux
+parameters:
+ inputName: ''
+
+jobs:
+- template: default-build.yml
+ parameters:
+ codeSign: true
+ dependsOn:
+ - ${{ parameters.inputName }}_build
+ condition: in(variables['_SignType'], 'test', 'real')
+ jobName: CodeSign_Xplat_${{ parameters.inputName }}
+ jobDisplayName: "Code-sign ${{ parameters.inputName }} packages"
+ agentOs: Windows
+ installNodeJs: false
+ installJdk: false
+ buildSteps:
+ - task: DownloadBuildArtifacts@0
+ displayName: Download ${{ parameters.inputName }} artifacts
+ inputs:
+ artifactName: ${{ parameters.inputName }}_Packages
+ downloadPath: $(Build.StagingDirectory)/deps/
+ itemPattern: '**/*.nupkg'
+ - task: MSBuild@1
+ displayName: Code-sign .nupkg files
+ inputs:
+ solution: eng\tools\XplatPackageSigner\XplatPackageSigner.proj
+ msbuildArguments: /p:SignType=$(_SignType) /p:DirectoryToSign=$(Build.StagingDirectory)\deps\${{ parameters.inputName }}_Packages\
+ artifacts:
+ - name: ${{ parameters.inputName }}_Packages_Signed
+ path: $(Build.StagingDirectory)\deps\${{ parameters.inputName }}_Packages\
diff --git a/.azure/pipelines/jobs/default-build.yml b/.azure/pipelines/jobs/default-build.yml
index 234e7c00c2..825df89f86 100644
--- a/.azure/pipelines/jobs/default-build.yml
+++ b/.azure/pipelines/jobs/default-build.yml
@@ -14,13 +14,15 @@
# Note: -ci is always passed
# beforeBuild: [steps]
# Additional steps to run before build.sh/cmd
+# buildSteps: [steps]
+# Instead of running build.cmd/sh, run these build steps.
# afterBuild: [steps]
# Additional steps to run after build.sh/cmd
-# artifacts:
-# publish: boolean
-# Should artifacts be published
-# path: string
+# artifacts: [array]
+# - path: string
# The file path to artifacts output
+# includeForks: boolean
+# Should artifacts from forks be published
# name: string
# The name of the artifact container
# variables: { string: string }
@@ -29,6 +31,8 @@
# A map of matrix configurations and variables. https://docs.microsoft.com/en-us/vsts/pipelines/yaml-schema?view=vsts#matrix
# dependsOn: string | [ string ]
# For fan-out/fan-in. https://docs.microsoft.com/en-us/vsts/pipelines/yaml-schema?view=vsts#phase
+# condition: string
+# A condition which can be used to skip the job completely
# codeSign: boolean
# This build definition is enabled for code signing. (Only applies to Windows)
# buildDirectory: string
@@ -46,23 +50,27 @@ parameters:
buildArgs: ''
configuration: 'Release'
beforeBuild: []
+ # buildSteps: [] don't define an empty object default because there is no way in template expression yet to check "if isEmpty(parameters.buildSteps)"
afterBuild: []
codeSign: false
variables: {}
dependsOn: ''
+ condition: ''
# jobName: '' - use agentOs by default.
# jobDisplayName: '' - use agentOs by default.
# matrix: {} - don't define an empty object default because there is no way in template expression yet to check "if isEmpty(parameters.matrix)"
- artifacts:
- publish: true
- path: 'artifacts/'
+ artifacts: []
buildDirectory: ''
buildScript: ''
+ installNodeJs: true
+ installJdk: true
jobs:
- job: ${{ coalesce(parameters.jobName, parameters.agentOs) }}
displayName: ${{ coalesce(parameters.jobDisplayName, parameters.agentOs) }}
dependsOn: ${{ parameters.dependsOn }}
+ ${{ if ne(parameters.condition, '') }}:
+ condition: ${{ parameters.condition }}
timeoutInMinutes: 120
workspace:
clean: all
@@ -73,14 +81,14 @@ jobs:
# Map friendly OS names to the right queue
# See https://github.com/dotnet/arcade/blob/master/Documentation/ChoosingAMachinePool.md
pool:
+ ${{ if ne(parameters.poolVmImage, '') }}:
+ vmImage: ${{ parameters.poolVmImage }}
+ ${{ if and(eq(parameters.poolVmImage, ''), eq(parameters.agentOs, 'macOS')) }}:
+ vmImage: macOS-10.13
+ ${{ if and(eq(parameters.poolVmImage, ''), eq(parameters.agentOs, 'Linux')) }}:
+ vmImage: ubuntu-16.04
${{ if ne(parameters.poolName, '') }}:
name: ${{ parameters.poolName }}
- ${{ if and(eq(parameters.poolName, ''), eq(parameters.agentOs, 'macOS')) }}:
- name: Hosted macOS
- vmImage: macOS-10.13
- ${{ if and(eq(parameters.poolName, ''), eq(parameters.agentOs, 'Linux')) }}:
- name: Hosted Ubuntu 1604
- vmImage: ubuntu-16.04
${{ if and(eq(parameters.poolName, ''), eq(parameters.agentOs, 'Windows')) }}:
${{ if eq(variables['System.TeamProject'], 'internal') }}:
name: dotnet-internal-temp
@@ -94,22 +102,23 @@ jobs:
BuildScriptArgs: ${{ parameters.buildArgs }}
BuildConfiguration: ${{ parameters.configuration }}
BuildDirectory: ${{ parameters.buildDirectory }}
+ TeamName: AspNetCore
${{ if eq(parameters.agentOs, 'Windows') }}:
JAVA_HOME: $(Agent.BuildDirectory)\.tools\jdk
${{ if or(ne(parameters.codeSign, 'true'), ne(variables['System.TeamProject'], 'internal')) }}:
- _SignType:
+ _SignType: ''
${{ if and(eq(parameters.codeSign, 'true'), eq(variables['System.TeamProject'], 'internal')) }}:
- TeamName: AspNetCore
_SignType: real
${{ insert }}: ${{ parameters.variables }}
steps:
- checkout: self
clean: true
- - task: NodeTool@0
- displayName: Install Node 10.x
- inputs:
- versionSpec: 10.x
- - ${{ if eq(parameters.agentOs, 'Windows') }}:
+ - ${{ if eq(parameters.installNodeJs, 'true') }}:
+ - task: NodeTool@0
+ displayName: Install Node 10.x
+ inputs:
+ versionSpec: 10.x
+ - ${{ if and(eq(parameters.installJdk, 'true'), eq(parameters.agentOs, 'Windows')) }}:
- powershell: ./eng/scripts/InstallJdk.ps1 '11.0.1'
displayName: Install JDK 11
- ${{ if and(eq(variables['System.TeamProject'], 'internal'), eq(parameters.agentOs, 'Windows'), eq(parameters.codeSign, 'true')) }}:
@@ -120,17 +129,31 @@ jobs:
signType: $(_SignType)
zipSources: false
feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json
+
- ${{ parameters.beforeBuild }}
- - ${{ if eq(parameters.buildScript, '') }}:
- - ${{ if eq(parameters.agentOs, 'Windows') }}:
- - script: .\$(BuildDirectory)\build.cmd -ci /p:SignType=$(_SignType) /p:Configuration=$(BuildConfiguration) $(BuildScriptArgs)
- displayName: Run build.cmd
- - ${{ if ne(parameters.agentOs, 'Windows') }}:
- - script: ./$(BuildDirectory)/build.sh -ci -p:Configuration=$(BuildConfiguration) $(BuildScriptArgs)
- displayName: Run build.sh
- - ${{ if ne(parameters.buildScript, '') }}:
- - script: $(BuildScript) /p:Configuration=$(BuildConfiguration) $(BuildScriptArgs)
- displayName: run $(BuildScript)
+
+ - ${{ if ne(parameters.buildSteps, '')}}:
+ - ${{ parameters.buildSteps }}
+ - ${{ if eq(parameters.buildSteps, '')}}:
+ - ${{ if eq(parameters.buildScript, '') }}:
+ - ${{ if eq(parameters.agentOs, 'Windows') }}:
+ - script: .\$(BuildDirectory)\build.cmd -ci /p:SignType=$(_SignType) /p:Configuration=$(BuildConfiguration) $(BuildScriptArgs)
+ displayName: Run build.cmd
+ - powershell: eng\scripts\KillProcesses.ps1
+ displayName: Kill processes
+ condition: always()
+ - ${{ if ne(parameters.agentOs, 'Windows') }}:
+ - script: ./$(BuildDirectory)/build.sh -ci -p:Configuration=$(BuildConfiguration) $(BuildScriptArgs)
+ displayName: Run build.sh
+ - script: eng/scripts/KillProcesses.sh
+ displayName: Kill processes
+ condition: always()
+ - ${{ if ne(parameters.buildScript, '') }}:
+ - script: $(BuildScript) /p:Configuration=$(BuildConfiguration) $(BuildScriptArgs)
+ displayName: run $(BuildScript)
+
+ - ${{ parameters.afterBuild }}
+
- task: PublishTestResults@2
displayName: Publish test results
condition: always()
@@ -140,23 +163,23 @@ jobs:
testRunner: vstest
testResultsFiles: '**/artifacts/**/*.trx'
mergeTestResults: true
- - ${{ if eq(parameters.artifacts.publish, 'true') }}:
+ - ${{ each artifact in parameters.artifacts }}:
- task: PublishBuildArtifacts@1
- displayName: Upload artifacts
- condition: eq(variables['system.pullrequest.isfork'], false)
+ displayName: Upload artifacts from ${{ artifact.path }}
+ condition: and(or(succeeded(), eq('${{ artifact.publishOnError }}', 'true')), or(eq(variables['system.pullrequest.isfork'], false), eq('${{ artifact.includeForks }}', 'true')))
continueOnError: true
inputs:
${{ if eq(parameters.buildDirectory, '') }}:
- pathtoPublish: ${{ parameters.artifacts.path }}
+ pathtoPublish: ${{ artifact.path }}
${{ if ne(parameters.buildDirectory, '') }}:
- pathtoPublish: ${{ parameters.buildDirectory }}\${{ parameters.artifacts.path }}
- ${{ if eq(parameters.artifacts.name, '') }}:
+ pathtoPublish: ${{ parameters.buildDirectory }}\${{ artifact.path }}
+ ${{ if eq(artifact.name, '') }}:
artifactName: artifacts-$(AgentOsName)-$(BuildConfiguration)
- ${{ if ne(parameters.artifacts.name, '') }}:
- artifactName: ${{ parameters.artifacts.name }}
+ ${{ if ne(artifact.name, '') }}:
+ artifactName: ${{ artifact.name }}
artifactType: Container
parallel: true
- - ${{ parameters.afterBuild }}
+
- ${{ if and(eq(variables['System.TeamProject'], 'internal'), eq(parameters.agentOs, 'Windows')) }}:
- task: MicroBuildCleanup@1
displayName: Cleanup MicroBuild tasks
diff --git a/.azure/pipelines/jobs/iisintegration-job.yml b/.azure/pipelines/jobs/iisintegration-job.yml
index 3ee3a2a307..281bca5278 100644
--- a/.azure/pipelines/jobs/iisintegration-job.yml
+++ b/.azure/pipelines/jobs/iisintegration-job.yml
@@ -1,14 +1,20 @@
jobs:
- template: default-build.yml
parameters:
- buildScript: ./build.cmd
- buildArgs: "-ci -restore -build -test -projects src/Servers/IIS/**/*.csproj ${{ parameters.skipArgs }}"
+ buildScript: .\build.cmd
+ buildArgs: "-ci -test -projects src/Servers/IIS/**/*.csproj ${{ parameters.skipArgs }}"
+ poolName: "Hosted VS2017"
+ poolVmImage: "vs2017-win2016"
beforeBuild:
- - powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1; & ./src/Servers/IIS/tools/SetupTestEnvironment.ps1 Setup"
+ - powershell: "& ./src/Servers/IIS/tools/InstallIISFeatures.ps1; & ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1; & ./src/Servers/IIS/tools/SetupTestEnvironment.ps1 Setup"
displayName: Prepare repo
afterBuild:
- powershell: "& ./src/Servers/IIS/tools/SetupTestEnvironment.ps1 Shutdown"
displayName: Stop AppVerifier
condition: always()
jobName: ANCM_${{ parameters.TestGroupName }}
- jobDisplayName: "Build and test: ANCM ${{ parameters.TestGroupName }}"
+ jobDisplayName: "Test: ANCM ${{ parameters.TestGroupName }}"
+ artifacts:
+ - name: IIS_${{ parameters.TestGroupName }}_Logs
+ path: artifacts/logs/
+ publishOnError: true
diff --git a/.azure/pipelines/pr-validation-temp.yml b/.azure/pipelines/pr-validation-temp.yml
deleted file mode 100644
index 218598aaeb..0000000000
--- a/.azure/pipelines/pr-validation-temp.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-# This configuration is temporary while we work on getting all unit tests to pass on PR checks
-
-# Don't run CI for this config
-trigger: none
-
-# Run PR validation on all branches
-pr:
- branches:
- include:
- - '*'
-
-jobs:
-- template: jobs/default-build.yml
- parameters:
- jobName: Windows_Build
- jobDisplayName: "Build only : Windows"
- agentOs: Windows
- buildArgs: -all -pack
-- template: jobs/default-build.yml
- parameters:
- jobName: macOs_Build
- jobDisplayName: "Build only : macOS"
- agentOs: macOS
- buildArgs: --all --pack
-- template: jobs/default-build.yml
- parameters:
- jobName: Linux_Build
- jobDisplayName: "Build only : Linux"
- agentOs: Linux
- buildArgs: --all --pack
-- job: Code_check
- displayName: Code check
- workspace:
- clean: all
- pool:
- vmImage: vs2017-win2016
- steps:
- - powershell: ./eng/scripts/CodeCheck.ps1 -ci
diff --git a/.azure/pipelines/signalr-daily-tests.yml b/.azure/pipelines/signalr-daily-tests.yml
index 1b13105f63..2e74597f73 100644
--- a/.azure/pipelines/signalr-daily-tests.yml
+++ b/.azure/pipelines/signalr-daily-tests.yml
@@ -10,7 +10,7 @@ jobs:
- template: jobs/default-build.yml
parameters:
buildDirectory: src/SignalR
- buildArgs: "/p:DailyTests=true /p:SauceUser='$(asplab-sauce-labs-username)' /p:SauceKey='$(asplab-sauce-labs-access-key)'"
+ buildArgs: "/p:DailyTests=true /p:SauceUser='$(asplab-sauce-labs-username)' /p:SauceKey='$(asplab-sauce-labs-access-key)' -t"
agentOs: Windows
jobName: SignalRDailyTests
jobDisplayName: "SignalR Daily Tests"
diff --git a/.azure/pipelines/site-extensions.yml b/.azure/pipelines/site-extensions.yml
deleted file mode 100644
index 3d1359e56a..0000000000
--- a/.azure/pipelines/site-extensions.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-trigger:
- branches:
- include:
- - release/2.2
- paths:
- include:
- - src/SiteExtensions
-
-name: $(Date:yyMMdd)-$(Rev:rr)
-
-phases:
-- phase: SiteExtensions
- variables:
- CI: true
- DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
-
- # This variable is required by MicroBuildSigningPlugin to determine permissions for codesigning.
- TeamName: AspNetCore
-
- # SignType = { test, real }
- # This is prefixed underscore because variables automatically become environment variables (and therefore MSBuild properties),
- # and this one was causing issues in MSBuild projects which use the $(SignType) MSbuild prop.
- _SignType: real
-
- steps:
- - task: MicroBuildSigningPlugin@1
- displayName: Install MicroBuild plugin
- condition: and(succeeded(), in(variables['_SignType'], 'test', 'real'))
- inputs:
- signType: $(_SignType)
- zipSources: false
- - script: src/SiteExtensions/LoggingAggregate/build.cmd -ci
- displayName: Run src/SiteExtensions/LoggingAggregate/build.cmd
- - task: PublishBuildArtifacts@1
- displayName: Upload artifacts
- condition: eq(variables['system.pullrequest.isfork'], false)
- inputs:
- pathtoPublish: ./src/SiteExtensions/LoggingAggregate/artifacts/
- artifactName: artifacts-Windows-Release
- artifactType: Container
- - task: MicroBuildCleanup@1
- displayName: Cleanup MicroBuild tasks
- condition: always()
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 9fba304d8e..093a4fcdaa 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -6,7 +6,9 @@
/src/Components/ @SteveSandersonMS
/src/DefaultBuilder/ @tratcher
/src/Hosting/ @tratcher
-/src/Http/ @tratcher
+/src/Http/ @tratcher @jkotalik
/src/Middleware/ @tratcher
/src/Security/ @tratcher
-/src/Servers/ @tratcher
+/src/Servers/ @tratcher @jkotalik
+/src/Middleware/Rewrite @jkotalik
+/src/Middleware/HttpsPolicy @jkotalik
diff --git a/.gitignore b/.gitignore
index 469825be56..0f57015b8c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,6 @@ korebuild-lock.txt
.gradle/
src/SignalR/clients/**/dist/
modules/
+
+# Template config files for blazor templates is generated on-build
+src/Components/**/.template.config/
diff --git a/Directory.Build.props b/Directory.Build.props
index a213e4ada3..406abcec72 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -53,6 +53,25 @@
true
true
Debug
+ AnyCPU
+ $(Platform)
+ win
+ osx
+ linux
+ x64
+ $(TargetOsName)-$(TargetArchitecture)
+
+
+
+ win-x64;
+ win-x86;
+ win-arm;
+ osx-x64;
+ linux-musl-x64;
+ linux-x64;
+ linux-arm;
+ linux-arm64
+
SHA256
@@ -61,19 +80,12 @@
false
+
+
+ strict
-
-
- Microsoft400
- 3PartySHA2
- Microsoft400
- NuGet
- VsixSHA2
- MicrosoftJAR
-
-
-
+
@@ -81,19 +93,29 @@
$(MSBuildThisFileDirectory)artifacts\
$(ArtifactsDir)obj\
$(ArtifactsDir)$(Configuration)\
- $(ArtifactsConfigurationDir)packages\
- $(BasePackageOutputPath)product\
- $(BasePackageOutputPath)internal\
- $(ArtifactsConfigurationDir)installers\
+ $(ArtifactsDir)packages\$(Configuration)\
+ $(ArtifactsPackagesDir)Shipping\
+ $(ArtifactsPackagesDir)NonShipping\
+ $(ArtifactsDir)installers\$(Configuration)\
+ $(ArtifactsDir)VSSetup\$(Configuration)\
+
+
+
+
+
+
+
+
- $(RepositoryRoot)bin\$(Configuration)\$(MSBuildProjectName)\
- $(BaseOutputPath)
+ $(RepositoryRoot)bin\$(MSBuildProjectName)\
+ $(BaseOutputPath)$(Configuration)\
+ $(BaseOutputPath)$(PlatformName)\$(Configuration)\
+
$(RepositoryRoot)obj\$(MSBuildProjectName)\
- $(BaseIntermediateOutputPath)$(Configuration)\
- $(OutputPath)$(Platform)\
- $(IntermediateOutputPath)$(Platform)\
+ $(BaseIntermediateOutputPath)$(Configuration)\
+ $(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\
@@ -112,12 +134,13 @@
$(MSBuildThisFileDirectory)src\Mvc\src\Microsoft.AspNetCore.Mvc.Testing\Microsoft.AspNetCore.Mvc.Testing.targets
+
+ true
-
diff --git a/Directory.Build.targets b/Directory.Build.targets
index de6e19d8e2..1654fd256f 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -6,10 +6,10 @@
By default, all projects which produce packages are not intended to ship to NuGet.org as a product package.
Packages which are intended to ship to NuGet.org must opt-in by setting this to true in the project file.
-->
- false
+ false
- $(ProductPackageOutputPath)
- $(InternalPackageOutputPath)
+ $(ArtifactsShippingPackagesDir)
+ $(ArtifactsNonShippingPackagesDir)
@@ -20,8 +20,6 @@
-
- true
$(PackagesInPatch.Contains(' $(PackageId);'))
diff --git a/build.cmd b/build.cmd
index b6c8d24864..592b5d0f95 100644
--- a/build.cmd
+++ b/build.cmd
@@ -1,2 +1,2 @@
@ECHO OFF
-PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE"
+PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = ''; try { & '%~dp0build.ps1' %*; exit $LASTEXITCODE } catch { write-host $_; exit 1 }"
diff --git a/build.ps1 b/build.ps1
index 2d08643422..578129a9ac 100644
--- a/build.ps1
+++ b/build.ps1
@@ -9,17 +9,17 @@ This build script installs required tools and runs an MSBuild command on this re
This script can be used to invoke various targets, such as targets to produce packages,
build projects, run tests, and generate code.
-.PARAMETER RepoPath
-The folder to build. Defaults to the folder containing this script. This will be removed soon.
-
.PARAMETER CI
Sets up CI specific settings and variables.
.PARAMETER Restore
-Run restore on projects.
+Run restore.
-.PARAMETER Build
-Compile projects.
+.PARAMETER NoRestore
+Suppress running restore on projects.
+
+.PARAMETER NoBuild
+Suppress re-compile projects. (Implies -NoRestore)
.PARAMETER Pack
Produce packages.
@@ -30,23 +30,34 @@ Run tests.
.PARAMETER Sign
Run code signing.
+.PARAMETER Architecture
+The CPU architecture to build for (x64, x86, arm). Default=x64
+
.PARAMETER Projects
A list of projects to build. Globbing patterns are supported, such as "$(pwd)/**/*.csproj"
.PARAMETER All
Build all project types.
-.PARAMETER Managed
+.PARAMETER BuildManaged
Build managed projects (C#, F#, VB).
+You can also use -NoBuildManaged to suppress this project type.
-.PARAMETER Native
+.PARAMETER BuildNative
Build native projects (C++).
+You can also use -NoBuildNative to suppress this project type.
-.PARAMETER NodeJS
+.PARAMETER BuildNodeJS
Build NodeJS projects (TypeScript, JS).
+You can also use -NoBuildNodeJS to suppress this project type.
-.PARAMETER Installers
+.PARAMETER BuildJava
+Build Java projects.
+You can also use -NoBuildJava to suppress this project type.
+
+.PARAMETER BuildInstallers
Build Windows Installers. Required .NET 3.5 to be installed (WiX toolset requirement).
+You can also use -NoBuildInstallers to suppress this project type.
.PARAMETER MSBuildArguments
Additional MSBuild arguments to be passed through.
@@ -54,7 +65,7 @@ Additional MSBuild arguments to be passed through.
.EXAMPLE
Building both native and managed projects.
- build.ps1 -managed -native
+ build.ps1 -BuildManaged -BuildNative
.EXAMPLE
Building a subfolder of code.
@@ -71,36 +82,38 @@ Online version: https://github.com/aspnet/AspNetCore/blob/master/docs/BuildFromS
#>
[CmdletBinding(PositionalBinding = $false, DefaultParameterSetName='Groups')]
param(
- # Bootstrapper options
- [Obsolete('This parameter will be removed when we finish https://github.com/aspnet/AspNetCore/issues/4246')]
- [string]$RepoRoot = $PSScriptRoot,
-
[switch]$CI,
# Build lifecycle options
- [switch]$Restore = $True, # Run tests
- [switch]$Build = $True, # Compile
+ [switch]$Restore,
+ [switch]$NoRestore, # Suppress restore
+ [switch]$NoBuild, # Suppress compiling
[switch]$Pack, # Produce packages
[switch]$Test, # Run tests
[switch]$Sign, # Code sign
- # Project selection
- [Parameter(ParameterSetName = 'All')]
- [switch]$All, # Build everything
+ [ValidateSet('x64', 'x86', 'arm')]
+ $Architecture = 'x64',
# A list of projects which should be built.
- [Parameter(ParameterSetName = 'Projects')]
[string]$Projects,
+ # Project selection
+ [switch]$All, # Build everything
+
# Build a specified set of project groups
- [Parameter(ParameterSetName = 'Groups')]
- [switch]$Managed,
- [Parameter(ParameterSetName = 'Groups')]
- [switch]$Native,
- [Parameter(ParameterSetName = 'Groups')]
- [switch]$NodeJS,
- [Parameter(ParameterSetName = 'Groups')]
- [switch]$Installers,
+ [switch]$BuildManaged,
+ [switch]$BuildNative,
+ [switch]$BuildNodeJS,
+ [switch]$BuildJava,
+ [switch]$BuildInstallers,
+
+ # Inverse of the previous switches because specifying '-switch:$false' is not intuitive for most command line users
+ [switch]$NoBuildManaged,
+ [switch]$NoBuildNative,
+ [switch]$NoBuildNodeJS,
+ [switch]$NoBuildJava,
+ [switch]$NoBuildInstallers,
# By default, Windows builds will use MSBuild.exe. Passing this will force the build to run on
# dotnet.exe instead, which may cause issues if you invoke build on a project unsupported by
@@ -203,7 +216,6 @@ if ($Help) {
exit 1
}
-$RepoRoot = Resolve-Path $RepoRoot
$Channel = 'master'
$ToolsSource = 'https://aspnetcore.blob.core.windows.net/buildtools'
$ConfigFile = Join-Path $PSScriptRoot 'korebuild.json'
@@ -213,8 +225,8 @@ if (Test-Path $ConfigFile) {
try {
$config = Get-Content -Raw -Encoding UTF8 -Path $ConfigFile | ConvertFrom-Json
if ($config) {
- if (!($Channel) -and (Get-Member -Name 'channel' -InputObject $config)) { [string] $Channel = $config.channel }
- if (!($ToolsSource) -and (Get-Member -Name 'toolsSource' -InputObject $config)) { [string] $ToolsSource = $config.toolsSource}
+ if (Get-Member -Name 'channel' -InputObject $config) { [string] $Channel = $config.channel }
+ if (Get-Member -Name 'toolsSource' -InputObject $config) { [string] $ToolsSource = $config.toolsSource}
}
} catch {
Write-Warning "$ConfigFile could not be read. Its settings will be ignored."
@@ -245,35 +257,52 @@ elseif ($Projects) {
}
$MSBuildArguments += "/p:Projects=$Projects"
}
-else {
- # When adding new sub-group build flags, add them to this check.
- if((-not $Native) -and (-not $Managed) -and (-not $NodeJS) -and (-not $Installers)) {
- Write-Warning "No default group of projects was specified, so building the 'managed' and 'native' subsets of projects. Run ``build.cmd -help`` for more details."
+# When adding new sub-group build flags, add them to this check.
+elseif((-not $BuildNative) -and (-not $BuildManaged) -and (-not $BuildNodeJS) -and (-not $BuildInstallers) -and (-not $BuildJava)) {
+ Write-Warning "No default group of projects was specified, so building the 'managed' and 'native' subsets of projects. Run ``build.cmd -help`` for more details."
- # This goal of this is to pick a sensible default for `build.cmd` with zero arguments.
- # Now that we support subfolder invokations of build.cmd, we will be pushing to have build.cmd build everything (-all) by default
+ # This goal of this is to pick a sensible default for `build.cmd` with zero arguments.
+ # Now that we support subfolder invokations of build.cmd, we will be pushing to have build.cmd build everything (-all) by default
- $Managed = $true
- $Native = $true
- }
-
- $MSBuildArguments += "/p:BuildManaged=$Managed"
- $MSBuildArguments += "/p:BuildNative=$Native"
- $MSBuildArguments += "/p:BuildNodeJS=$NodeJS"
- $MSBuildArguments += "/p:BuildWindowsInstallers=$Installers"
+ $BuildManaged = $true
+ $BuildNative = $true
}
+if ($BuildInstallers) { $MSBuildArguments += "/p:BuildInstallers=true" }
+if ($BuildManaged) { $MSBuildArguments += "/p:BuildManaged=true" }
+if ($BuildNative) { $MSBuildArguments += "/p:BuildNative=true" }
+if ($BuildNodeJS) { $MSBuildArguments += "/p:BuildNodeJS=true" }
+if ($BuildJava) { $MSBuildArguments += "/p:BuildJava=true" }
+
+if ($NoBuildInstallers) { $MSBuildArguments += "/p:BuildInstallers=false" }
+if ($NoBuildManaged) { $MSBuildArguments += "/p:BuildManaged=false" }
+if ($NoBuildNative) { $MSBuildArguments += "/p:BuildNative=false" }
+if ($NoBuildNodeJS) { $MSBuildArguments += "/p:BuildNodeJS=false" }
+if ($NoBuildJava) { $MSBuildArguments += "/p:BuildJava=false" }
+
+$RunBuild = if ($NoBuild) { $false } else { $true }
+
+# Run restore by default unless -NoRestore is set.
+# -NoBuild implies -NoRestore, unless -Restore is explicitly set (as in restore.cmd)
+$RunRestore = if ($NoRestore) { $false }
+ elseif ($Restore) { $true }
+ elseif ($NoBuild) { $false }
+ else { $true }
+
# Target selection
-$MSBuildArguments += "/p:_RunRestore=$Restore"
-$MSBuildArguments += "/p:_RunBuild=$Build"
+$MSBuildArguments += "/p:_RunRestore=$RunRestore"
+$MSBuildArguments += "/p:_RunBuild=$RunBuild"
$MSBuildArguments += "/p:_RunPack=$Pack"
$MSBuildArguments += "/p:_RunTests=$Test"
$MSBuildArguments += "/p:_RunSign=$Sign"
+$MSBuildArguments += "/p:TargetArchitecture=$Architecture"
+$MSBuildArguments += "/p:TargetOsName=win"
+
Import-Module -Force -Scope Local (Join-Path $korebuildPath 'KoreBuild.psd1')
try {
- Set-KoreBuildSettings -ToolsSource $ToolsSource -DotNetHome $DotNetHome -RepoPath $RepoRoot -ConfigFile $ConfigFile -CI:$CI
+ Set-KoreBuildSettings -ToolsSource $ToolsSource -DotNetHome $DotNetHome -RepoPath $PSScriptRoot -ConfigFile $ConfigFile -CI:$CI
if ($ForceCoreMsbuild) {
$global:KoreBuildSettings.MSBuildType = 'core'
}
diff --git a/build.sh b/build.sh
index 3f99fddf97..bf5e54e8b0 100755
--- a/build.sh
+++ b/build.sh
@@ -14,20 +14,30 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
verbose=false
update=false
reinstall=false
-repo_path="$DIR"
lockfile_path="$DIR/korebuild-lock.txt"
config_file="$DIR/korebuild.json"
channel='master'
tools_source='https://aspnetcore.blob.core.windows.net/buildtools'
+target_os_name=''
ci=false
run_restore=true
run_build=true
run_pack=false
run_tests=false
build_all=false
-build_managed=false
-build_nodejs=false
+build_managed=''
+build_native=''
+build_nodejs=''
+build_java=''
build_projects=''
+target_arch='x64'
+
+if [ "$(uname)" = "Darwin" ]; then
+ target_os_name='osx'
+else
+ target_os_name='linux'
+fi
+
msbuild_args=()
#
@@ -37,23 +47,28 @@ __usage() {
echo "Usage: $(basename "${BASH_SOURCE[0]}") [options] [[--] ...]
Arguments:
- ... Arguments passed to the command. Variable number of arguments allowed.
+ ... Arguments passed to the command. Variable number of arguments allowed.
Options:
- --[no-]restore Run restore.
- --[no-]build Compile projects
- --[no-]pack Produce packages.
- --[no-]test Run tests.
+ --arch The CPU architecture to build for (x64, arm, arm64). Default=$target_arch
+ --os-name The base runtime identifier to build for (linux, osx, linux-musl). Default=$target_os_name
- --projects A list of projects to build. (Must be an absolute path.)
- Globbing patterns are supported, such as \"$(pwd)/**/*.csproj\".
+ --[no-]restore Run restore.
+ --[no-]build Compile projects. (Implies --no-restore)
+ --[no-]pack Produce packages.
+ --[no-]test Run tests.
- --all Build all project types.
- --managed Build managed projects (C#, F#, VB).
- --nodejs Build NodeJS projects (TypeScript, JS).
+ --projects A list of projects to build. (Must be an absolute path.)
+ Globbing patterns are supported, such as \"$(pwd)/**/*.csproj\".
- --ci Apply CI specific settings and environment variables.
- --verbose Show verbose output.
+ --all Build all project types.
+ --[no-]build-native Build native projects (C, C++).
+ --[no-]build-managed Build managed projects (C#, F#, VB).
+ --[no-]build-nodejs Build NodeJS projects (TypeScript, JS).
+ --[no-]build-java Build Java projects.
+
+ --ci Apply CI specific settings and environment variables.
+ --verbose Show verbose output.
Description:
This build script installs required tools and runs an MSBuild command on this repository
@@ -151,11 +166,15 @@ while [[ $# -gt 0 ]]; do
__usage --no-exit
exit 0
;;
- --repo-root|-RepoRoot)
+ --arch)
shift
- __warn '--repo-root is obsolete and will be removed when we finish https://github.com/aspnet/AspNetCore/issues/4246'
- repo_path="${1:-}"
- [ -z "$repo_path" ] && __error "Missing value for parameter --repo-root" && __usage
+ target_arch="${1:-}"
+ [ -z "$target_arch" ] && __error "Missing value for parameter --arch" && __usage
+ ;;
+ --os-name)
+ shift
+ target_os_name="${1:-}"
+ [ -z "$target_os_name" ] && __error "Missing value for parameter --os-name" && __usage
;;
--restore|-[Rr]estore)
run_restore=true
@@ -168,6 +187,8 @@ while [[ $# -gt 0 ]]; do
;;
--no-build)
run_build=false
+ # --no-build implies --no-restore
+ run_restore=false
;;
--pack|-[Pp]ack)
run_pack=true
@@ -189,14 +210,29 @@ while [[ $# -gt 0 ]]; do
--all|-[Aa]ll)
build_all=true
;;
- --managed|-[Mm]anaged)
+ --build-managed|-BuildManaged)
build_managed=true
;;
- --nodejs|-[Nn]ode[Jj][Ss])
+ --no-build-managed|-NoBuildManaged)
+ build_managed=false
+ ;;
+ --build-nodejs|-BuildNodeJs)
build_nodejs=true
;;
- --native|-[Nn]ative)
- __warn 'The C++ projects in this repo only build on Windows. The --native flag will be ignored.'
+ --no-build-nodejs|-NoBuildNodeJs)
+ build_nodejs=false
+ ;;
+ --build-java|-BuildJava)
+ build_java=true
+ ;;
+ --no-build-java|-NoBuildJava)
+ build_java=false
+ ;;
+ --build-native|-BuildNative)
+ build_native=true
+ ;;
+ --no-build-native|-NoBuildNative)
+ build_native=false
;;
--ci|-[Cc][Ii])
ci=true
@@ -259,25 +295,31 @@ if [ "$build_all" = true ]; then
msbuild_args[${#msbuild_args[*]}]="-p:BuildAllProjects=true"
elif [ ! -z "$build_projects" ]; then
msbuild_args[${#msbuild_args[*]}]="-p:Projects=$build_projects"
-else
- # When adding new sub-group build flags, add them to this check
- if [ "$build_managed" = false ] && [ "$build_nodejs" = false ]; then
- # This goal of this is to pick a sensible default for `build.sh` with zero arguments.
- # We believe the most common thing our contributors will work on is C#, so if no other build group was picked, build the C# projects.
- __warn "No default group of projects was specified, so building the 'managed' subset of projects. Run ``build.sh -help`` for more details."
- build_managed=true
- fi
-
- msbuild_args[${#msbuild_args[*]}]="-p:BuildManaged=$build_managed"
- msbuild_args[${#msbuild_args[*]}]="-p:BuildNodeJS=$build_nodejs"
+elif [ -z "$build_managed" ] && [ -z "$build_nodejs" ] && [ -z "$build_java" ] && [ -z "$build_native" ]; then
+ # This goal of this is to pick a sensible default for `build.sh` with zero arguments.
+ # We believe the most common thing our contributors will work on is C#, so if no other build group was picked, build the C# projects.
+ __warn "No default group of projects was specified, so building the 'managed' subset of projects. Run ``build.sh -help`` for more details."
+ build_managed=true
fi
+# Only set these MSBuild properties if they were explicitly set by build parameters.
+[ ! -z "$build_java" ] && msbuild_args[${#msbuild_args[*]}]="-p:BuildJava=$build_java"
+[ ! -z "$build_native" ] && msbuild_args[${#msbuild_args[*]}]="-p:BuildNative=$build_native"
+[ ! -z "$build_nodejs" ] && msbuild_args[${#msbuild_args[*]}]="-p:BuildNodeJS=$build_nodejs"
+[ ! -z "$build_managed" ] && msbuild_args[${#msbuild_args[*]}]="-p:BuildManaged=$build_managed"
+
msbuild_args[${#msbuild_args[*]}]="-p:_RunRestore=$run_restore"
msbuild_args[${#msbuild_args[*]}]="-p:_RunBuild=$run_build"
msbuild_args[${#msbuild_args[*]}]="-p:_RunPack=$run_pack"
msbuild_args[${#msbuild_args[*]}]="-p:_RunTests=$run_tests"
-set_korebuildsettings "$tools_source" "$DOTNET_HOME" "$repo_path" "$config_file" "$ci"
+msbuild_args[${#msbuild_args[*]}]="-p:TargetArchitecture=$target_arch"
+msbuild_args[${#msbuild_args[*]}]="-p:TargetOsName=$target_os_name"
+
+# Disable downloading ref assemblies as a tarball. Use netfx refs from the Microsoft.NETFramework.ReferenceAssemblies NuGet package instead.
+[ -z "${KOREBUILD_SKIP_INSTALL_NETFX:-}" ] && KOREBUILD_SKIP_INSTALL_NETFX=1
+
+set_korebuildsettings "$tools_source" "$DOTNET_HOME" "$DIR" "$config_file" "$ci"
# This incantation avoids unbound variable issues if msbuild_args is empty
# https://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u
diff --git a/build/AzureIntegration.targets b/build/AzureIntegration.targets
index bf9fbc0389..90961cf1f4 100644
--- a/build/AzureIntegration.targets
+++ b/build/AzureIntegration.targets
@@ -3,13 +3,11 @@
$(MSBuildThisFileDirectory)..\src\AzureIntegration\
-
+
AspNetUniverseBuildOffline=true;
RepositoryRoot=$(AzureIntegrationProjectRoot);
- DotNetRestoreSourcePropsPath=$(GeneratedRestoreSourcesPropsPath);
- DotNetPackageVersionPropsPath=$(GeneratedPackageVersionPropsPath);
VersionSuffix=$(VersionSuffix);
BuildNumberSuffix=$(BuildNumberSuffix);
Configuration=$(Configuration);
@@ -25,7 +23,7 @@
-
+
diff --git a/build/CodeSign.props b/build/CodeSign.props
index 6aef3ba9c4..7f5d4a527d 100644
--- a/build/CodeSign.props
+++ b/build/CodeSign.props
@@ -1,85 +1,55 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/build/CodeSign.targets b/build/CodeSign.targets
index fecc25ee41..6827c8c2a4 100644
--- a/build/CodeSign.targets
+++ b/build/CodeSign.targets
@@ -4,71 +4,34 @@
$(CodeSignDependsOn);CollectFileSignInfo
-
-
-
- <_RepositoryProject Remove="@(_RepositoryProject)" />
- <_RepositoryProject Include="$(MSBuildProjectFullPath)" Condition="'%(Repository.Identity)' != ''">
- RepositoryRoot=%(Repository.RootPath)
- %(Repository.Build)
-
- <_ShippedRepositoryProject Include="$(MSBuildProjectFullPath)" Condition="'%(ShippedRepository.Identity)' != ''">
- RepositoryRoot=%(ShippedRepository.RootPath)
- false
-
-
-
+
-
- AssemblySigningCertName=$(AssemblySigningCertName);
- AssemblySigning3rdPartyCertName=$(AssemblySigning3rdPartyCertName);
- PowerShellSigningCertName=$(PowerShellSigningCertName);
- PackageSigningCertName=$(PackageSigningCertName);
- VsixSigningCertName=$(VsixSigningCertName);
- JarSigningCertName=$(JarSigningCertName);
- ArtifactsDir=$(ArtifactsDir)
-
+ $(IntermediateDir)ar\
+ $(BaseRedistNetCorePath)$(TargetRuntimeIdentifier)\
-
-
-
-
-
-
-
-
- <_FilesToSign Include="@(_RepoFileSignInfo)" Condition="'%(_RepoFileSignInfo.IsFileToSign)' == 'true' AND ('$(_ReposWereBuilt)' == 'true' OR '%(_RepoFileSignInfo.Container)' != '' ) " />
- <_FilesToSign Include="@(_ShippedRepoFileSignInfo)" Condition="'%(_ShippedRepoFileSignInfo.IsFileToSign)' == 'true' AND '%(_ShippedRepoFileSignInfo.Container)' != '' " />
-
+
+
+
+
+
+
-
- <_Temp Remove="@(_Temp)" />
- <_Temp Include="@(FilesToExcludeFromSigning)" />
-
-
- <_Temp Remove="@(_Temp)" />
-
-
-
-
-
-
-
-
-
-
- <_FileSignInfo Include="@(FilesToSign)" IsFileToSign="true" />
- <_FileSignInfo Include="@(FilesToExcludeFromSigning)" IsFileToExcludeFromSign="true" />
+
+
+
+
+
+
+
+
+
+
diff --git a/build/Maestro/Maestro.csproj b/build/Maestro/Maestro.csproj
new file mode 100644
index 0000000000..e9af762aa8
--- /dev/null
+++ b/build/Maestro/Maestro.csproj
@@ -0,0 +1,37 @@
+
+
+
+
+ netcoreapp3.0
+ true
+ $(ArtifactsDir)manifests\
+ true
+
+
+
+
+
+
+
+
+
+
+
+ NonShipping=true
+
+
+
+
+
+
+
+
+
+
diff --git a/build/Publish.targets b/build/Publish.targets
deleted file mode 100644
index fa3e8c9d77..0000000000
--- a/build/Publish.targets
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/build/RepositoryBuild.targets b/build/RepositoryBuild.targets
deleted file mode 100644
index ba064d3451..0000000000
--- a/build/RepositoryBuild.targets
+++ /dev/null
@@ -1,160 +0,0 @@
-
-
-
-
- false
-
- <_NoBuildRepos>$(NoBuild)
- <_BuildScriptToExecute Condition="'$(OS)'!='Windows_NT'">build.sh
- <_BuildScriptToExecute Condition="'$(OS)'=='Windows_NT'">build.cmd
-
-
-
-
-
- $(SubmoduleRoot)%(Identity)\
-
-
- %(RepositoryBuildOrder.Order)
- %(RepositoryBuildOrder.Identity)
-
- RepositoryToBuild=%(RepositoryBuildOrder.Identity);
- BuildRepositoryRoot=$([MSBuild]::NormalizeDirectory(%(RepositoryBuildOrder.RootPath)))
-
-
-
-
-
-
-
-
-
- <_ReposWereBuilt>true
- <_NoBuildRepos>true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
-
- $(RepositoryBuildArguments) -ci
-
- $(RepositoryBuildArguments) /p:AspNetUniverseBuildOffline=true
- $(RepositoryBuildArguments) /p:IsUniverseBuild=true
-
- $(RepositoryBuildArguments) /p:DotNetRestoreSourcePropsPath=$(GeneratedRestoreSourcesPropsPath)
- $(RepositoryBuildArguments) /p:DotNetPackageVersionPropsPath=$(GeneratedPackageVersionPropsPath)
-
- $(RepositoryBuildArguments) /p:SignType=
- $(RepositoryBuildArguments) /p:VersionSuffix=$(VersionSuffix)
- $(RepositoryBuildArguments) /p:BuildNumberSuffix=$(BuildNumberSuffix)
- $(RepositoryBuildArguments) /p:Configuration=$(Configuration)
- $(RepositoryBuildArguments) /p:IsFinalBuild=$(IsFinalBuild)
-
- $(RepositoryBuildArguments) /p:DisablePackageReferenceRestrictions=true
-
- $(RepositoryBuildArguments) /p:DisableCodeSigning=true
- $(RepositoryBuildArguments) '/p:DotNetAssetRootAccessTokenSuffix=$(DotNetAssetRootAccessTokenSuffix)'
- $(RepositoryBuildArguments) '/p:DotNetAssetRootUrl=$(DotNetAssetRootUrl)'
- $(RepositoryBuildArguments) /p:SkipAspNetCoreRuntimeInstall=true
-
-
-
-
-
- /t:CleanArtifacts /t:Build /p:SkipTests=true $(RepositoryBuildArguments)
- $(BuildArguments) /bl:$(LogOutputDir)$(RepositoryToBuild).build.binlog
- $(BuildRepositoryRoot)artifacts\msbuild\
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- /t:Test /p:NoBuild=$(_NoBuildRepos) $(RepositoryBuildArguments)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/SharedFrameworkOnly.props b/build/SharedFrameworkOnly.props
index 73b030b5f7..58f688c678 100644
--- a/build/SharedFrameworkOnly.props
+++ b/build/SharedFrameworkOnly.props
@@ -8,7 +8,6 @@
-
@@ -21,7 +20,7 @@
-
+
diff --git a/build/SharedFx.targets b/build/SharedFx.targets
index 08f15d775f..0a3066c666 100644
--- a/build/SharedFx.targets
+++ b/build/SharedFx.targets
@@ -2,11 +2,8 @@
$(RepositoryRoot)src\Framework\test\Microsoft.AspNetCore.App.UnitTests.csproj
$([MSBuild]::NormalizePath($(UnitTestFxProject)))
- $(CodeSignDependsOn);GetSharedFxFilesToSign
_BuildSharedFxProjects;TestSharedFx
$(BuildSharedFxDependsOn);CodeSign
- $(IntermediateDir)ar\$(SharedFxRid)\
- $(GetArtifactInfo);GetFxProjectArtifactInfo
@@ -15,8 +12,8 @@
-
-
+
+
@@ -24,60 +21,32 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
<_RestoreGraphProjectInput>@(FxProjectToBuild)
-
- $(BuildProperties);
- SharedFxRid=$(SharedFxRid);
- SharedFxArchitecture=$(SharedFxArchitecture);
- DotNetRestoreSourcePropsPath=$(GeneratedRestoreSourcesPropsPath);
- DotNetPackageVersionPropsPath=$(GeneratedPackageVersionPropsPath);
- PackageVersion=$(PackageVersion)
-
+ Properties="$(BuildProperties);RestoreGraphProjectInput=$(_RestoreGraphProjectInput);_DummyTarget=Restore" />
-
+
- $(LogOutputDir)SharedFx-UnitTests-$(Version).trx
+ $(LogOutputDir)SharedFx-UnitTests-$(PackageVersion)-$(TargetRuntimeIdentifier).trx
$(UnitTestFxTrxLogFile)
$(HostMachineRepositoryRoot)/artifacts/logs/SharedFx-UnitTests.trx
@@ -104,35 +73,4 @@
-
-
- <_InspectionTargetsFile>$(MSBuildProjectDirectory)\Project.Inspection.targets
-
-
-
- <_Temp Remove="@(_Temp)" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/artifacts.props b/build/artifacts.props
deleted file mode 100644
index 756194a28b..0000000000
--- a/build/artifacts.props
+++ /dev/null
@@ -1,172 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/buildorder.props b/build/buildorder.props
deleted file mode 100644
index 4cef7bf246..0000000000
--- a/build/buildorder.props
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/external-dependencies.props b/build/external-dependencies.props
deleted file mode 100644
index e9b08f2897..0000000000
--- a/build/external-dependencies.props
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/publish/Publish.csproj b/build/publish/Publish.csproj
deleted file mode 100644
index a136fe7910..0000000000
--- a/build/publish/Publish.csproj
+++ /dev/null
@@ -1,182 +0,0 @@
-
-
-
-
-
-
- netcoreapp3.0
- true
- $(ArtifactsDir)manifests\
- https://maestro-prod.westus2.cloudapp.azure.com
-
-
-
-
-
-
-
-
-
-
-
- GetFilesToPublish;
- GenerateBuildAssetManifest;
- PublishToAzureFeed;
- PublishToMyGet;
- PublishToBuildAssetRegistry;
-
-
-
-
-
-
-
-
- <_FilesToPublish Include="$(InstallersOutputPath)*.txt">
- text/plain
-
-
- <_FilesToPublish Include="$(InstallersOutputPath)*.version">
- text/plain
- no-cache, no-store, must-revalidate
-
-
- <_FilesToPublish Include="$(InstallersOutputPath)*.svg">
- no-cache, no-store, must-revalidate
- image/svg+xml
-
-
-
- <_FilesToPublish Include="$(InstallersOutputPath)*" Exclude="@(_FilesToPublish)" />
-
-
- <_FilesToPublish Include="$(ProductPackageOutputPath)*.jar;$(ProductPackageOutputPath)*.pom">
- aspnetcore/jar/$(PackageVersion)/
-
-
-
-
- aspnetcore/npm/$(PackageVersion)/
-
- <_FilesToPublish Include="@(NpmPackageToPublish)" />
-
-
-
- %(_FilesToPublish.BlobBasePath)%(_FilesToPublish.FileName)%(_FilesToPublish.Extension)
- aspnetcore/Runtime/$(PackageVersion)/%(_FilesToPublish.FileName)%(_FilesToPublish.Extension)
-
- <_FilesToPublish Remove="@(_FilesToPublish)" />
-
-
-
-
-
-
-
-
- NonShipping=true
-
-
- NonShipping=true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $(PublishMyGetNpmRegistryUrl.Replace("https:", "")):_authToken
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/repo.props b/build/repo.props
index f50b7d4f03..397e3d471d 100644
--- a/build/repo.props
+++ b/build/repo.props
@@ -1,23 +1,25 @@
-
+
+ $(TargetOsName)-$(TargetArchitecture)
+
+
true
true
false
- true
+ true
false
false
- $(RepositoryRoot)src\
-
- $(ArtifactsDir)$(Configuration)\packages\product\
- $(ArtifactsDir)$(Configuration)\packages\internal\
- $(ArtifactsDir)$(Configuration)\installers\
+ $(ArtifactsDir)packages\$(Configuration)\Shipping\
+ $(ArtifactsDir)packages\$(Configuration)\NonShipping\
+ $(ArtifactsDir)installers\$(Configuration)\
+ $(ArtifactsDir)VSSetup\$(Configuration)\
$(RepositoryRoot)eng\signcheck.exclusions.txt
@@ -36,8 +38,10 @@
+
+
+
+
+
@@ -65,60 +80,64 @@
-
+
-
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
+
-
-
- Platform=x64
- Platform=x86
-
-
-
+
+ Platform=x64
+ Platform=Win32
+
+
+
+
+
+
+ Exclude="@(ProjectToExclude)" />
-
+
+
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
diff --git a/build/repo.targets b/build/repo.targets
index 0e3872ef1b..b076164fc8 100644
--- a/build/repo.targets
+++ b/build/repo.targets
@@ -1,18 +1,13 @@
-
-
-
+
$(BuildProperties);BuildToolsTaskAssembly=$(_BuildToolsAssembly)
- $(IntermediateDir)dependencies.g.props
- $(IntermediateDir)sources.g.props
-
Prepare
@@ -23,36 +18,43 @@
true
true
- SetTeamCityBuildNumberToVersion;$(PrepareDependsOn)
- $(PrepareDependsOn);VerifyPackageArtifactConfig;VerifyExternalDependencyConfig;PrepareOutputPaths
-
- $(CleanDependsOn);CleanArtifacts;CleanRepoArtifacts
+ $(CleanDependsOn);CleanArtifacts
$(RestoreDependsOn);InstallDotNet;RestoreProjects
Restore
- $(CompileDependsOn);BuildProjects;PackSharedSources
- $(CompileDependsOn);PackProjects;BuildRepositories;BuildSharedFx
+ $(CompileDependsOn);BuildProjects
$(PackageDependsOn);PackProjects
- $(PackageDependsOn);RemoveSharedFrameworkOnlyRefsFromNuspec
+ $(PackageDependsOn);BuildSharedFx;RemoveSharedFrameworkOnlyRefsFromNuspec
$(TestDependsOn);Compile
$(TestDependsOn);TestProjects
- $(TestDependsOn);_TestRepositories
- $(GetArtifactInfoDependsOn);GetProjectArtifactInfo
- $(GetArtifactInfoDependsOn);ResolveSharedSourcesPackageInfo
- $(GetArtifactInfoDependsOn);ResolveRepoInfo
+ $(BuildDependsOn);GenerateBuildAssetManifest
$(CodeSignDependsOn);RemoveSharedFrameworkOnlyRefsFromNuspec
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -70,7 +72,7 @@
@@ -86,192 +88,27 @@
-
-
-
-
-
-
-
-
-
-
- $(BuildProperties);MicrosoftNETCoreAppPackageVersion=$(MicrosoftNETCoreAppPackageVersion);
-
-
-
- <_RepositoryProject Include="$(MSBuildProjectFullPath)" Condition="'%(Repository.Identity)' != ''">
- RepositoryRoot=%(Repository.RootPath)
- %(Repository.Build)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <_Temp Remove="@(_Temp)" />
- <_Temp Include="@(PackageArtifact)" />
-
-
-
-
-
-
-
-
-
-
-
- <_PackageArtifactWithoutMatchingInfo Include="@(_Temp)" Exclude="@(PackageArtifact)" />
-
-
-
-
-
-
-
- %(ShippedArtifactInfo.Version)
-
-
-
- <_PackageArtifactSpec Include="@(PackageArtifact)" />
-
-
-
-
- <_ShippedSolution Update="@(_ShippedSolution)" Build="false" IsPatching="false" />
- <_NoBuildSolution Update="@(_NoBuildSolution)" Build="false" />
-
-
-
-
-
-
-
-
- <_LineupPackages Include="@(ExternalDependency)" />
- <_LineupPackages Include="%(ArtifactInfo.PackageId)" Version="%(ArtifactInfo.Version)" Condition=" '%(ArtifactInfo.ArtifactType)' == 'NuGetPackage' " />
-
- <_RestoreSources Include="$(ProductPackageOutputPath)" />
- <_RestoreSources Include="$(InternalPackageOutputPath)" />
- <_RestoreSources Include="$(RestoreSources)" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <_UndeclaredPackageArtifact Include="%(ArtifactInfo.PackageId)" Condition="'%(ArtifactInfo.ArtifactType)' == 'NuGetPackage'" />
- <_UndeclaredPackageArtifact Remove="@(PackageArtifact)" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <_BuildOutput Include="$(ProductPackageOutputPath)%(PackageArtifact.Identity).*.nupkg"
- Condition=" '%(PackageArtifact.Category)' == 'ship' " />
-
-
+ <_BuildOutput Include="$(ArtifactsShippingPackagesDir)*.nupkg"
+ Exclude="$(ArtifactsShippingPackagesDir)*.symbols.nupkg" />
+ FrameworkOnlyPackages="@(SharedFrameworkOnlyPackage)" />
-
-
-
+
+
+
-
+
+
diff --git a/build/runtimes.props b/build/runtimes.props
index 469097305f..37259f3135 100644
--- a/build/runtimes.props
+++ b/build/runtimes.props
@@ -1,6 +1,9 @@
+
+
+
@@ -10,12 +13,6 @@
Arch="x86"
Feed="$(DotNetAssetRootUrl)"
FeedCredential="$(DotNetAssetRootAccessTokenSuffix)" />
-
-
-
diff --git a/build/sources.props b/build/sources.props
index 2b3d86b634..e32fdfb649 100644
--- a/build/sources.props
+++ b/build/sources.props
@@ -12,29 +12,19 @@
$(RestoreSources);
https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json;
https://api.nuget.org/v3/index.json;
-
-
- $(RestoreSources);
- https://dotnet.myget.org/F/dotnet-core/api/v3/index.json;
https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json;
- https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json;
https://dotnet.myget.org/F/aspnetcore-master/api/v3/index.json;
+ https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json;
https://dotnet.myget.org/F/blazor-dev/api/v3/index.json;
- https://dotnet.myget.org/F/roslyn/api/v3/index.json;
+ https://dotnet.myget.org/F/dotnet-core/api/v3/index.json;
https://dotnet.myget.org/F/roslyn-tools/api/v3/index.json;
- https://vside.myget.org/F/vssdk/api/v3/index.json;
+ https://dotnet.myget.org/F/roslyn/api/v3/index.json;
+ https://vside.myget.org/F/devcore/api/v3/index.json;
https://vside.myget.org/F/vsmac/api/v3/index.json;
- https://vside.myget.org/F/devcore/api/v3/index.json
+ https://vside.myget.org/F/vssdk/api/v3/index.json;
-
-
- $(RestoreSources);
- https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json;
-
-
- https://dotnetcli.blob.core.windows.net/dotnet/
- $(PublicCoreFeedPrefix)
+ https://dotnetcli.blob.core.windows.net/dotnet/
diff --git a/build/submodules.props b/build/submodules.props
deleted file mode 100644
index 6353244288..0000000000
--- a/build/submodules.props
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
- true
-
-
- ProductChangesOnly
-
-
-
- false
- ProductChangesOnly
-
-
-
-
-
- true
-
-
-
-
-
-
-
-
-
-
diff --git a/build/tasks/JoinRepoItems.cs b/build/tasks/JoinRepoItems.cs
deleted file mode 100644
index 97f0ab9d0f..0000000000
--- a/build/tasks/JoinRepoItems.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Microsoft.Build.Framework;
-using Microsoft.Build.Utilities;
-
-namespace RepoTasks
-{
- public class JoinRepoItems : Task
- {
- [Required]
- public ITaskItem[] Left { get; set; }
-
- [Required]
- public ITaskItem[] Right { get; set; }
-
- // The metadata to use as the new item spec. If not specified, LeftKey is used.
- public string LeftItemSpec { get; set; }
-
- // LeftKey and RightKey: The metadata to join on. If not set, then use the ItemSpec
- public string LeftKey { get; set; }
-
- public string RightKey { get; set; }
-
-
- // LeftMetadata and RightMetadata: The metadata names to include in the result. Specify "*" to include all metadata
- public string[] LeftMetadata { get; set; }
-
- public string[] RightMetadata { get; set; }
-
-
- [Output]
- public ITaskItem[] JoinResult { get; private set; }
-
- public override bool Execute()
- {
- bool useAllLeftMetadata = LeftMetadata != null && LeftMetadata.Length == 1 && LeftMetadata[0] == "*";
- bool useAllRightMetadata = RightMetadata != null && RightMetadata.Length == 1 && RightMetadata[0] == "*";
- var newItemSpec = string.IsNullOrEmpty(LeftItemSpec)
- ? LeftKey
- : LeftItemSpec;
-
- JoinResult = Left.Join(Right,
- item => GetKeyValue(LeftKey, item),
- item => GetKeyValue(RightKey, item),
- (left, right) =>
- {
- // If including all metadata from left items and none from right items, just return left items directly
- if (useAllLeftMetadata &&
- string.IsNullOrEmpty(LeftKey) &&
- string.IsNullOrEmpty(LeftItemSpec) &&
- (RightMetadata == null || RightMetadata.Length == 0))
- {
- return left;
- }
-
- // If including all metadata from right items and none from left items, just return the right items directly
- if (useAllRightMetadata &&
- string.IsNullOrEmpty(RightKey) &&
- string.IsNullOrEmpty(LeftItemSpec) &&
- (LeftMetadata == null || LeftMetadata.Length == 0))
- {
- return right;
- }
-
- var ret = new TaskItem(GetKeyValue(newItemSpec, left));
-
- // Weird ordering here is to prefer left metadata in all cases, as CopyToMetadata doesn't overwrite any existing metadata
- if (useAllLeftMetadata)
- {
- // CopyMetadata adds an OriginalItemSpec, which we don't want. So we subsequently remove it
- left.CopyMetadataTo(ret);
- ret.RemoveMetadata("OriginalItemSpec");
- }
-
- if (!useAllRightMetadata && RightMetadata != null)
- {
- foreach (string name in RightMetadata)
- {
- ret.SetMetadata(name, right.GetMetadata(name));
- }
- }
-
- if (!useAllLeftMetadata && LeftMetadata != null)
- {
- foreach (string name in LeftMetadata)
- {
- ret.SetMetadata(name, left.GetMetadata(name));
- }
- }
-
- if (useAllRightMetadata)
- {
- // CopyMetadata adds an OriginalItemSpec, which we don't want. So we subsequently remove it
- right.CopyMetadataTo(ret);
- ret.RemoveMetadata("OriginalItemSpec");
- }
-
- return (ITaskItem)ret;
- },
- StringComparer.OrdinalIgnoreCase).ToArray();
-
- return true;
- }
-
- static string GetKeyValue(string key, ITaskItem item)
- {
- if (string.IsNullOrEmpty(key))
- {
- return item.ItemSpec;
- }
- else
- {
- return item.GetMetadata(key);
- }
- }
- }
-}
diff --git a/build/tasks/OrderBy.cs b/build/tasks/OrderBy.cs
deleted file mode 100644
index a761d6f093..0000000000
--- a/build/tasks/OrderBy.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Linq;
-using Microsoft.Build.Framework;
-using Microsoft.Build.Utilities;
-
-namespace RepoTasks
-{
- public class OrderBy : Task
- {
- [Required]
- [Output]
- public ITaskItem[] Items { get; set; }
-
- public string Key { get; set; }
-
- public override bool Execute()
- {
- var key = string.IsNullOrEmpty(Key)
- ? "Identity"
- : Key;
- Items = Items.OrderBy(k => k.GetMetadata(key)).ToArray();
- return true;
- }
- }
-}
diff --git a/build/tasks/PublishToAzureBlob.cs b/build/tasks/PublishToAzureBlob.cs
deleted file mode 100644
index 71f1b1c29a..0000000000
--- a/build/tasks/PublishToAzureBlob.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-#if BUILD_AZ_TASKS
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using Microsoft.Build.Framework;
-using Microsoft.WindowsAzure.Storage;
-using Microsoft.WindowsAzure.Storage.Blob;
-
-namespace RepoTasks
-{
- ///
- /// Publish files to an Azure storage blob
- ///
- public class PublishToAzureBlob : Microsoft.Build.Utilities.Task, ICancelableTask
- {
- private CancellationTokenSource _cts = new CancellationTokenSource();
-
- ///
- /// The files to publish.
- ///
- [Required]
- public ITaskItem[] Files { get; set; }
-
- ///
- /// The Azure blob storage account name.
- ///
- [Required]
- public string AccountName { get; set; }
-
- ///
- /// The SAS token used to write to Azure.
- ///
- [Required]
- public string SharedAccessToken { get; set; }
-
- ///
- /// The Azure blob storage container name
- ///
- [Required]
- public string ContainerName { get; set; }
-
- ///
- /// The maximum number of parallel pushes.
- ///
- public int MaxParallelism { get; set; } = 8;
-
- public void Cancel() => _cts.Cancel();
-
- public override bool Execute()
- => ExecuteAsync().Result;
-
- private async Task ExecuteAsync()
- {
- var connectionString = $"BlobEndpoint=https://{AccountName}.blob.core.windows.net;SharedAccessSignature={SharedAccessToken}";
-
- var account = CloudStorageAccount.Parse(connectionString);
- var client = account.CreateCloudBlobClient();
- var container = client.GetContainerReference(ContainerName);
-
- var ctx = new OperationContext();
- var tasks = new List();
-
- using (var throttler = new SemaphoreSlim(MaxParallelism))
- {
- foreach (var item in Files)
- {
- _cts.Token.ThrowIfCancellationRequested();
- await throttler.WaitAsync( _cts.Token);
- tasks.Add(
- Task.Run(async () =>
- {
- try
- {
- await PushFileAsync(ctx, container, item, _cts.Token);
- }
- finally
- {
- throttler.Release();
- }
- }));
- }
-
- await Task.WhenAll(tasks);
- }
-
- return !Log.HasLoggedErrors;
- }
-
- private async Task PushFileAsync(OperationContext ctx, CloudBlobContainer container, ITaskItem item, CancellationToken cancellationToken)
- {
- cancellationToken.ThrowIfCancellationRequested();
-
- // normalize slashes
- var dest = item.GetMetadata("RelativeBlobPath")
- .Replace('\\', '/')
- .Replace("//", "/");
- var contentType = item.GetMetadata("ContentType");
- var cacheControl = item.GetMetadata("CacheControl");
-
- if (string.IsNullOrEmpty(dest))
- {
- Log.LogError($"Item {item.ItemSpec} is missing required metadata 'RelativeBlobPath'");
- return;
- }
-
- var blob = container.GetBlockBlobReference(dest);
-
- if (!string.IsNullOrEmpty(cacheControl))
- {
- blob.Properties.CacheControl = cacheControl;
- }
-
- if (!string.IsNullOrEmpty(contentType))
- {
- blob.Properties.ContentType = contentType;
- }
-
- Log.LogMessage(MessageImportance.High, $"Beginning push of {item.ItemSpec} to https://{AccountName}.blob.core.windows.net/{ContainerName}/{dest}");
-
- var accessCondition = bool.TryParse(item.GetMetadata("Overwrite"), out var overwrite) && overwrite
- ? AccessCondition.GenerateEmptyCondition()
- : AccessCondition.GenerateIfNotExistsCondition();
-
- try
- {
- await blob.UploadFromFileAsync(item.ItemSpec, accessCondition, new BlobRequestOptions(), ctx, cancellationToken);
- }
- catch (Exception ex)
- {
- Log.LogError($"Error publishing {item.ItemSpec}: {ex}");
- return;
- }
- finally
- {
- Log.LogMessage(MessageImportance.High, $"Done publishing {item.ItemSpec} to https://{AccountName}.blob.core.windows.net/{ContainerName}/{dest}");
- }
- }
- }
-}
-#endif
diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj
index 06c08355a3..2069525e61 100644
--- a/build/tasks/RepoTasks.csproj
+++ b/build/tasks/RepoTasks.csproj
@@ -4,18 +4,17 @@
netcoreapp2.2
net461
- $(DefineConstants);BUILD_MSI_TASKS
- $(DefineConstants);BUILD_AZ_TASKS
+ $(DefineConstants);BUILD_MSI_TASKS
+ true
-
-
+
diff --git a/build/tasks/RepoTasks.tasks b/build/tasks/RepoTasks.tasks
index e073e49173..d253037b90 100644
--- a/build/tasks/RepoTasks.tasks
+++ b/build/tasks/RepoTasks.tasks
@@ -6,9 +6,6 @@
-
-
-
diff --git a/dockerbuild.sh b/dockerbuild.sh
index b34962846e..da76a9f482 100755
--- a/dockerbuild.sh
+++ b/dockerbuild.sh
@@ -26,6 +26,7 @@ __usage() {
echo ""
echo "Options:"
echo " -v, --volume An additional volume mount to add to the build container"
+ echo " -e, --env Additional environment variables to add to the build container"
echo ""
echo "Description:"
echo " This will run build.sh inside the dockerfile as defined in build/docker/\$image.Dockerfile."
@@ -69,6 +70,13 @@ while [[ $# -gt 0 ]]; do
docker_args[${#docker_args[*]}]="--volume"
docker_args[${#docker_args[*]}]="$volume_spec"
;;
+ -e|--env)
+ shift
+ env_var="${1:-}"
+ [ -z "$env_var" ] && __error "Missing value for parameter --env" && __usage
+ docker_args[${#docker_args[*]}]="-e"
+ docker_args[${#docker_args[*]}]="$env_var"
+ ;;
*)
build_args[${#build_args[*]}]="$1"
;;
diff --git a/docs/Artifacts.md b/docs/Artifacts.md
index a9378c4672..450d19f627 100644
--- a/docs/Artifacts.md
+++ b/docs/Artifacts.md
@@ -5,16 +5,20 @@ Building this repo produces build artifacts in the directory structure described
```
artifacts/
- $(Configuration)/
- installers/
+ installers/
+ $(Configuration)/
*.msi = Windows installers
*.deb, *.rpm = Linux installers
*.zip, *.tar.gz = archives versions of installers
- packages/
- product/ = Packages which are intended for use by customers. These, along with installers, represent the 'product'.
+ packages/
+ $(Configuration)/
+ Shipping/ = Packages which are intended for use by customers. These, along with installers, represent the 'product'.
*.nupkg = NuGet packages which ship to nuget.org
*.jar = Java packages which ship to Maven Central and others
*.tgz = NPM packages which ship to npmjs.org
- internal/
+ NonShipping/
*.nupkg = NuGet packages for internal use only. Used to hand off bits to Microsoft partner teams. Not intended for use by customers.
+ VSSetup/
+ $(Configuration)/
+ *.vsix = Visual Studio extensions
```
diff --git a/docs/BuildFromSource.md b/docs/BuildFromSource.md
index 624d4ce185..ef3bf330a1 100644
--- a/docs/BuildFromSource.md
+++ b/docs/BuildFromSource.md
@@ -87,10 +87,13 @@ Opening solution files may produce an error code NU1105 with a message such
This is a known issue in NuGet () and we are working with them for a solution. See also to track progress on this.
-**The workaround** for now is to add all projects to the solution.
+**The workaround** for now is to add all projects to the solution. You can either do this one by one using `dotnet sln`
dotnet sln add C:\src\AspNetCore\src\Hosting\Abstractions\src\Microsoft.AspNetCore.Hosting.Abstractions.csproj
+Or you can use this script to automatically traverse the project reference graph, which then invokes `dotnet sln` for you: [eng/scripts/AddAllProjectRefsToSolution.ps1](/eng/scripts/AddAllProjectRefsToSolution.ps1).
+
+ ./eng/scripts/AddAllProjectRefsToSolution.ps1 -WorkingDir src/Mvc/
#### PATH
@@ -164,14 +167,15 @@ Property | Description
-------------------------|-------------------------------------------------------------------------------------------------------------
BuildNumberSuffix | (string). A specific build number, typically from a CI counter, which is appended to the pre-release label.
Configuration | `Debug` or `Release`. Default = `Debug`.
-SharedFxRID | The runtime identifier of the shared framework.
+TargetArchitecture | The CPU architecture to build for (x64, x86, arm, arm64).
+TargetOsName | The base runtime identifier to build for (win, linux, osx, linux-musl).
## Use the result of your build
After building ASP.NET Core from source, you will need to install and use your local version of ASP.NET Core.
See ["Artifacts"](./Artifacts.md) for more explanation of the different folders produced by a build.
-- Run the installers produced in `artifacts/{Debug, Release}/installers/` for your platform.
+- Run the installers produced in `artifacts/installers/{Debug, Release}/` for your platform.
- Add a NuGet.Config to your project directory with the following content:
```xml
@@ -179,7 +183,7 @@ See ["Artifacts"](./Artifacts.md) for more explanation of the different folders
-
+
diff --git a/docs/DailyBuilds.md b/docs/DailyBuilds.md
index 0ad337b7d8..6ffb37f781 100644
--- a/docs/DailyBuilds.md
+++ b/docs/DailyBuilds.md
@@ -5,7 +5,7 @@ Daily builds include the latest source code changes. They are not supported for
If you want to download the latest daily build and use it in a project, then you need to:
-- Obtain the latest [build of the .NET Core SDK](https://github.com/dotnet/core-sdk#installers-and-binaries)
+- Obtain the latest [build of the .NET Core SDK](https://github.com/dotnet/core-sdk#installers-and-binaries).
- Add a NuGet.Config to your project directory with the following content:
```xml
@@ -23,77 +23,3 @@ If you want to download the latest daily build and use it in a project, then you
Some features, such as new target frameworks, may require prerelease tooling builds for Visual Studio.
These are available in the [Visual Studio Preview](https://www.visualstudio.com/vs/preview/).
-
-## NuGet packages
-
-Daily builds of packages can be found on . This feed may include
-packages that will not be supported in a officially released build.
-
-Commonly referenced packages:
-
-[app-metapackage-myget]: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.AspNetCore.App
-[app-metapackage-myget-badge]: https://img.shields.io/dotnet.myget/dotnet-core/vpre/Microsoft.AspNetCore.App.svg?style=flat-square&label=myget
-
-[metapackage-myget]: https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.AspNetCore
-[metapackage-myget-badge]: https://img.shields.io/dotnet.myget/dotnet-core/vpre/Microsoft.AspNetCore.svg?style=flat-square&label=myget
-
-Package | MyGet
-:---------------------------------|:---------------------------------------------------------
-Microsoft.AspNetCore.App | [![][app-metapackage-myget-badge]][app-metapackage-myget]
-Microsoft.AspNetCore | [![][metapackage-myget-badge]][metapackage-myget]
-
-## Runtime installers
-
-Updated versions of the ASP.NET Core runtime can be installed separately from SDK updates. Runtime-only installers can be downloaded here:
-
-[badge-master]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-win-x64-version-badge.svg
-[win-x64-zip]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-latest-win-x64.zip
-[win-x64-exe]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-latest-win-x64.exe
-[win-x86-zip]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-latest-win-x86.zip
-[win-x86-exe]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-latest-win-x86.exe
-[linux-x64-tar]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-latest-linux-x64.tar.gz
-[linux-arm-tar]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-latest-linux-arm.tar.gz
-[linux-arm64-tar]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-latest-linux-arm64.tar.gz
-[osx-x64-tar]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-latest-osx-x64.tar.gz
-[debian-x64-deb]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-latest-x64.deb
-[redhat-x64-rpm]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-latest-x64.rpm
-[linux-musl-x64-tar]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/master/aspnetcore-runtime-latest-linux-musl-x64.tar.gz
-
-[badge-rel-22]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.2/aspnetcore-runtime-win-x64-version-badge.svg
-[win-x64-zip-rel-22]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.2/aspnetcore-runtime-latest-win-x64.zip
-[win-x64-exe-rel-22]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.2/aspnetcore-runtime-latest-win-x64.exe
-[win-x86-zip-rel-22]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.2/aspnetcore-runtime-latest-win-x86.zip
-[win-x86-exe-rel-22]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.2/aspnetcore-runtime-latest-win-x86.exe
-[linux-x64-tar-rel-22]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.2/aspnetcore-runtime-latest-linux-x64.tar.gz
-[osx-x64-tar-rel-22]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.2/aspnetcore-runtime-latest-osx-x64.tar.gz
-[debian-x64-deb-rel-22]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.2/aspnetcore-runtime-latest-x64.deb
-[redhat-x64-rpm-rel-22]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.2/aspnetcore-runtime-latest-x64.rpm
-[linux-arm-tar-rel-22]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.2/aspnetcore-runtime-latest-linux-arm.tar.gz
-[linux-musl-x64-tar-rel-22]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.2/aspnetcore-runtime-latest-linux-musl-x64.tar.gz
-
-[badge-rel-21]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.1/aspnetcore-runtime-win-x64-version-badge.svg
-[win-x64-zip-rel-21]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.1/aspnetcore-runtime-latest-win-x64.zip
-[win-x64-exe-rel-21]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.1/aspnetcore-runtime-latest-win-x64.exe
-[win-x86-zip-rel-21]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.1/aspnetcore-runtime-latest-win-x86.zip
-[win-x86-exe-rel-21]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.1/aspnetcore-runtime-latest-win-x86.exe
-[linux-x64-tar-rel-21]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.1/aspnetcore-runtime-latest-linux-x64.tar.gz
-[osx-x64-tar-rel-21]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.1/aspnetcore-runtime-latest-osx-x64.tar.gz
-[debian-x64-deb-rel-21]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.1/aspnetcore-runtime-latest-x64.deb
-[redhat-x64-rpm-rel-21]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.1/aspnetcore-runtime-latest-x64.rpm
-[linux-arm-tar-rel-21]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.1/aspnetcore-runtime-latest-linux-arm.tar.gz
-[linux-musl-x64-tar-rel-21]: https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/release/2.1/aspnetcore-runtime-latest-linux-musl-x64.tar.gz
-
-Platform | Latest (master branch) ![][badge-master] | release/2.2 ![][badge-rel-22] | release/2.1 ![][badge-rel-21]
-:---------------------|:----------------------------------------------------------------|:------------------------------------------------------------------------- |:-------------------------------------------------------------------------
-Channel name1 | `master` | `release/2.2` | `release/2.1`
-Windows (x64) | [Installer (exe)][win-x64-exe] [Archive (zip)][win-x64-zip] | [Installer (exe)][win-x64-exe-rel-22] [Archive (zip)][win-x64-zip-rel-22] | [Installer (exe)][win-x64-exe-rel-21] [Archive (zip)][win-x64-zip-rel-21]
-Windows (x86) | [Installer (exe)][win-x86-exe] [Archive (zip)][win-x86-zip] | [Installer (exe)][win-x86-exe-rel-22] [Archive (zip)][win-x86-zip-rel-22] | [Installer (exe)][win-x86-exe-rel-21] [Archive (zip)][win-x86-zip-rel-21]
-macOS (x64) | [Archive (tar.gz)][osx-x64-tar] | [Archive (tar.gz)][osx-x64-tar-rel-22] | [Archive (tar.gz)][osx-x64-tar-rel-21]
-Linux (x64) _(for glibc based OS - most common)_ | [Archive (tar.gz)][linux-x64-tar] | [Archive (tar.gz)][linux-x64-tar-rel-22] | [Archive (tar.gz)][linux-x64-tar-rel-21]
-Linux (x64 - musl) _(for musl based OS, such as Alpine Linux)_ | [Archive (tar.gz)][linux-musl-x64-tar] | [Archive (tar.gz)][linux-musl-x64-tar-rel-22] | [Archive (tar.gz)][linux-musl-x64-tar-rel-21]
-Linux (arm32) | [Archive (tar.gz)][linux-arm-tar] | [Archive (tar.gz)][linux-arm-tar-rel-22] | [Archive (tar.gz)][linux-arm-tar-rel-21]
-Linux (arm64) | [Archive (tar.gz)][linux-arm64-tar] | |
-Debian/Ubuntu (x64) | [Installer (deb)][debian-x64-deb] | [Installer (deb)][debian-x64-deb-rel-22] | [Installer (deb)][debian-x64-deb-rel-21]
-RedHat/Fedora (x64) | [Installer (rpm)][redhat-x64-rpm] | [Installer (rpm)][redhat-x64-rpm-rel-22] | [Installer (rpm)][redhat-x64-rpm-rel-21]
-
-> 1 For use with the `-Channel` argument in [dotnet-install.ps1/sh](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script).
diff --git a/docs/PreparingPatchUpdates.md b/docs/PreparingPatchUpdates.md
index 34813e8162..17f8102539 100644
--- a/docs/PreparingPatchUpdates.md
+++ b/docs/PreparingPatchUpdates.md
@@ -10,32 +10,7 @@ In order to prepare this repo to build a new servicing update, the following cha
+ 8
```
-* Update the package archive baselines. This is used to make sure each build of the package archives we give to Azure only contains new files and does
- not require overwriting existing files. See [src/PackageArchive/ZipManifestGenerator/](/src/PackageArchive/ZipManifestGenerator/README.md) for instructions on how to run this tool.
-
* Update the package baselines. This is used to ensure packages keep a consistent set of dependencies between releases.
See [eng/tools/BaselineGenerator/](/eng/tools/BaselineGenerator/README.md) for instructions on how to run this tool.
-* **For packages with source code in this repo (not a submodule):** Update the list of packages in [eng/PatchConfig.props](/eng/PatchConfig.props) to list which packages should be patching in this release.
-
-* **For packages still building from submodules:** Update the list of repositories which will contain changes in [build/submodules.props](/build/submodules.props).
-
- * `` items represent repos which were released in a previous patch, and will not contain servicing updates in the next patch.
- * `` items represent repos which will produce new packages in this patch.
- * It is usually best to move everything to `` and then iteratively add them back to `` as new repos receive approval to patch.
- * Don't change the `PatchPolicy` attribute. The build system uses this to ensure patching rules are obeyed.
-
-* For each repository still listed as a ``, update the version.props file in that submodule. For example, https://github.com/aspnet/Templating/pull/824
-
- * The version prefix in repos should match the version of ASP.NET Core.
- * Exception: SignalR, which is "1.1", not "2.1".
- * This leaves holes in versioning, which is okay. This may mean you increment the patch value by more than one. Example:
- * EF Core ships patches in 2.1.4 as "2.1.4"
- * EF Core does not ship patches in 2.1.5 or 2.1.6
- * EF Core ships in 2.1.7, therefore, EFCore's version.props file should jump from 2.1.4 to 2.1.7.
-
- ```diff
-
- - 2.1.4
- + 2.1.7
- ```
+* Update the list of packages in [eng/PatchConfig.props](/eng/PatchConfig.props) to list which packages should be patching in this release.
diff --git a/docs/ProjectProperties.md b/docs/ProjectProperties.md
index 98332931b9..fe5bba6baf 100644
--- a/docs/ProjectProperties.md
+++ b/docs/ProjectProperties.md
@@ -5,4 +5,4 @@ In addition to the standard set of MSBuild properties supported by Microsoft.NET
Property name | Meaning
-------------------|--------------------------------------------------------------------------------------------
-IsProductPackage | When set to `true`, the package produced by from project is intended for use by customers. Defaults to `false`, which means the package is intended for internal use only by Microsoft teams.
+IsShippingPackage | When set to `true`, the package produced by from project is intended for use by customers. Defaults to `false`, which means the package is intended for internal use only by Microsoft teams.
diff --git a/docs/ReferenceResolution.md b/docs/ReferenceResolution.md
index e0c3dbf6f4..e34b90a072 100644
--- a/docs/ReferenceResolution.md
+++ b/docs/ReferenceResolution.md
@@ -18,9 +18,10 @@ The requirements that led to this system are:
## Recommendations for writing a .csproj
-* Use ``
-* Do not use ``
-* Only use `` in test projects
+* Use ``.
+* Do not use ``.
+* If you need to use a new package, add it to `eng/Dependencies.props` and `eng/Versions.props`.
+* Only use `` in test projects.
* Name the .csproj file to match the assembly name.
* Run `build.cmd /t:GenerateProjectList` when adding new projects
* Use [eng/tools/BaseLineGenerator/](/eng/tools/BaselineGenerator/README.md) if you need to update baselines.
diff --git a/eng/Dependencies.props b/eng/Dependencies.props
index 5bb5c428db..c667bd4414 100644
--- a/eng/Dependencies.props
+++ b/eng/Dependencies.props
@@ -19,17 +19,35 @@ and are generated based on the last package release.
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
@@ -63,9 +81,9 @@ and are generated based on the last package release.
+
-
@@ -75,27 +93,42 @@ and are generated based on the last package release.
-
-
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -104,41 +137,19 @@ and are generated based on the last package release.
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/eng/PatchConfig.props b/eng/PatchConfig.props
index 976bc15c0f..b1b7e01318 100644
--- a/eng/PatchConfig.props
+++ b/eng/PatchConfig.props
@@ -19,6 +19,14 @@ Later on, this will be checked using this condition:
+ @aspnet/signalr;
+ Microsoft.AspNetCore.AspNetCoreModuleV2;
+ Microsoft.AspNetCore.Authentication.Google;
+ Microsoft.AspNetCore.Http;
+ Microsoft.AspNetCore.Mvc.Core;
+ Microsoft.AspNetCore.Routing;
+ Microsoft.AspNetCore.Server.IIS;
+ java:signalr;
diff --git a/eng/ProjectReferences.props b/eng/ProjectReferences.props
index cfc816fe0f..51da91165a 100644
--- a/eng/ProjectReferences.props
+++ b/eng/ProjectReferences.props
@@ -1,5 +1,5 @@
@@ -20,7 +20,6 @@
-
@@ -46,11 +45,8 @@
-
-
-
@@ -67,6 +63,7 @@
+
@@ -102,6 +99,7 @@
+
@@ -125,5 +123,12 @@
+
+
+
+
+
+
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index c11c8325a8..c98fc8e6e5 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -1,371 +1,375 @@
-
+
https://github.com/aspnet/AspNetCore-Tooling
- 000000
+ bd7fc9ddf67dec0d582168bcd3d1d4681747f81a
-
+
+ https://github.com/aspnet/AspNetCore-Tooling
+ bd7fc9ddf67dec0d582168bcd3d1d4681747f81a
+
+
+ https://github.com/aspnet/AspNetCore-Tooling
+ bd7fc9ddf67dec0d582168bcd3d1d4681747f81a
+
+
+ https://github.com/aspnet/AspNetCore-Tooling
+ bd7fc9ddf67dec0d582168bcd3d1d4681747f81a
+
+
https://github.com/aspnet/EntityFrameworkCore
- 000000
+ 3d1e08eb08789a9dde3ac20851d3c82fdf9272e5
-
+
https://github.com/aspnet/EntityFrameworkCore
- 000000
+ 3d1e08eb08789a9dde3ac20851d3c82fdf9272e5
-
+
https://github.com/aspnet/EntityFrameworkCore
- 000000
+ 3d1e08eb08789a9dde3ac20851d3c82fdf9272e5
-
+
https://github.com/aspnet/EntityFrameworkCore
- 000000
+ 3d1e08eb08789a9dde3ac20851d3c82fdf9272e5
-
+
https://github.com/aspnet/EntityFrameworkCore
- 000000
+ 3d1e08eb08789a9dde3ac20851d3c82fdf9272e5
-
+
https://github.com/aspnet/EntityFrameworkCore
- 000000
+ 3d1e08eb08789a9dde3ac20851d3c82fdf9272e5
-
+
https://github.com/aspnet/EntityFrameworkCore
- 000000
+ 3d1e08eb08789a9dde3ac20851d3c82fdf9272e5
-
- https://github.com/aspnet/EntityFrameworkCore
- 000000
-
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
- https://github.com/aspnet/Extensions
- 000000
-
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/corefx
- 000000
+ 351ca391579740ae8af8a5405cffa16d152ad6b2
-
+
https://github.com/dotnet/core-setup
- 000000
+ 63a01b08e5d1d1a6b8544f598b3d3bda76e6e424
-
+
https://github.com/dotnet/core-setup
- 000000
+ 63a01b08e5d1d1a6b8544f598b3d3bda76e6e424
-
+
https://github.com/dotnet/core-setup
- 000000
+ 63a01b08e5d1d1a6b8544f598b3d3bda76e6e424
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
-
+
https://github.com/aspnet/Extensions
- 000000
+ a58a80bdf5ad971167f73e501661131c3e34a901
diff --git a/eng/Versions.props b/eng/Versions.props
index fd7bd4c55c..33bb13d0bc 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -1,3 +1,4 @@
+
- 3.0.0-preview-27219-3
- 3.0.0-preview-27219-3
- 3.0.0-preview-27219-3
-
+ 3.0.0-preview-27324-5
+ 3.0.0-preview-27324-5
+ 3.0.0-preview-27324-5
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.7.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 1.7.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
- 4.6.0-preview.18619.1
-
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.7.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 1.7.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
+ 4.6.0-preview.19073.11
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
- 3.0.0-preview.19059.5
-
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
+ 3.0.0-preview.19078.2
- 3.0.0-preview.18604.3
- 3.0.0-preview.18604.3
- 3.0.0-preview.18604.3
- 3.0.0-preview.18604.3
- 3.0.0-preview.18604.3
- 3.0.0-preview.18604.3
- 3.0.0-preview.18604.3
- 3.0.0-preview.18604.3
-
+ 3.0.0-preview.19074.3
+ 3.0.0-preview.19074.3
+ 3.0.0-preview.19074.3
+ 3.0.0-preview.19074.3
+ 3.0.0-preview.19074.3
+ 3.0.0-preview.19074.3
+ 3.0.0-preview.19074.3
- 3.0.0-preview-19064-09
+ 3.0.0-preview-19074-06
+ 3.0.0-preview-19074-06
+ 3.0.0-preview-19074-06
+ 3.0.0-preview-19074-06
-
$(KoreBuildVersion)
- 3.0.0-build-20190110.4
+ 3.0.0-build-20190130.1
1.0.0-alpha-004
15.9.0
-
4.5.0
+ 4.4.0
4.5.2
- 4.5.2
4.3.2
-
+ 4.5.2
1.10.0
5.2.6
-
2.3.2
15.8.166
@@ -147,7 +143,13 @@
1.4.0
5.3.0
8.1.4
-
+
+ 0.8.0-preview-20190125.1
+
+ 0.8.0-preview1-20181126.4
+
+ 2.1.1
+ 2.2.0
0.9.9
0.10.13
@@ -159,6 +161,7 @@
3.1.0
1.7.3.4
4.10.0
+ 0.10.1
1.0.2
12.0.1
3.12.1
@@ -178,5 +181,4 @@
2.4.0
2.4.0
-
diff --git a/eng/Workarounds.targets b/eng/Workarounds.targets
new file mode 100644
index 0000000000..9b1af1b35f
--- /dev/null
+++ b/eng/Workarounds.targets
@@ -0,0 +1,3 @@
+
+
+
diff --git a/eng/scripts/AddAllProjectRefsToSolution.ps1 b/eng/scripts/AddAllProjectRefsToSolution.ps1
new file mode 100644
index 0000000000..274c098fba
--- /dev/null
+++ b/eng/scripts/AddAllProjectRefsToSolution.ps1
@@ -0,0 +1,60 @@
+<#
+.SYNOPSIS
+This adds the complete closure of project references to a .sln file
+
+.EXAMPLE
+Let's say you have a folder of projects in src/Banana/, and a file src/Banana/Banana.sln.
+To traverse the ProjectReference graph to add all dependency projects, run this script:
+
+ ./eng/scripts/AddAllProjectRefsToSolution.ps1 -WorkingDir ./src/Banana/
+
+.EXAMPLE
+If src/Banana/ has multiple .sln files, use the -sln parameter.
+
+ ./eng/scripts/AddAllProjectRefsToSolution.ps1 -WorkingDir ./src/Banana/ -SolutionFile src/Banana/Solution1.sln
+#>
+[CmdletBinding(PositionalBinding = $false)]
+param(
+ [string]$WorkingDir,
+ [Alias('sln')]
+ [string]$SolutionFile
+)
+
+$ErrorActionPreference = 'Stop'
+$repoRoot = Resolve-Path "$PSScriptRoot/../../"
+$listFile = New-TemporaryFile
+
+if (-not $WorkingDir) {
+ $WorkingDir = Get-Location
+}
+
+Push-Location $WorkingDir
+try {
+ if (-not $SolutionFile) {
+
+ $slnCount = Get-ChildItem *.sln | Measure
+
+ if ($slnCount.count -eq 0) {
+ Write-Error "Could not find a solution in this directory. Specify one with -sln "
+ exit 1
+ }
+ if ($slnCount.count -gt 1) {
+ Write-Error "Multiple solutions found in this directory. Specify which one to modify with -sln "
+ exit 1
+ }
+ $SolutionFile = Get-ChildItem *.sln | select -first 1
+ }
+
+ & "$repoRoot\build.ps1" -projects "$(Get-Location)\**\*.*proj" /t:ShowProjectClosure "/p:ProjectsReferencedOutFile=$listFile"
+
+ foreach ($proj in (Get-Content $listFile)) {
+ & dotnet sln $SolutionFile add $proj
+ if ($lastexitcode -ne 0) {
+ Write-Warning "Failed to add $proj to $SolutionFile"
+ }
+ }
+}
+finally {
+ Pop-Location
+ rm $listFile -ea ignore
+}
diff --git a/eng/scripts/CodeCheck.ps1 b/eng/scripts/CodeCheck.ps1
index f9db3a159b..0292192844 100644
--- a/eng/scripts/CodeCheck.ps1
+++ b/eng/scripts/CodeCheck.ps1
@@ -26,7 +26,7 @@ try {
#
if ($ci) {
- & $repoRoot/build.cmd /t:InstallDotNet
+ & $repoRoot/build.ps1 -ci /t:InstallDotNet
}
Write-Host "Checking that solutions are up to date"
@@ -56,13 +56,9 @@ try {
Write-Host "Re-running code generation"
- Write-Host "Re-generating ProjectReference.props"
+ Write-Host "Re-generating project lists"
Invoke-Block {
- [string[]] $generateArgs = @()
- if ($ci) {
- $generateArgs += '-ci'
- }
- & $repoRoot/build.cmd /t:GenerateProjectList @generateArgs
+ & $PSScriptRoot\GenerateProjectList.ps1 -ci:$ci
}
Write-Host "Re-generating package baselines"
@@ -90,7 +86,6 @@ finally {
Write-Host ""
foreach ($err in $errors) {
-
Write-Host -f Red "error : $err"
}
diff --git a/eng/scripts/GenerateProjectList.ps1 b/eng/scripts/GenerateProjectList.ps1
new file mode 100644
index 0000000000..53cbe58138
--- /dev/null
+++ b/eng/scripts/GenerateProjectList.ps1
@@ -0,0 +1,8 @@
+param(
+ [switch]$ci
+)
+$ErrorActionPreference = 'stop'
+
+$repoRoot = Resolve-Path "$PSScriptRoot/../.."
+
+& "$repoRoot\build.ps1" -ci:$ci -all /t:GenerateProjectList
diff --git a/eng/scripts/KillProcesses.ps1 b/eng/scripts/KillProcesses.ps1
new file mode 100644
index 0000000000..29b3657281
--- /dev/null
+++ b/eng/scripts/KillProcesses.ps1
@@ -0,0 +1,16 @@
+$ErrorActionPreference = 'Continue'
+
+taskkill /T /F /IM dotnet.exe
+taskkill /T /F /IM testhost.exe
+taskkill /T /F /IM iisexpress.exe
+taskkill /T /F /IM iisexpresstray.exe
+taskkill /T /F /IM w3wp.exe
+taskkill /T /F /IM msbuild.exe
+taskkill /T /F /IM vbcscompiler.exe
+taskkill /T /F /IM git.exe
+taskkill /T /F /IM vctip.exe
+taskkill /T /F /IM chrome.exe
+taskkill /T /F /IM h2spec.exe
+iisreset /restart
+
+exit 0
diff --git a/eng/scripts/KillProcesses.sh b/eng/scripts/KillProcesses.sh
new file mode 100755
index 0000000000..f52511739b
--- /dev/null
+++ b/eng/scripts/KillProcesses.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+pkill dotnet || true
+exit 0
diff --git a/eng/scripts/cibuild.cmd b/eng/scripts/cibuild.cmd
index b1048279a3..1e7d47b39e 100644
--- a/eng/scripts/cibuild.cmd
+++ b/eng/scripts/cibuild.cmd
@@ -1,3 +1,3 @@
@ECHO OFF
SET RepoRoot=%~dp0..\..
-%RepoRoot%\build.cmd -ci -all -restore -build -pack -test -sign %*
+%RepoRoot%\build.cmd -ci -all -pack -sign %*
diff --git a/eng/scripts/cibuild.sh b/eng/scripts/cibuild.sh
index 6eab1faa2f..d5837c0908 100755
--- a/eng/scripts/cibuild.sh
+++ b/eng/scripts/cibuild.sh
@@ -2,6 +2,8 @@
set -euo pipefail
+export PATH="$PATH:$HOME/nginxinstall/sbin/"
+
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
repo_root="$DIR/../.."
-"$repo_root/build.sh" --ci --all --restore --build --pack --test "$@"
+"$repo_root/build.sh" --ci --all --pack "$@"
diff --git a/eng/scripts/install-nginx-linux.sh b/eng/scripts/install-nginx-linux.sh
new file mode 100755
index 0000000000..a245308a0c
--- /dev/null
+++ b/eng/scripts/install-nginx-linux.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+curl -sSL http://nginx.org/download/nginx-1.14.2.tar.gz | tar zxfv - -C /tmp && cd /tmp/nginx-1.14.2/
+./configure --prefix=$HOME/nginxinstall --with-http_ssl_module
+make
+make install
diff --git a/eng/scripts/install-nginx-mac.sh b/eng/scripts/install-nginx-mac.sh
new file mode 100755
index 0000000000..b44bd5d928
--- /dev/null
+++ b/eng/scripts/install-nginx-mac.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+
+brew update
+brew install openssl nginx
diff --git a/eng/signcheck.exclusions.txt b/eng/signcheck.exclusions.txt
index acbdca8318..93f17f63f5 100644
--- a/eng/signcheck.exclusions.txt
+++ b/eng/signcheck.exclusions.txt
@@ -1,6 +1,8 @@
-content/sdk/*/AppHostTemplate/apphost.exe;AspNetCoreRuntime.*.nupkg; Exclude the apphost because this is expected to be code-signed by customers after the SDK modifies it.
-content/*.js;Microsoft.DotNet.Web.Spa.ProjectTemplates.*.nupkg; Exclude JavaScript files from codesigning in project templates
-content/*.js;Microsoft.DotNet.Web.ProjectTemplates.*.nupkg; Exclude JavaScript files from codesigning in project templates
-Templates/*.js;Microsoft.VisualStudio.Web.CodeGenerators.Mvc.*.nupkg; Exclude JavaScript files from codesigning in code generators
-*.js;signalr-*-javadoc.jar; Exclude JavaScript files in the generated javadocs
-*.binlog; Exclude msbuild log files
+*/AppHostTemplate/apphost.exe;AspNetCoreRuntime.*.nupkg; Exclude the apphost because this is expected to be code-signed by customers after the SDK modifies it.
+*/runtime.*.microsoft.netcore.dotnetapphost/*/apphost.exe;Microsoft.AspNetCore.AzureAppServices.SiteExtension.*.nupkg; Exclude the apphost because this is expected to be code-signed by customers after the SDK modifies it.
+*.js;; Exclude all JavaScript files from codesigning because we don't expect these to run on Windows Script Host
+*.binlog;; Exclude msbuild log files
+*.symbols.nupkg;; Exclude NuGet symbols packages. These are not shipped to customers and should not be code signed.
+;*.symbols.nupkg; Exclude everything inside NuGet symbols packages. These are not shipped to customers and should not be code signed.
+;runtime.osx-x64.Microsoft.AspNetCore.App.*.nupkg; Exclude the contents of the MacOS runtime package because MacOS only supports codesigning for MacOS native binaries and apps
+;runtime.linux-*.Microsoft.AspNetCore.App.*.nupkg; Exclude the contents of the Linux runtime packages because Linux doesn't support validating authenticode signatures
diff --git a/eng/targets/CSharp.Common.props b/eng/targets/CSharp.Common.props
index 8e774beb44..b8849afad7 100644
--- a/eng/targets/CSharp.Common.props
+++ b/eng/targets/CSharp.Common.props
@@ -2,17 +2,14 @@
7.3
-
-
- SHA256
-
+
-
+
diff --git a/eng/targets/Npm.Common.targets b/eng/targets/Npm.Common.targets
index 2bbed5f9be..79f975532f 100644
--- a/eng/targets/Npm.Common.targets
+++ b/eng/targets/Npm.Common.targets
@@ -69,16 +69,4 @@
-
-
-
- NpmPackage
- $(PackageId)
- $(PackageVersion)
-
-
-
-
-
-
diff --git a/eng/targets/Packaging.targets b/eng/targets/Packaging.targets
index a49a65b988..5e5b8014d8 100644
--- a/eng/targets/Packaging.targets
+++ b/eng/targets/Packaging.targets
@@ -7,34 +7,14 @@
See $(RepositoryRoot)eng\tools\BaselineGenerator\README.md for instructions on updating this baseline." />
-
-
-
-
- $(PackageOutputPath)$(PackageId).$(PackageVersion).nupkg
-
-
-
-
- NuGetPackage
- $(PackageId)
- $(PackageVersion)
- $(RepositoryRoot)
- true
-
-
-
-
- <_ProjectPathWithVersion Include="$(MSBuildProjectFullPath)">
- $(MSBuildProjectName)
+ <_ProjectPathWithVersion Include="$(MSBuildProjectFullPath)" Condition="'$(IsPackable)' == 'true'">
+ $(PackageId)
$(PackageVersion)
+ $(PackageId.Replace('.',''))PackageVersion
diff --git a/eng/targets/ResolveIisReferences.targets b/eng/targets/ResolveIisReferences.targets
index ba0ae8fc46..76c17c8c80 100644
--- a/eng/targets/ResolveIisReferences.targets
+++ b/eng/targets/ResolveIisReferences.targets
@@ -13,6 +13,7 @@ with the right MSBuild incantations to get output copied to the right place.
Platform=%(Platform)
+ Platform=Win32
%(Platform)\%(HandlerPath)\
diff --git a/eng/targets/ResolveReferences.targets b/eng/targets/ResolveReferences.targets
index 03d40146ca..149ec43822 100644
--- a/eng/targets/ResolveReferences.targets
+++ b/eng/targets/ResolveReferences.targets
@@ -52,10 +52,9 @@
<_ImplicitPackageReference Include="@(PackageReference->WithMetadataValue('IsImplicitlyDefined', 'true'))" />
- <_ExplicitPackageReference Include="@(PackageReference)" Exclude="@(_ImplicitPackageReference)" />
-
- <_ExplicitPackageReference Remove="Internal.AspNetCore.Sdk" />
- <_ExplicitPackageReference Remove="Microsoft.NETFramework.ReferenceAssemblies" />
+ <_AllowedExplicitPackageReference Include="@(PackageReference->WithMetadataValue('AllowExplicitReference', 'true'))" />
+ <_AllowedExplicitPackageReference Include="FSharp.Core" Condition="'$(MSBuildProjectExtension)' == '.fsproj'" />
+ <_ExplicitPackageReference Include="@(PackageReference)" Exclude="@(_ImplicitPackageReference);@(_AllowedExplicitPackageReference)" />
<_UnusedProjectReferenceProvider Include="@(ProjectReferenceProvider)" Exclude="@(Reference)" />
@@ -133,9 +132,8 @@
<_ImplicitPackageReference Remove="@(_ImplicitPackageReference)" />
-
+
<_ExplicitPackageReference Remove="@(_ExplicitPackageReference)" />
@@ -146,7 +144,7 @@
+ Text="Could not resolve this reference. Could not locate the package or project for "%(Reference.Identity)". Did you update baselines and dependencies lists? See docs/ReferenceResolution.md for more details." />
@@ -171,4 +169,30 @@
+
+
+
+ <_CustomCollectProjectReferenceDependsOn Condition="'$(TargetFramework)' != ''">ResolveProjectReferences
+
+
+
+ <_TargetFrameworks Include="$(TargetFrameworks)" />
+
+
+
+
+
+
+
+
diff --git a/eng/targets/RuntimeIdentifiers.props b/eng/targets/RuntimeIdentifiers.props
deleted file mode 100644
index b38ec14b94..0000000000
--- a/eng/targets/RuntimeIdentifiers.props
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
- win-x64
- osx-x64
- linux-x64
-
- $(SharedFxRid.Substring($([MSBuild]::Add($(SharedFxRid.LastIndexOf('-')), 1))))
-
-
- win-x64
- osx-x64
- linux-x64
-
-
-
- win-x64;
- win-x86;
- win-arm;
- osx-x64;
- linux-musl-x64;
- linux-x64;
- linux-arm;
- linux-arm64
-
-
-
diff --git a/eng/targets/Wix.Common.targets b/eng/targets/Wix.Common.targets
index 7ff9e39fd6..4c6d15a790 100644
--- a/eng/targets/Wix.Common.targets
+++ b/eng/targets/Wix.Common.targets
@@ -31,7 +31,6 @@
en-US
$(Culture)
$(Platform)
- $(Platform)
$(OutputPath)
$(DefineConstants);BinPath=$(OutputPath)$(Culture)\
$(WixVariables);$(DefineConstants)
diff --git a/eng/tools/XplatPackageSigner/XplatPackageSigner.proj b/eng/tools/XplatPackageSigner/XplatPackageSigner.proj
new file mode 100644
index 0000000000..bde2dc9a28
--- /dev/null
+++ b/eng/tools/XplatPackageSigner/XplatPackageSigner.proj
@@ -0,0 +1,38 @@
+
+
+
+ $([MSBuild]::ValueOrDefault($(SignType),'real'))
+
+
+
+
+
+
+
+ $([MSBuild]::NormalizeDirectory($(DirectoryToSign)))
+ $(RepositoryRoot)obj\$(MSBuildProjectName)\
+
+
+
+
+
+ NuGet
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eng/tools/XplatPackageSigner/sign-packages.cmd b/eng/tools/XplatPackageSigner/sign-packages.cmd
new file mode 100644
index 0000000000..a46d10192f
--- /dev/null
+++ b/eng/tools/XplatPackageSigner/sign-packages.cmd
@@ -0,0 +1,15 @@
+@ECHO OFF
+
+SET DirToSign=%1
+
+IF "%DirToSign%"=="" (
+ echo Error^: Expected argument ^
+ echo Usage^: sign-packages.cmd ^
+
+ exit /b 1
+)
+
+SET RepoRoot=%~dp0..\..\..
+SET Project=%~dp0\XplatPackageSigner.proj
+
+%RepoRoot%\build.cmd -NoRestore -projects %project% /p:DirectoryToSign=%DirToSign% /bl:%RepoRoot%\artifacts\logs\XplatSign.binlog
diff --git a/global.json b/global.json
index 93b9880dae..ad876808c1 100644
--- a/global.json
+++ b/global.json
@@ -1,8 +1,8 @@
{
- "sdk": {
- "version": "3.0.100-preview-009750"
- },
- "msbuild-sdks": {
- "Internal.AspNetCore.Sdk": "3.0.0-build-20190110.4"
- }
+ "sdk": {
+ "version": "3.0.100-preview-009750"
+ },
+ "msbuild-sdks": {
+ "Internal.AspNetCore.Sdk": "3.0.0-build-20190130.1"
+ }
}
diff --git a/korebuild-lock.txt b/korebuild-lock.txt
index 7800fa1cf7..c5201be5e4 100644
--- a/korebuild-lock.txt
+++ b/korebuild-lock.txt
@@ -1,2 +1,2 @@
-version:3.0.0-build-20190110.4
-commithash:356f6ce74815523dfda61e3da6e652ad52f536be
+version:3.0.0-build-20190130.1
+commithash:3b24877488f6bbff779aa3bd66fcffb4a6c04daf
diff --git a/restore.cmd b/restore.cmd
index e6275ff5d1..45e272ec1f 100644
--- a/restore.cmd
+++ b/restore.cmd
@@ -1,2 +1,2 @@
@ECHO OFF
-PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' -all -restore:$true -build:$False %*; exit $LASTEXITCODE"
+PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' -all -nobuild -restore %*; exit $LASTEXITCODE"
diff --git a/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenStore.cs b/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenStore.cs
index 95e6d6f1bc..b0fdd5cd93 100644
--- a/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenStore.cs
+++ b/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenStore.cs
@@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.Antiforgery.Internal
// We want to delay reading the form as much as possible, for example in case of large file uploads,
// request token could be part of the header.
- StringValues requestToken;
+ StringValues requestToken = default;
if (_options.HeaderName != null)
{
requestToken = httpContext.Request.Headers[_options.HeaderName];
diff --git a/src/AuthSamples/.gitignore b/src/AuthSamples/.gitignore
deleted file mode 100644
index d15bf87a35..0000000000
--- a/src/AuthSamples/.gitignore
+++ /dev/null
@@ -1,38 +0,0 @@
-[Oo]bj/
-[Bb]in/
-TestResults/
-.nuget/
-*.sln.ide/
-_ReSharper.*/
-.idea/
-packages/
-artifacts/
-PublishProfiles/
-.vs/
-.vscode/
-*.user
-*.suo
-*.cache
-*.docstates
-_ReSharper.*
-nuget.exe
-*net45.csproj
-*net451.csproj
-*k10.csproj
-*.psess
-*.vsp
-*.pidb
-*.userprefs
-*DS_Store
-*.ncrunchsolution
-*.*sdf
-*.ipch
-*.swp
-*~
-.build/
-.testPublish/
-launchSettings.json
-BenchmarkDotNet.Artifacts/
-BDN.Generated/
-binaries/
-global.json
diff --git a/src/AuthSamples/AuthSamples.sln b/src/AuthSamples/AuthSamples.sln
deleted file mode 100644
index 063f6b6aa4..0000000000
--- a/src/AuthSamples/AuthSamples.sln
+++ /dev/null
@@ -1,146 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.27130.2003
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{CA4538F5-9DA8-4139-B891-A13279889F79}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{DA474CFD-7419-4747-A583-CCDC1FF71EB5}"
- ProjectSection(SolutionItems) = preProject
- build\common.props = build\common.props
- build\dependencies.props = build\dependencies.props
- EndProjectSection
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cookies", "samples\Cookies\Cookies.csproj", "{5FA7ABB3-5285-4101-B25E-0C8178ECDA50}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClaimsTransformation", "samples\ClaimsTransformation\ClaimsTransformation.csproj", "{526BE3AE-3DD3-4AB6-BC81-AC34ED735482}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{15E42EAC-5CBB-49EC-91FB-53743882CF2B}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuthSamples.FunctionalTests", "test\AuthSamples.FunctionalTests\AuthSamples.FunctionalTests.csproj", "{B5C26BE6-655E-4D7F-B756-F286750EF172}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PathSchemeSelection", "samples\PathSchemeSelection\PathSchemeSelection.csproj", "{4E91BD2A-616F-45EE-9647-2F1608D17FB9}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Identity.ExternalClaims", "samples\Identity.ExternalClaims\Identity.ExternalClaims.csproj", "{D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamicSchemes", "samples\DynamicSchemes\DynamicSchemes.csproj", "{F2F7A64C-870C-40C9-B5FC-F8952F1572B3}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CustomPolicyProvider", "samples\CustomPolicyProvider\CustomPolicyProvider.csproj", "{70299871-8FF5-4521-AD56-48BB6E07BA13}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StaticFilesAuth", "samples\StaticFilesAuth\StaticFilesAuth.csproj", "{0F013930-E66F-4F8B-95BE-CDFB417ACE3E}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|Any CPU = Release|Any CPU
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5FA7ABB3-5285-4101-B25E-0C8178ECDA50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5FA7ABB3-5285-4101-B25E-0C8178ECDA50}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5FA7ABB3-5285-4101-B25E-0C8178ECDA50}.Debug|x64.ActiveCfg = Debug|Any CPU
- {5FA7ABB3-5285-4101-B25E-0C8178ECDA50}.Debug|x86.ActiveCfg = Debug|Any CPU
- {5FA7ABB3-5285-4101-B25E-0C8178ECDA50}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5FA7ABB3-5285-4101-B25E-0C8178ECDA50}.Release|Any CPU.Build.0 = Release|Any CPU
- {5FA7ABB3-5285-4101-B25E-0C8178ECDA50}.Release|x64.ActiveCfg = Release|Any CPU
- {5FA7ABB3-5285-4101-B25E-0C8178ECDA50}.Release|x86.ActiveCfg = Release|Any CPU
- {526BE3AE-3DD3-4AB6-BC81-AC34ED735482}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {526BE3AE-3DD3-4AB6-BC81-AC34ED735482}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {526BE3AE-3DD3-4AB6-BC81-AC34ED735482}.Debug|x64.ActiveCfg = Debug|Any CPU
- {526BE3AE-3DD3-4AB6-BC81-AC34ED735482}.Debug|x86.ActiveCfg = Debug|Any CPU
- {526BE3AE-3DD3-4AB6-BC81-AC34ED735482}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {526BE3AE-3DD3-4AB6-BC81-AC34ED735482}.Release|Any CPU.Build.0 = Release|Any CPU
- {526BE3AE-3DD3-4AB6-BC81-AC34ED735482}.Release|x64.ActiveCfg = Release|Any CPU
- {526BE3AE-3DD3-4AB6-BC81-AC34ED735482}.Release|x86.ActiveCfg = Release|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|x64.Build.0 = Debug|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|x86.Build.0 = Debug|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|Any CPU.Build.0 = Release|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|x64.ActiveCfg = Release|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|x64.Build.0 = Release|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|x86.ActiveCfg = Release|Any CPU
- {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|x86.Build.0 = Release|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Debug|x64.ActiveCfg = Debug|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Debug|x64.Build.0 = Debug|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Debug|x86.Build.0 = Debug|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Release|Any CPU.Build.0 = Release|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Release|x64.ActiveCfg = Release|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Release|x64.Build.0 = Release|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Release|x86.ActiveCfg = Release|Any CPU
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9}.Release|x86.Build.0 = Release|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Debug|x64.ActiveCfg = Debug|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Debug|x64.Build.0 = Debug|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Debug|x86.ActiveCfg = Debug|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Debug|x86.Build.0 = Debug|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Release|Any CPU.Build.0 = Release|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Release|x64.ActiveCfg = Release|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Release|x64.Build.0 = Release|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Release|x86.ActiveCfg = Release|Any CPU
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28}.Release|x86.Build.0 = Release|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Debug|x64.ActiveCfg = Debug|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Debug|x64.Build.0 = Debug|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Debug|x86.ActiveCfg = Debug|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Debug|x86.Build.0 = Debug|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Release|Any CPU.Build.0 = Release|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Release|x64.ActiveCfg = Release|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Release|x64.Build.0 = Release|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Release|x86.ActiveCfg = Release|Any CPU
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3}.Release|x86.Build.0 = Release|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Debug|x64.ActiveCfg = Debug|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Debug|x64.Build.0 = Debug|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Debug|x86.ActiveCfg = Debug|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Debug|x86.Build.0 = Debug|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Release|Any CPU.Build.0 = Release|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Release|x64.ActiveCfg = Release|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Release|x64.Build.0 = Release|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Release|x86.ActiveCfg = Release|Any CPU
- {70299871-8FF5-4521-AD56-48BB6E07BA13}.Release|x86.Build.0 = Release|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Debug|x64.ActiveCfg = Debug|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Debug|x64.Build.0 = Debug|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Debug|x86.Build.0 = Debug|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Release|Any CPU.Build.0 = Release|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Release|x64.ActiveCfg = Release|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Release|x64.Build.0 = Release|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Release|x86.ActiveCfg = Release|Any CPU
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E}.Release|x86.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {5FA7ABB3-5285-4101-B25E-0C8178ECDA50} = {CA4538F5-9DA8-4139-B891-A13279889F79}
- {526BE3AE-3DD3-4AB6-BC81-AC34ED735482} = {CA4538F5-9DA8-4139-B891-A13279889F79}
- {B5C26BE6-655E-4D7F-B756-F286750EF172} = {15E42EAC-5CBB-49EC-91FB-53743882CF2B}
- {4E91BD2A-616F-45EE-9647-2F1608D17FB9} = {CA4538F5-9DA8-4139-B891-A13279889F79}
- {D8804E7A-BD7A-4E4B-ACA7-822A37A81B28} = {CA4538F5-9DA8-4139-B891-A13279889F79}
- {F2F7A64C-870C-40C9-B5FC-F8952F1572B3} = {CA4538F5-9DA8-4139-B891-A13279889F79}
- {70299871-8FF5-4521-AD56-48BB6E07BA13} = {CA4538F5-9DA8-4139-B891-A13279889F79}
- {0F013930-E66F-4F8B-95BE-CDFB417ACE3E} = {CA4538F5-9DA8-4139-B891-A13279889F79}
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {39E3AF62-B1FD-4156-92AA-F4FA99B5AD89}
- EndGlobalSection
-EndGlobal
diff --git a/src/AuthSamples/Directory.Build.props b/src/AuthSamples/Directory.Build.props
deleted file mode 100644
index 7a5b31911d..0000000000
--- a/src/AuthSamples/Directory.Build.props
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
- Microsoft ASP.NET Core
- https://github.com/aspnet/AspNetCore
- git
- $(MSBuildThisFileDirectory)
- $(NoWarn);NU1605
-
-
-
-
-
-
-
diff --git a/src/AuthSamples/Directory.Build.targets b/src/AuthSamples/Directory.Build.targets
deleted file mode 100644
index 7a09b207eb..0000000000
--- a/src/AuthSamples/Directory.Build.targets
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- $(MicrosoftNETCoreAppPackageVersion)
-
-
diff --git a/src/AuthSamples/NuGetPackageVerifier.json b/src/AuthSamples/NuGetPackageVerifier.json
deleted file mode 100644
index 22ef3c09c0..0000000000
--- a/src/AuthSamples/NuGetPackageVerifier.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "Default": {
- "rules": [
- "DefaultCompositeRule"
- ]
- }
-}
diff --git a/src/AuthSamples/README.md b/src/AuthSamples/README.md
deleted file mode 100644
index f147a95edd..0000000000
--- a/src/AuthSamples/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-AuthSamples
-=================
-
-This repo contains ASP.NET Core samples for Authentication, Authorization, Identity, etc..
-
-This project is part of ASP.NET Core. You can find samples, documentation and getting started instructions for ASP.NET Core at the [Home](https://github.com/aspnet/home) repo.
-
-## Building from source
-
-To run a complete build on command line only, execute `build.cmd` or `build.sh` without arguments.
-
-Before opening this project in Visual Studio or VS Code, execute `build.cmd /t:Restore` (Windows) or `./build.sh /t:Restore` (Linux/macOS).
-This will execute only the part of the build script that downloads and initializes a few required build tools and packages.
-
-See [developer documentation](https://github.com/aspnet/Home/wiki) for more details.
\ No newline at end of file
diff --git a/src/AuthSamples/build/dependencies.props b/src/AuthSamples/build/dependencies.props
deleted file mode 100644
index 8212c5b564..0000000000
--- a/src/AuthSamples/build/dependencies.props
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
- $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
-
-
- 0.9.9
- 3.0.0-alpha1-20181031.6
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-a-alpha1-authz-middleware-16949
- 3.0.0-a-alpha1-authz-middleware-16949
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-alpha1-10772
- 3.0.0-preview-181106-14
- 3.0.0-alpha1-10706
- 3.0.0-alpha1-10706
- 3.0.0-alpha1-10706
- 3.0.0-preview-181106-14
- 3.0.0-preview-181106-14
- 3.0.0-preview-181106-14
- 3.0.0-preview-181106-14
- 3.0.0-preview-181106-14
- 3.0.0-preview-181106-14
- 3.0.0-preview1-26907-05
- 3.0.0-preview.19053.2
- 15.9.0
- 0.10.0
- 2.3.1
- 2.4.0
-
-
-
diff --git a/src/AuthSamples/build/sources.props b/src/AuthSamples/build/sources.props
deleted file mode 100644
index 9215df9751..0000000000
--- a/src/AuthSamples/build/sources.props
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
- $(DotNetRestoreSources)
-
- $(RestoreSources);
- https://dotnet.myget.org/F/dotnet-core/api/v3/index.json;
- https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json;
- https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json;
-
-
- $(RestoreSources);
- https://api.nuget.org/v3/index.json;
-
-
-
diff --git a/src/AuthSamples/samples/ClaimsTransformation/ClaimsTransformation.csproj b/src/AuthSamples/samples/ClaimsTransformation/ClaimsTransformation.csproj
deleted file mode 100644
index 4d5a7f2ddd..0000000000
--- a/src/AuthSamples/samples/ClaimsTransformation/ClaimsTransformation.csproj
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
- false
- netcoreapp3.0
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/AuthSamples/samples/Cookies/Cookies.csproj b/src/AuthSamples/samples/Cookies/Cookies.csproj
deleted file mode 100644
index 4d5a7f2ddd..0000000000
--- a/src/AuthSamples/samples/Cookies/Cookies.csproj
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
- false
- netcoreapp3.0
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/CustomPolicyProvider.csproj b/src/AuthSamples/samples/CustomPolicyProvider/CustomPolicyProvider.csproj
deleted file mode 100644
index f6b155cca3..0000000000
--- a/src/AuthSamples/samples/CustomPolicyProvider/CustomPolicyProvider.csproj
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
- netcoreapp3.0
-
-
-
-
-
-
-
-
-
-
diff --git a/src/AuthSamples/samples/DynamicSchemes/DynamicSchemes.csproj b/src/AuthSamples/samples/DynamicSchemes/DynamicSchemes.csproj
deleted file mode 100644
index f7e8d9fc5a..0000000000
--- a/src/AuthSamples/samples/DynamicSchemes/DynamicSchemes.csproj
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
- netcoreapp3.0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Identity.ExternalClaims.csproj b/src/AuthSamples/samples/Identity.ExternalClaims/Identity.ExternalClaims.csproj
deleted file mode 100644
index 4101262cc5..0000000000
--- a/src/AuthSamples/samples/Identity.ExternalClaims/Identity.ExternalClaims.csproj
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
- netcoreapp3.0
- aspnet-Identity.ExternalClaims-E95BE154-CB1B-4633-A2E0-B2DF12FE8BD3
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/AuthSamples/samples/PathSchemeSelection/PathSchemeSelection.csproj b/src/AuthSamples/samples/PathSchemeSelection/PathSchemeSelection.csproj
deleted file mode 100644
index d788a9bdd2..0000000000
--- a/src/AuthSamples/samples/PathSchemeSelection/PathSchemeSelection.csproj
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
- false
- netcoreapp3.0
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/AuthSamples/test/AuthSamples.FunctionalTests/AuthSamples.FunctionalTests.csproj b/src/AuthSamples/test/AuthSamples.FunctionalTests/AuthSamples.FunctionalTests.csproj
deleted file mode 100644
index 540b771a93..0000000000
--- a/src/AuthSamples/test/AuthSamples.FunctionalTests/AuthSamples.FunctionalTests.csproj
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
- netcoreapp3.0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADDefaults.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADDefaults.cs
index eb0d5f26fa..a344514155 100644
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADDefaults.cs
+++ b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADDefaults.cs
@@ -1,4 +1,4 @@
-// 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.using Microsoft.AspNetCore.Authorization;
@@ -13,29 +13,29 @@ namespace Microsoft.AspNetCore.Authentication.AzureAD.UI
/// The scheme name for Open ID Connect when using
/// .
///
- public static readonly string OpenIdScheme = "AzureADOpenID";
+ public const string OpenIdScheme = "AzureADOpenID";
///
/// The scheme name for cookies when using
/// .
///
- public static readonly string CookieScheme = "AzureADCookie";
+ public const string CookieScheme = "AzureADCookie";
///
/// The default scheme for Azure Active Directory Bearer.
///
- public static readonly string BearerAuthenticationScheme = "AzureADBearer";
+ public const string BearerAuthenticationScheme = "AzureADBearer";
///
/// The scheme name for JWT Bearer when using
/// .
///
- public static readonly string JwtBearerAuthenticationScheme = "AzureADJwtBearer";
+ public const string JwtBearerAuthenticationScheme = "AzureADJwtBearer";
///
/// The default scheme for Azure Active Directory.
///
- public static readonly string AuthenticationScheme = "AzureAD";
+ public const string AuthenticationScheme = "AzureAD";
///
/// The display name for Azure Active Directory.
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj
index 4a7df9d5a8..1605940b28 100644
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj
+++ b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj
@@ -6,7 +6,7 @@
netcoreapp3.0
aspnetcore;authentication;AzureAD
true
- true
+ true
Microsoft.AspNetCore.Mvc.ApplicationParts.NullApplicationPartFactory, Microsoft.AspNetCore.Mvc.Core
<_EnableAllInclusiveRazorSdk>true
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CDefaults.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CDefaults.cs
index 3bfe9bcbb0..769eea589b 100644
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CDefaults.cs
+++ b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CDefaults.cs
@@ -1,4 +1,4 @@
-// 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.using Microsoft.AspNetCore.Authorization;
@@ -20,29 +20,29 @@ namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI
/// The scheme name for Open ID Connect when using
/// .
///
- public static readonly string OpenIdScheme = "AzureADB2COpenID";
+ public const string OpenIdScheme = "AzureADB2COpenID";
///
/// The scheme name for cookies when using
/// .
///
- public static readonly string CookieScheme = "AzureADB2CCookie";
+ public const string CookieScheme = "AzureADB2CCookie";
///
/// The default scheme for Azure Active Directory B2C Bearer.
///
- public static readonly string BearerAuthenticationScheme = "AzureADB2CBearer";
+ public const string BearerAuthenticationScheme = "AzureADB2CBearer";
///
/// The scheme name for JWT Bearer when using
/// .
///
- public static readonly string JwtBearerAuthenticationScheme = "AzureADB2CJwtBearer";
+ public const string JwtBearerAuthenticationScheme = "AzureADB2CJwtBearer";
///
/// The default scheme for Azure Active Directory B2C.
///
- public static readonly string AuthenticationScheme = "AzureADB2C";
+ public const string AuthenticationScheme = "AzureADB2C";
///
/// The display name for Azure Active Directory B2C.
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj
index 3c3a584bfd..485d3a4085 100644
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj
+++ b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj
@@ -6,7 +6,7 @@
netcoreapp3.0
aspnetcore;authentication;AzureADB2C
true
- true
+ true
Microsoft.AspNetCore.Mvc.ApplicationParts.NullApplicationPartFactory, Microsoft.AspNetCore.Mvc.Core
<_EnableAllInclusiveRazorSdk>true
diff --git a/src/Azure/AzureAppServices.HostingStartup/src/Microsoft.AspNetCore.AzureAppServices.HostingStartup.csproj b/src/Azure/AzureAppServices.HostingStartup/src/Microsoft.AspNetCore.AzureAppServices.HostingStartup.csproj
index ac74adf4d7..821f07eb68 100644
--- a/src/Azure/AzureAppServices.HostingStartup/src/Microsoft.AspNetCore.AzureAppServices.HostingStartup.csproj
+++ b/src/Azure/AzureAppServices.HostingStartup/src/Microsoft.AspNetCore.AzureAppServices.HostingStartup.csproj
@@ -7,7 +7,7 @@
netcoreapp3.0
true
aspnetcore;azure;appservices
- true
+ true
diff --git a/src/Azure/AzureAppServicesIntegration/src/Microsoft.AspNetCore.AzureAppServicesIntegration.csproj b/src/Azure/AzureAppServicesIntegration/src/Microsoft.AspNetCore.AzureAppServicesIntegration.csproj
index fbbef613fd..7cd3dc1453 100644
--- a/src/Azure/AzureAppServicesIntegration/src/Microsoft.AspNetCore.AzureAppServicesIntegration.csproj
+++ b/src/Azure/AzureAppServicesIntegration/src/Microsoft.AspNetCore.AzureAppServicesIntegration.csproj
@@ -7,7 +7,7 @@
true
true
aspnetcore;azure;appservices
- true
+ true
diff --git a/src/Components/.editorconfig b/src/Components/.editorconfig
deleted file mode 100644
index f9d02415ce..0000000000
--- a/src/Components/.editorconfig
+++ /dev/null
@@ -1,55 +0,0 @@
-# All Files
-[*]
-charset = utf-8
-end_of_line = crlf
-indent_style = space
-indent_size = 4
-insert_final_newline = false
-trim_trailing_whitespace = true
-
-# Solution Files
-[*.sln]
-indent_style = tab
-
-# Markdown Files
-[*.md]
-trim_trailing_whitespace = false
-
-# Web Files
-[*.{htm,html,js,ts,css,scss,less}]
-insert_final_newline = true
-indent_size = 2
-
-[*.{yml,json}]
-indent_size = 2
-
-[*.{xml,csproj,config,*proj,targets,props}]
-indent_size = 2
-
-# Dotnet code style settings:
-[*.cs]
-# Sort using and Import directives with System.* appearing first
-dotnet_sort_system_directives_first = true
-
-# Don't use this. qualifier
-dotnet_style_qualification_for_field = false:suggestion
-dotnet_style_qualification_for_property = false:suggestion
-
-# use int x = .. over Int32
-dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
-
-# use int.MaxValue over Int32.MaxValue
-dotnet_style_predefined_type_for_member_access = true:suggestion
-
-# Require var all the time.
-csharp_style_var_for_built_in_types = true:suggestion
-csharp_style_var_when_type_is_apparent = true:suggestion
-csharp_style_var_elsewhere = true:suggestion
-
-# Newline settings
-csharp_new_line_before_open_brace = all
-csharp_new_line_before_else = true
-csharp_new_line_before_catch = true
-csharp_new_line_before_finally = true
-csharp_new_line_before_members_in_object_initializers = true
-csharp_new_line_before_members_in_anonymous_types = true
diff --git a/src/Components/.gitignore b/src/Components/.gitignore
deleted file mode 100644
index 33382d59a5..0000000000
--- a/src/Components/.gitignore
+++ /dev/null
@@ -1,10 +0,0 @@
-.vs/
-bin/
-obj/
-*.user
-launchSettings.json
-artifacts/
-msbuild.binlog
-.vscode/
-BenchmarkDotNet.Artifacts/
-*.binlog
diff --git a/src/Components/src/Microsoft.AspNetCore.Components.Analyzers/ComponentParametersShouldNotBePublicAnalyzer.cs b/src/Components/Analyzers/src/ComponentParametersShouldNotBePublicAnalyzer.cs
similarity index 100%
rename from src/Components/src/Microsoft.AspNetCore.Components.Analyzers/ComponentParametersShouldNotBePublicAnalyzer.cs
rename to src/Components/Analyzers/src/ComponentParametersShouldNotBePublicAnalyzer.cs
diff --git a/src/Components/src/Microsoft.AspNetCore.Components.Analyzers/ComponentParametersShouldNotBePublicCodeFixProvider.cs b/src/Components/Analyzers/src/ComponentParametersShouldNotBePublicCodeFixProvider.cs
similarity index 100%
rename from src/Components/src/Microsoft.AspNetCore.Components.Analyzers/ComponentParametersShouldNotBePublicCodeFixProvider.cs
rename to src/Components/Analyzers/src/ComponentParametersShouldNotBePublicCodeFixProvider.cs
diff --git a/src/Components/src/Microsoft.AspNetCore.Components.Analyzers/Microsoft.AspNetCore.Components.Analyzers.csproj b/src/Components/Analyzers/src/Microsoft.AspNetCore.Components.Analyzers.csproj
similarity index 68%
rename from src/Components/src/Microsoft.AspNetCore.Components.Analyzers/Microsoft.AspNetCore.Components.Analyzers.csproj
rename to src/Components/Analyzers/src/Microsoft.AspNetCore.Components.Analyzers.csproj
index 276f246bcd..b38c807057 100644
--- a/src/Components/src/Microsoft.AspNetCore.Components.Analyzers/Microsoft.AspNetCore.Components.Analyzers.csproj
+++ b/src/Components/Analyzers/src/Microsoft.AspNetCore.Components.Analyzers.csproj
@@ -6,20 +6,22 @@
true
false
Roslyn analyzers for ASP.NET Core Components.
- true
+ true
+
+ false
-
+
-
+
True
True
@@ -32,8 +34,4 @@
-
-
-
-
diff --git a/src/Components/src/Microsoft.AspNetCore.Components.Analyzers/Resources.Designer.cs b/src/Components/Analyzers/src/Resources.Designer.cs
similarity index 100%
rename from src/Components/src/Microsoft.AspNetCore.Components.Analyzers/Resources.Designer.cs
rename to src/Components/Analyzers/src/Resources.Designer.cs
diff --git a/src/Components/src/Microsoft.AspNetCore.Components.Analyzers/Resources.resx b/src/Components/Analyzers/src/Resources.resx
similarity index 100%
rename from src/Components/src/Microsoft.AspNetCore.Components.Analyzers/Resources.resx
rename to src/Components/Analyzers/src/Resources.resx
diff --git a/src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/ComponentParametersShouldNotBePublicTest.cs b/src/Components/Analyzers/test/ComponentParametersShouldNotBePublicTest.cs
similarity index 100%
rename from src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/ComponentParametersShouldNotBePublicTest.cs
rename to src/Components/Analyzers/test/ComponentParametersShouldNotBePublicTest.cs
diff --git a/src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/Helpers/CodeFixVerifier.Helper.cs b/src/Components/Analyzers/test/Helpers/CodeFixVerifier.Helper.cs
similarity index 100%
rename from src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/Helpers/CodeFixVerifier.Helper.cs
rename to src/Components/Analyzers/test/Helpers/CodeFixVerifier.Helper.cs
diff --git a/src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/Helpers/DiagnosticResult.cs b/src/Components/Analyzers/test/Helpers/DiagnosticResult.cs
similarity index 100%
rename from src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/Helpers/DiagnosticResult.cs
rename to src/Components/Analyzers/test/Helpers/DiagnosticResult.cs
diff --git a/src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/Helpers/DiagnosticVerifier.Helper.cs b/src/Components/Analyzers/test/Helpers/DiagnosticVerifier.Helper.cs
similarity index 100%
rename from src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/Helpers/DiagnosticVerifier.Helper.cs
rename to src/Components/Analyzers/test/Helpers/DiagnosticVerifier.Helper.cs
diff --git a/src/Components/Analyzers/test/Microsoft.AspNetCore.Components.Analyzers.Tests.csproj b/src/Components/Analyzers/test/Microsoft.AspNetCore.Components.Analyzers.Tests.csproj
new file mode 100644
index 0000000000..a31c1a8f0e
--- /dev/null
+++ b/src/Components/Analyzers/test/Microsoft.AspNetCore.Components.Analyzers.Tests.csproj
@@ -0,0 +1,17 @@
+
+
+
+ netcoreapp3.0
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/Verifiers/CodeFixVerifier.cs b/src/Components/Analyzers/test/Verifiers/CodeFixVerifier.cs
similarity index 100%
rename from src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/Verifiers/CodeFixVerifier.cs
rename to src/Components/Analyzers/test/Verifiers/CodeFixVerifier.cs
diff --git a/src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/Verifiers/DiagnosticVerifier.cs b/src/Components/Analyzers/test/Verifiers/DiagnosticVerifier.cs
similarity index 100%
rename from src/Components/test/Microsoft.AspNetCore.Components.Analyzers.Test/Verifiers/DiagnosticVerifier.cs
rename to src/Components/Analyzers/test/Verifiers/DiagnosticVerifier.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/BlazorWebAssemblyHost.cs b/src/Components/Blazor/Blazor/src/Hosting/BlazorWebAssemblyHost.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/BlazorWebAssemblyHost.cs
rename to src/Components/Blazor/Blazor/src/Hosting/BlazorWebAssemblyHost.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/IWebAssemblyHost.cs b/src/Components/Blazor/Blazor/src/Hosting/IWebAssemblyHost.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/IWebAssemblyHost.cs
rename to src/Components/Blazor/Blazor/src/Hosting/IWebAssemblyHost.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/IWebAssemblyHostBuilder.cs b/src/Components/Blazor/Blazor/src/Hosting/IWebAssemblyHostBuilder.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/IWebAssemblyHostBuilder.cs
rename to src/Components/Blazor/Blazor/src/Hosting/IWebAssemblyHostBuilder.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/IWebAssemblyServiceFactoryAdapter.cs b/src/Components/Blazor/Blazor/src/Hosting/IWebAssemblyServiceFactoryAdapter.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/IWebAssemblyServiceFactoryAdapter.cs
rename to src/Components/Blazor/Blazor/src/Hosting/IWebAssemblyServiceFactoryAdapter.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyBlazorApplicationBuilder.cs b/src/Components/Blazor/Blazor/src/Hosting/WebAssemblyBlazorApplicationBuilder.cs
similarity index 94%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyBlazorApplicationBuilder.cs
rename to src/Components/Blazor/Blazor/src/Hosting/WebAssemblyBlazorApplicationBuilder.cs
index 1a621c30ab..13d0c70602 100644
--- a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyBlazorApplicationBuilder.cs
+++ b/src/Components/Blazor/Blazor/src/Hosting/WebAssemblyBlazorApplicationBuilder.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Components.Builder;
namespace Microsoft.AspNetCore.Blazor.Hosting
{
- internal class WebAssemblyBlazorApplicationBuilder : IBlazorApplicationBuilder
+ internal class WebAssemblyBlazorApplicationBuilder : IComponentsApplicationBuilder
{
public WebAssemblyBlazorApplicationBuilder(IServiceProvider services)
{
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyHost.cs b/src/Components/Blazor/Blazor/src/Hosting/WebAssemblyHost.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyHost.cs
rename to src/Components/Blazor/Blazor/src/Hosting/WebAssemblyHost.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyHostBuilder.cs b/src/Components/Blazor/Blazor/src/Hosting/WebAssemblyHostBuilder.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyHostBuilder.cs
rename to src/Components/Blazor/Blazor/src/Hosting/WebAssemblyHostBuilder.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyHostBuilderContext.cs b/src/Components/Blazor/Blazor/src/Hosting/WebAssemblyHostBuilderContext.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyHostBuilderContext.cs
rename to src/Components/Blazor/Blazor/src/Hosting/WebAssemblyHostBuilderContext.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyHostBuilderExtensions.cs b/src/Components/Blazor/Blazor/src/Hosting/WebAssemblyHostBuilderExtensions.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyHostBuilderExtensions.cs
rename to src/Components/Blazor/Blazor/src/Hosting/WebAssemblyHostBuilderExtensions.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyHostExtensions.cs b/src/Components/Blazor/Blazor/src/Hosting/WebAssemblyHostExtensions.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyHostExtensions.cs
rename to src/Components/Blazor/Blazor/src/Hosting/WebAssemblyHostExtensions.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyServiceFactoryAdapter.cs b/src/Components/Blazor/Blazor/src/Hosting/WebAssemblyServiceFactoryAdapter.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Hosting/WebAssemblyServiceFactoryAdapter.cs
rename to src/Components/Blazor/Blazor/src/Hosting/WebAssemblyServiceFactoryAdapter.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Http/FetchCredentialsOption.cs b/src/Components/Blazor/Blazor/src/Http/FetchCredentialsOption.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Http/FetchCredentialsOption.cs
rename to src/Components/Blazor/Blazor/src/Http/FetchCredentialsOption.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Http/WebAssemblyHttpMessageHandler.cs b/src/Components/Blazor/Blazor/src/Http/WebAssemblyHttpMessageHandler.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Http/WebAssemblyHttpMessageHandler.cs
rename to src/Components/Blazor/Blazor/src/Http/WebAssemblyHttpMessageHandler.cs
diff --git a/src/Components/Blazor/Blazor/src/Microsoft.AspNetCore.Blazor.csproj b/src/Components/Blazor/Blazor/src/Microsoft.AspNetCore.Blazor.csproj
new file mode 100644
index 0000000000..97fba4e00a
--- /dev/null
+++ b/src/Components/Blazor/Blazor/src/Microsoft.AspNetCore.Blazor.csproj
@@ -0,0 +1,19 @@
+
+
+
+ netstandard2.0
+ Build client-side single-page applications (SPAs) with Razor Components running under WebAssembly.
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Components/Blazor/Blazor/src/Properties/AssemblyInfo.cs b/src/Components/Blazor/Blazor/src/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..d0b4317656
--- /dev/null
+++ b/src/Components/Blazor/Blazor/src/Properties/AssemblyInfo.cs
@@ -0,0 +1,3 @@
+using System.Runtime.CompilerServices;
+
+[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Blazor.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Rendering/WebAssemblyRenderer.cs b/src/Components/Blazor/Blazor/src/Rendering/WebAssemblyRenderer.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Rendering/WebAssemblyRenderer.cs
rename to src/Components/Blazor/Blazor/src/Rendering/WebAssemblyRenderer.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Services/WebAssemblyUriHelper.cs b/src/Components/Blazor/Blazor/src/Services/WebAssemblyUriHelper.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor/Services/WebAssemblyUriHelper.cs
rename to src/Components/Blazor/Blazor/src/Services/WebAssemblyUriHelper.cs
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Test/Hosting/ConventionBasedStartupTest.cs b/src/Components/Blazor/Blazor/test/Hosting/ConventionBasedStartupTest.cs
similarity index 98%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Test/Hosting/ConventionBasedStartupTest.cs
rename to src/Components/Blazor/Blazor/test/Hosting/ConventionBasedStartupTest.cs
index 7815e9a6f6..cbc73b79f8 100644
--- a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Test/Hosting/ConventionBasedStartupTest.cs
+++ b/src/Components/Blazor/Blazor/test/Hosting/ConventionBasedStartupTest.cs
@@ -200,7 +200,7 @@ namespace Microsoft.AspNetCore.Components.Hosting
{
public List Arguments { get; } = new List();
- public void Configure(IBlazorApplicationBuilder app, string foo)
+ public void Configure(IComponentsApplicationBuilder app, string foo)
{
Arguments.Add(app);
Arguments.Add(foo);
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Test/Hosting/WebAssemblyHostBuilderTest.cs b/src/Components/Blazor/Blazor/test/Hosting/WebAssemblyHostBuilderTest.cs
similarity index 100%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Test/Hosting/WebAssemblyHostBuilderTest.cs
rename to src/Components/Blazor/Blazor/test/Hosting/WebAssemblyHostBuilderTest.cs
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Test/Hosting/WebAssemblyHostTest.cs b/src/Components/Blazor/Blazor/test/Hosting/WebAssemblyHostTest.cs
similarity index 95%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Test/Hosting/WebAssemblyHostTest.cs
rename to src/Components/Blazor/Blazor/test/Hosting/WebAssemblyHostTest.cs
index 9aa07b9c69..ce2e831427 100644
--- a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Test/Hosting/WebAssemblyHostTest.cs
+++ b/src/Components/Blazor/Blazor/test/Hosting/WebAssemblyHostTest.cs
@@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Blazor.Hosting.Test
// Arrange
var builder = new WebAssemblyHostBuilder();
var host = builder.Build();
-
+
// Act
var ex = await Assert.ThrowsAsync(async () => await host.StartAsync());
@@ -69,7 +69,7 @@ namespace Microsoft.AspNetCore.Blazor.Hosting.Test
{
public bool ConfigureCalled { get; set; }
- public void Configure(IBlazorApplicationBuilder app, IServiceProvider services)
+ public void Configure(IComponentsApplicationBuilder app, IServiceProvider services)
{
ConfigureCalled = true;
}
diff --git a/src/Components/Blazor/Blazor/test/Microsoft.AspNetCore.Blazor.Tests.csproj b/src/Components/Blazor/Blazor/test/Microsoft.AspNetCore.Blazor.Tests.csproj
new file mode 100644
index 0000000000..43c8df3786
--- /dev/null
+++ b/src/Components/Blazor/Blazor/test/Microsoft.AspNetCore.Blazor.Tests.csproj
@@ -0,0 +1,11 @@
+
+
+
+ netcoreapp3.0
+
+
+
+
+
+
+
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Test/WebAssemblyUriHelperTest.cs b/src/Components/Blazor/Blazor/test/WebAssemblyUriHelperTest.cs
similarity index 100%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Test/WebAssemblyUriHelperTest.cs
rename to src/Components/Blazor/Blazor/test/WebAssemblyUriHelperTest.cs
diff --git a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/AboutDialogInfoAttribute.cs b/src/Components/Blazor/BlazorExtension/src/AboutDialogInfoAttribute.cs
similarity index 100%
rename from src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/AboutDialogInfoAttribute.cs
rename to src/Components/Blazor/BlazorExtension/src/AboutDialogInfoAttribute.cs
diff --git a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/AutoRebuild/AutoRebuildService.cs b/src/Components/Blazor/BlazorExtension/src/AutoRebuild/AutoRebuildService.cs
similarity index 95%
rename from src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/AutoRebuild/AutoRebuildService.cs
rename to src/Components/Blazor/BlazorExtension/src/AutoRebuild/AutoRebuildService.cs
index 49977fccfa..f3aa9b195b 100644
--- a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/AutoRebuild/AutoRebuildService.cs
+++ b/src/Components/Blazor/BlazorExtension/src/AutoRebuild/AutoRebuildService.cs
@@ -1,4 +1,4 @@
-// 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.
using Microsoft.VisualStudio.Shell.Interop;
@@ -33,12 +33,12 @@ namespace Microsoft.VisualStudio.BlazorExtension
public void Listen()
{
- AddBuildServiceNamedPipeServer();
+ _ = AddBuildServiceNamedPipeServerAsync();
}
- private void AddBuildServiceNamedPipeServer()
+ private Task AddBuildServiceNamedPipeServerAsync()
{
- Task.Factory.StartNew(async () =>
+ return Task.Factory.StartNew(async () =>
{
try
{
@@ -69,7 +69,7 @@ namespace Microsoft.VisualStudio.BlazorExtension
// As soon as we receive a connection, spin up another background
// listener to wait for the next connection
await serverPipe.WaitForConnectionAsync();
- AddBuildServiceNamedPipeServer();
+ _ = AddBuildServiceNamedPipeServerAsync();
await HandleRequestAsync(serverPipe, isServerElevated);
}
diff --git a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/AutoRebuild/BuildEventsWatcher.cs b/src/Components/Blazor/BlazorExtension/src/AutoRebuild/BuildEventsWatcher.cs
similarity index 91%
rename from src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/AutoRebuild/BuildEventsWatcher.cs
rename to src/Components/Blazor/BlazorExtension/src/AutoRebuild/BuildEventsWatcher.cs
index 1c56be2254..e05f05f28f 100644
--- a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/AutoRebuild/BuildEventsWatcher.cs
+++ b/src/Components/Blazor/BlazorExtension/src/AutoRebuild/BuildEventsWatcher.cs
@@ -1,10 +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.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
-using Microsoft.VisualStudio.ProjectSystem.Properties;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
@@ -74,14 +73,16 @@ namespace Microsoft.VisualStudio.BlazorExtension
public int UpdateProjectCfg_Begin(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, ref int pfCancel)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (IsBlazorProject(pHierProj))
{
// This method runs both for manually-invoked builds and for builds triggered automatically
// by PerformNewBuildAsync(). In the case where it's a manually-invoked build, make sure
// there's an in-progress BuildInfo so that if there are further builds requests while the
// build is still in progress we can join them onto this existing build.
- var ctx = (IVsBrowseObjectContext)pCfgProj;
- var projectPath = ctx.UnconfiguredProject.FullPath;
+
+ var projectPath = GetProjectPath(pHierProj);
lock (mostRecentBuildInfosLock)
{
var hasBuildInProgress =
@@ -99,11 +100,12 @@ namespace Microsoft.VisualStudio.BlazorExtension
public int UpdateProjectCfg_Done(IVsHierarchy pHierProj, IVsCfg pCfgProj, IVsCfg pCfgSln, uint dwAction, int fSuccess, int fCancel)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (IsBlazorProject(pHierProj))
{
var buildResult = fSuccess == 1;
- var ctx = (IVsBrowseObjectContext)pCfgProj;
- var projectPath = ctx.UnconfiguredProject.FullPath;
+ var projectPath = GetProjectPath(pHierProj);
// Mark pending build info as completed
BuildInfo foundInfo = null;
@@ -160,6 +162,13 @@ namespace Microsoft.VisualStudio.BlazorExtension
private static bool IsBlazorProject(IVsHierarchy pHierProj)
=> pHierProj.IsCapabilityMatch(BlazorProjectCapability);
+ private static string GetProjectPath(IVsHierarchy pHierProj)
+ {
+ ThreadHelper.ThrowIfNotOnUIThread();
+ ErrorHandler.ThrowOnFailure(((IVsProject)pHierProj).GetMkDocument((uint)VSConstants.VSITEMID.Root, out var projectPath), VSConstants.E_NOTIMPL);
+ return projectPath;
+ }
+
class BuildInfo
{
public DateTime StartTime { get; }
diff --git a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/AutoRebuild/StreamProtocolExtensions.cs b/src/Components/Blazor/BlazorExtension/src/AutoRebuild/StreamProtocolExtensions.cs
similarity index 100%
rename from src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/AutoRebuild/StreamProtocolExtensions.cs
rename to src/Components/Blazor/BlazorExtension/src/AutoRebuild/StreamProtocolExtensions.cs
diff --git a/src/Components/Blazor/BlazorExtension/src/BlazorPackage.cs b/src/Components/Blazor/BlazorExtension/src/BlazorPackage.cs
new file mode 100644
index 0000000000..fd956856ac
--- /dev/null
+++ b/src/Components/Blazor/BlazorExtension/src/BlazorPackage.cs
@@ -0,0 +1,44 @@
+// 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.Runtime.InteropServices;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.VisualStudio.Shell;
+using Microsoft.VisualStudio.Shell.Interop;
+using Task = System.Threading.Tasks.Task;
+
+namespace Microsoft.VisualStudio.BlazorExtension
+{
+ // We mainly have a package so we can have an "About" dialog entry.
+ [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
+ [AboutDialogInfo(PackageGuidString, "ASP.NET Core Blazor Language Services", "#110", "112")]
+ [Guid(BlazorPackage.PackageGuidString)]
+ [ProvideAutoLoad(UIContextGuids80.SolutionExists, PackageAutoLoadFlags.BackgroundLoad)]
+ public sealed class BlazorPackage : AsyncPackage
+ {
+ public const string PackageGuidString = "d9fe04bc-57a7-4107-915e-3a5c2f9e19fb";
+
+ protected async override Task InitializeAsync(CancellationToken cancellationToken, IProgress progress)
+ {
+ await base.InitializeAsync(cancellationToken, progress);
+
+ await JoinableTaskFactory.SwitchToMainThreadAsync();
+
+ // Create build watcher. No need to unadvise, as this only happens once anyway.
+ var solution = (IVsSolution)await GetServiceAsync(typeof(IVsSolution));
+ var buildManager = (IVsSolutionBuildManager)await GetServiceAsync(typeof(SVsSolutionBuildManager));
+
+ // According to the docs, this can happen if VS shuts down while our package is loading.
+ if (solution == null || buildManager == null)
+ {
+ var buildWatcher = new BuildEventsWatcher(solution, buildManager);
+ var hr = buildManager.AdviseUpdateSolutionEvents(buildWatcher, out var cookie);
+ Marshal.ThrowExceptionForHR(hr);
+
+ new AutoRebuildService(buildWatcher).Listen();
+ }
+ }
+ }
+}
diff --git a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/CodeSnippets.pkgdef b/src/Components/Blazor/BlazorExtension/src/CodeSnippets.pkgdef
similarity index 100%
rename from src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/CodeSnippets.pkgdef
rename to src/Components/Blazor/BlazorExtension/src/CodeSnippets.pkgdef
diff --git a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/CodeSnippets/Blazor/para.snippet b/src/Components/Blazor/BlazorExtension/src/CodeSnippets/Blazor/para.snippet
similarity index 100%
rename from src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/CodeSnippets/Blazor/para.snippet
rename to src/Components/Blazor/BlazorExtension/src/CodeSnippets/Blazor/para.snippet
diff --git a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/Content/WebConfiguration.png b/src/Components/Blazor/BlazorExtension/src/Content/WebConfiguration.png
similarity index 100%
rename from src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/Content/WebConfiguration.png
rename to src/Components/Blazor/BlazorExtension/src/Content/WebConfiguration.png
diff --git a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/Microsoft.VisualStudio.BlazorExtension.csproj b/src/Components/Blazor/BlazorExtension/src/Microsoft.VisualStudio.BlazorExtension.csproj
similarity index 70%
rename from src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/Microsoft.VisualStudio.BlazorExtension.csproj
rename to src/Components/Blazor/BlazorExtension/src/Microsoft.VisualStudio.BlazorExtension.csproj
index 335871c2e4..ad62a6c9a3 100644
--- a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/Microsoft.VisualStudio.BlazorExtension.csproj
+++ b/src/Components/Blazor/BlazorExtension/src/Microsoft.VisualStudio.BlazorExtension.csproj
@@ -4,14 +4,21 @@
16.0
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
true
-
- false
- false
- $(MSBuildThisFileDirectory)..\..\..\
+ true
+ true
+ bin\$(Configuration)\
+ obj\$(Configuration)\
+
+ false
+ false
+ false
+ false
+ false
+ false
+ true
-
-
+
-
-
- true
- ..\..\..\build\Key.snk
-
- 15.7
- $(VsixVersion).$(BuildNumber)
- $(VsixVersion).999999
- $(VsixVersion).ERROR-MISSING_BUILD_NUMBER
+ 16.0
+ 424242.424242
+ $(BuildNumberSuffix.Replace('-', '.'))
+ $(VsixVersionPrefix).$(VsixVersionSuffix)
+
+
+
+ $(VisualStudioSetupOutputPath)$(MSBuildProjectName).vsix
+
+
+
Program
@@ -71,9 +81,9 @@
true
true
-
+
-
+
ProjectTemplates\
@@ -89,25 +99,7 @@
-
-
-
- false
-
-
-
-
-
-
-
+
+
+
diff --git a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/Resources.resx b/src/Components/Blazor/BlazorExtension/src/Resources.resx
similarity index 100%
rename from src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/Resources.resx
rename to src/Components/Blazor/BlazorExtension/src/Resources.resx
diff --git a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/Resources/BlazorPackage.ico b/src/Components/Blazor/BlazorExtension/src/Resources/BlazorPackage.ico
similarity index 100%
rename from src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/Resources/BlazorPackage.ico
rename to src/Components/Blazor/BlazorExtension/src/Resources/BlazorPackage.ico
diff --git a/src/Components/Blazor/BlazorExtension/src/Templates.pkgdef b/src/Components/Blazor/BlazorExtension/src/Templates.pkgdef
new file mode 100644
index 0000000000..a5b41e7c29
--- /dev/null
+++ b/src/Components/Blazor/BlazorExtension/src/Templates.pkgdef
@@ -0,0 +1,2 @@
+[$RootKey$\TemplateEngine\Templates\Blazor\0.8.0]
+"InstalledPath"="$PackageFolder$\ProjectTemplates"
\ No newline at end of file
diff --git a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/source.extension.vsixmanifest b/src/Components/Blazor/BlazorExtension/src/source.extension.vsixmanifest
similarity index 72%
rename from src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/source.extension.vsixmanifest
rename to src/Components/Blazor/BlazorExtension/src/source.extension.vsixmanifest
index 838bc66b88..869961f74e 100644
--- a/src/Components/blazor/tooling/Microsoft.VisualStudio.BlazorExtension/source.extension.vsixmanifest
+++ b/src/Components/Blazor/BlazorExtension/src/source.extension.vsixmanifest
@@ -12,19 +12,17 @@
Content\WebConfiguration.png
-
+
-
+
-
-
-
+
-
+
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Cli/Commands/ResolveRuntimeDependenciesCommand.cs b/src/Components/Blazor/Build/src/Cli/Commands/ResolveRuntimeDependenciesCommand.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Cli/Commands/ResolveRuntimeDependenciesCommand.cs
rename to src/Components/Blazor/Build/src/Cli/Commands/ResolveRuntimeDependenciesCommand.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Cli/Commands/WriteBootJsonCommand.cs b/src/Components/Blazor/Build/src/Cli/Commands/WriteBootJsonCommand.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Cli/Commands/WriteBootJsonCommand.cs
rename to src/Components/Blazor/Build/src/Cli/Commands/WriteBootJsonCommand.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Cli/Program.cs b/src/Components/Blazor/Build/src/Cli/Program.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Cli/Program.cs
rename to src/Components/Blazor/Build/src/Cli/Program.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Core/BootJsonWriter.cs b/src/Components/Blazor/Build/src/Core/BootJsonWriter.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Core/BootJsonWriter.cs
rename to src/Components/Blazor/Build/src/Core/BootJsonWriter.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Core/EmbeddedResources/EmbeddedResourceInfo.cs b/src/Components/Blazor/Build/src/Core/EmbeddedResources/EmbeddedResourceInfo.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Core/EmbeddedResources/EmbeddedResourceInfo.cs
rename to src/Components/Blazor/Build/src/Core/EmbeddedResources/EmbeddedResourceInfo.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Core/EmbeddedResources/EmbeddedResourceKind.cs b/src/Components/Blazor/Build/src/Core/EmbeddedResources/EmbeddedResourceKind.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Core/EmbeddedResources/EmbeddedResourceKind.cs
rename to src/Components/Blazor/Build/src/Core/EmbeddedResources/EmbeddedResourceKind.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Core/EmbeddedResources/EmbeddedResourcesProcessor.cs b/src/Components/Blazor/Build/src/Core/EmbeddedResources/EmbeddedResourcesProcessor.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Core/EmbeddedResources/EmbeddedResourcesProcessor.cs
rename to src/Components/Blazor/Build/src/Core/EmbeddedResources/EmbeddedResourcesProcessor.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Core/RuntimeDependenciesResolver.cs b/src/Components/Blazor/Build/src/Core/RuntimeDependenciesResolver.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Core/RuntimeDependenciesResolver.cs
rename to src/Components/Blazor/Build/src/Core/RuntimeDependenciesResolver.cs
diff --git a/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.csproj b/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.csproj
new file mode 100644
index 0000000000..61c027e175
--- /dev/null
+++ b/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.csproj
@@ -0,0 +1,48 @@
+
+
+
+ netcoreapp3.0
+ Build mechanism for ASP.NET Core Blazor applications.
+ Exe
+ true
+ true
+
+
+
+
+
+ false
+ true
+ Microsoft.AspNetCore.Blazor.Build.nuspec
+ obj\publish\
+ $(IntermediatePackDir)$(TargetFramework)/
+
+
+
+
+
+ false
+
+ version=$(PackageVersion);
+ publishDir=$([MSBuild]::NormalizeDirectory($(IntermediatePackDir)));
+ componentsversion=$(ComponentsPackageVersion);
+ razorversion=$(MicrosoftAspNetCoreRazorDesignPackageVersion);
+ blazormonoversion=$(MicrosoftAspNetCoreBlazorMonoPackageVersion);
+ repositorycommit=$(RepositoryCommit);
+
+
+ <_TargetFramework Include="$(TargetFramework)" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Microsoft.AspNetCore.Blazor.Build.nuspec b/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.nuspec
similarity index 91%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Microsoft.AspNetCore.Blazor.Build.nuspec
rename to src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.nuspec
index 7a8a465048..3e85a96e10 100644
--- a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/Microsoft.AspNetCore.Blazor.Build.nuspec
+++ b/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.nuspec
@@ -22,6 +22,6 @@
-
+
diff --git a/src/Components/Blazor/Build/src/Properties/AssemblyInfo.cs b/src/Components/Blazor/Build/src/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..aac42c25cc
--- /dev/null
+++ b/src/Components/Blazor/Build/src/Properties/AssemblyInfo.cs
@@ -0,0 +1,3 @@
+using System.Runtime.CompilerServices;
+
+[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Blazor.Build.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/ReferenceFromSource.props b/src/Components/Blazor/Build/src/ReferenceFromSource.props
similarity index 81%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/ReferenceFromSource.props
rename to src/Components/Blazor/Build/src/ReferenceFromSource.props
index 0d1f091e35..5802a69132 100644
--- a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/ReferenceFromSource.props
+++ b/src/Components/Blazor/Build/src/ReferenceFromSource.props
@@ -9,11 +9,11 @@
This is only intended for use by other projects in this repo.
-->
-
+
true
- $(MSBuildThisFileDirectory)../../../src/Microsoft.AspNetCore.Components.Browser.JS/dist/components.*.js
+ $(RepositoryRoot)src\Components\Browser.JS\src\dist\components.*.js
@@ -29,12 +29,12 @@
-->
dotnet
- <_BlazorCliLocation>$(MSBuildThisFileDirectory)../Microsoft.AspNetCore.Blazor.Cli/bin/$(Configuration)/netcoreapp3.0/dotnet-blazor.dll
+ <_BlazorCliLocation>$(MSBuildThisFileDirectory)../../Cli/src/bin/$(Configuration)/netcoreapp3.0/dotnet-blazor.dll
exec "$(_BlazorCliLocation)" serve $(AdditionalRunArguments)
-
+
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/build/netstandard1.0/Microsoft.AspNetCore.Blazor.Build.props b/src/Components/Blazor/Build/src/build/netstandard1.0/Microsoft.AspNetCore.Blazor.Build.props
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/build/netstandard1.0/Microsoft.AspNetCore.Blazor.Build.props
rename to src/Components/Blazor/Build/src/build/netstandard1.0/Microsoft.AspNetCore.Blazor.Build.props
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/build/netstandard1.0/Microsoft.AspNetCore.Blazor.Build.targets b/src/Components/Blazor/Build/src/build/netstandard1.0/Microsoft.AspNetCore.Blazor.Build.targets
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/build/netstandard1.0/Microsoft.AspNetCore.Blazor.Build.targets
rename to src/Components/Blazor/Build/src/build/netstandard1.0/Microsoft.AspNetCore.Blazor.Build.targets
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/All.props b/src/Components/Blazor/Build/src/targets/All.props
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/All.props
rename to src/Components/Blazor/Build/src/targets/All.props
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/All.targets b/src/Components/Blazor/Build/src/targets/All.targets
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/All.targets
rename to src/Components/Blazor/Build/src/targets/All.targets
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/Blazor.MonoRuntime.props b/src/Components/Blazor/Build/src/targets/Blazor.MonoRuntime.props
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/Blazor.MonoRuntime.props
rename to src/Components/Blazor/Build/src/targets/Blazor.MonoRuntime.props
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/Blazor.MonoRuntime.targets b/src/Components/Blazor/Build/src/targets/Blazor.MonoRuntime.targets
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/Blazor.MonoRuntime.targets
rename to src/Components/Blazor/Build/src/targets/Blazor.MonoRuntime.targets
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/BuiltInBclLinkerDescriptor.xml b/src/Components/Blazor/Build/src/targets/BuiltInBclLinkerDescriptor.xml
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/BuiltInBclLinkerDescriptor.xml
rename to src/Components/Blazor/Build/src/targets/BuiltInBclLinkerDescriptor.xml
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/Publish.targets b/src/Components/Blazor/Build/src/targets/Publish.targets
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/Publish.targets
rename to src/Components/Blazor/Build/src/targets/Publish.targets
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/Standalone.Web.config b/src/Components/Blazor/Build/src/targets/Standalone.Web.config
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Build/targets/Standalone.Web.config
rename to src/Components/Blazor/Build/src/targets/Standalone.Web.config
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/BindRazorIntegrationTest.cs b/src/Components/Blazor/Build/test/BindRazorIntegrationTest.cs
similarity index 98%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/BindRazorIntegrationTest.cs
rename to src/Components/Blazor/Build/test/BindRazorIntegrationTest.cs
index 0f217f4e1e..7e001e6c30 100644
--- a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/BindRazorIntegrationTest.cs
+++ b/src/Components/Blazor/Build/test/BindRazorIntegrationTest.cs
@@ -62,14 +62,16 @@ namespace Test
// Arrange
AdditionalSyntaxTrees.Add(Parse(@"
using System;
+using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
namespace Test
{
public class MyComponent : ComponentBase, IComponent
{
- void IComponent.SetParameters(ParameterCollection parameters)
+ Task IComponent.SetParametersAsync(ParameterCollection parameters)
{
+ return Task.CompletedTask;
}
}
}"));
@@ -136,14 +138,16 @@ namespace Test
// Arrange
AdditionalSyntaxTrees.Add(Parse(@"
using System;
+using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
namespace Test
{
public class MyComponent : ComponentBase, IComponent
{
- void IComponent.SetParameters(ParameterCollection parameters)
+ Task IComponent.SetParametersAsync(ParameterCollection parameters)
{
+ return Task.CompletedTask;
}
}
}"));
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/BootJsonWriterTest.cs b/src/Components/Blazor/Build/test/BootJsonWriterTest.cs
similarity index 100%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/BootJsonWriterTest.cs
rename to src/Components/Blazor/Build/test/BootJsonWriterTest.cs
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/ChildContentRazorIntegrationTest.cs b/src/Components/Blazor/Build/test/ChildContentRazorIntegrationTest.cs
similarity index 100%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/ChildContentRazorIntegrationTest.cs
rename to src/Components/Blazor/Build/test/ChildContentRazorIntegrationTest.cs
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/ComponentRenderingRazorIntegrationTest.cs b/src/Components/Blazor/Build/test/ComponentRenderingRazorIntegrationTest.cs
similarity index 99%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/ComponentRenderingRazorIntegrationTest.cs
rename to src/Components/Blazor/Build/test/ComponentRenderingRazorIntegrationTest.cs
index 0226c74ba4..2078a3e1df 100644
--- a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/ComponentRenderingRazorIntegrationTest.cs
+++ b/src/Components/Blazor/Build/test/ComponentRenderingRazorIntegrationTest.cs
@@ -162,14 +162,16 @@ namespace Test
{
// Arrange
AdditionalSyntaxTrees.Add(Parse(@"
+using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
namespace Test
{
public class MyComponent : ComponentBase, IComponent
{
- void IComponent.SetParameters(ParameterCollection parameters)
+ Task IComponent.SetParametersAsync(ParameterCollection parameters)
{
+ return Task.CompletedTask;
}
}
}
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/DirectiveRazorIntegrationTest.cs b/src/Components/Blazor/Build/test/DirectiveRazorIntegrationTest.cs
similarity index 96%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/DirectiveRazorIntegrationTest.cs
rename to src/Components/Blazor/Build/test/DirectiveRazorIntegrationTest.cs
index 14485e1e61..a82da4b755 100644
--- a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/DirectiveRazorIntegrationTest.cs
+++ b/src/Components/Blazor/Build/test/DirectiveRazorIntegrationTest.cs
@@ -4,6 +4,7 @@
using System;
using System.Linq;
using System.Reflection;
+using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Layouts;
using Microsoft.AspNetCore.Components.Test.Helpers;
@@ -149,12 +150,13 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test
[Parameter]
RenderFragment Body { get; set; }
- public void Init(RenderHandle renderHandle)
+ public void Configure(RenderHandle renderHandle)
{
}
- public void SetParameters(ParameterCollection parameters)
+ public Task SetParametersAsync(ParameterCollection parameters)
{
+ return Task.CompletedTask;
}
}
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/GenericComponentRazorIntegrationTest.cs b/src/Components/Blazor/Build/test/GenericComponentRazorIntegrationTest.cs
similarity index 100%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/GenericComponentRazorIntegrationTest.cs
rename to src/Components/Blazor/Build/test/GenericComponentRazorIntegrationTest.cs
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Microsoft.AspNetCore.Blazor.Build.Test.csproj b/src/Components/Blazor/Build/test/Microsoft.AspNetCore.Blazor.Build.Tests.csproj
similarity index 56%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Microsoft.AspNetCore.Blazor.Build.Test.csproj
rename to src/Components/Blazor/Build/test/Microsoft.AspNetCore.Blazor.Build.Tests.csproj
index 8003e51a88..37a3d5ebb7 100644
--- a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Microsoft.AspNetCore.Blazor.Build.Test.csproj
+++ b/src/Components/Blazor/Build/test/Microsoft.AspNetCore.Blazor.Build.Tests.csproj
@@ -3,8 +3,6 @@
netcoreapp3.0
- false
-
$(DefaultItemExcludes);TestFiles\**\*
@@ -23,21 +21,17 @@
-
-
-
-
-
-
-
+
+
+
+
+
-
-
+
-
-
+
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Razor/NotFoundProjectItem.cs b/src/Components/Blazor/Build/test/Razor/NotFoundProjectItem.cs
similarity index 100%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Razor/NotFoundProjectItem.cs
rename to src/Components/Blazor/Build/test/Razor/NotFoundProjectItem.cs
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Razor/TestFile.cs b/src/Components/Blazor/Build/test/Razor/TestFile.cs
similarity index 100%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Razor/TestFile.cs
rename to src/Components/Blazor/Build/test/Razor/TestFile.cs
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Razor/TestProject.cs b/src/Components/Blazor/Build/test/Razor/TestProject.cs
similarity index 100%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Razor/TestProject.cs
rename to src/Components/Blazor/Build/test/Razor/TestProject.cs
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Razor/VirtualProjectFileSystem.cs b/src/Components/Blazor/Build/test/Razor/VirtualProjectFileSystem.cs
similarity index 100%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Razor/VirtualProjectFileSystem.cs
rename to src/Components/Blazor/Build/test/Razor/VirtualProjectFileSystem.cs
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Razor/VirtualProjectItem.cs b/src/Components/Blazor/Build/test/Razor/VirtualProjectItem.cs
similarity index 100%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/Razor/VirtualProjectItem.cs
rename to src/Components/Blazor/Build/test/Razor/VirtualProjectItem.cs
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/RazorIntegrationTestBase.cs b/src/Components/Blazor/Build/test/RazorIntegrationTestBase.cs
similarity index 97%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/RazorIntegrationTestBase.cs
rename to src/Components/Blazor/Build/test/RazorIntegrationTestBase.cs
index 799f995cde..c3f207e299 100644
--- a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/RazorIntegrationTestBase.cs
+++ b/src/Components/Blazor/Build/test/RazorIntegrationTestBase.cs
@@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
+using System.Runtime.ExceptionServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
@@ -376,7 +377,13 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test
{
var renderer = new TestRenderer();
renderer.AttachComponent(component);
- component.SetParameters(ParameterCollection.Empty);
+ var task = component.SetParametersAsync(ParameterCollection.Empty);
+ // we will have to change this method if we add a test that does actual async work.
+ Assert.True(task.Status.HasFlag(TaskStatus.RanToCompletion) || task.Status.HasFlag(TaskStatus.Faulted));
+ if (task.IsFaulted)
+ {
+ ExceptionDispatchInfo.Capture(task.Exception.InnerException).Throw();
+ }
return renderer.LatestBatchReferenceFrames;
}
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/RenderingRazorIntegrationTest.cs b/src/Components/Blazor/Build/test/RenderingRazorIntegrationTest.cs
similarity index 100%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/RenderingRazorIntegrationTest.cs
rename to src/Components/Blazor/Build/test/RenderingRazorIntegrationTest.cs
diff --git a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/RuntimeDependenciesResolverTest.cs b/src/Components/Blazor/Build/test/RuntimeDependenciesResolverTest.cs
similarity index 89%
rename from src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/RuntimeDependenciesResolverTest.cs
rename to src/Components/Blazor/Build/test/RuntimeDependenciesResolverTest.cs
index c594add472..4e880ee59f 100644
--- a/src/Components/blazor/test/Microsoft.AspNetCore.Blazor.Build.Test/RuntimeDependenciesResolverTest.cs
+++ b/src/Components/Blazor/Build/test/RuntimeDependenciesResolverTest.cs
@@ -2,14 +2,23 @@
// 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.IO;
using System.Linq;
using Xunit;
+using Xunit.Abstractions;
namespace Microsoft.AspNetCore.Blazor.Build.Test
{
public class RuntimeDependenciesResolverTest
{
+ private readonly ITestOutputHelper _output;
+
+ public RuntimeDependenciesResolverTest(ITestOutputHelper output)
+ {
+ _output = output;
+ }
+
[Fact]
public void FindsReferenceAssemblyGraph_ForStandaloneApp()
{
@@ -76,6 +85,7 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test
"System.Core.dll",
"System.Data.dll",
"System.Diagnostics.Debug.dll",
+ "System.Diagnostics.Tracing.dll",
"System.Drawing.dll",
"System.IO.Compression.dll",
"System.IO.Compression.FileSystem.dll",
@@ -112,6 +122,14 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test
.OrderBy(i => i, StringComparer.Ordinal)
.ToArray();
+ var expected = new HashSet(expectedContents);
+ var actual = new HashSet(contents);
+ _output.WriteLine("Expected contents to have:");
+ _output.WriteLine(string.Join(",", expected.Except(actual)));
+
+ _output.WriteLine("Unexpected contents:");
+ _output.WriteLine(string.Join(",", actual.Except(expected)));
+
// Assert
Assert.Equal(expectedContents, contents);
}
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Cli/Commands/ServeCommand.cs b/src/Components/Blazor/Cli/src/Commands/ServeCommand.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Cli/Commands/ServeCommand.cs
rename to src/Components/Blazor/Cli/src/Commands/ServeCommand.cs
diff --git a/src/Components/Blazor/Cli/src/Microsoft.AspNetCore.Blazor.Cli.csproj b/src/Components/Blazor/Cli/src/Microsoft.AspNetCore.Blazor.Cli.csproj
new file mode 100644
index 0000000000..5b49f24fba
--- /dev/null
+++ b/src/Components/Blazor/Cli/src/Microsoft.AspNetCore.Blazor.Cli.csproj
@@ -0,0 +1,47 @@
+
+
+
+ netcoreapp3.0
+ Exe
+ dotnet-blazor
+ Microsoft.AspNetCore.Blazor.Cli
+ true
+ Microsoft.AspNetCore.Blazor.Cli.Program
+ Development server for use when building Blazor applications.
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Microsoft.AspNetCore.Blazor.Cli.nuspec
+
+ outdir=$(OutDir);
+ componentsrootdir=..\..\..\;
+ blazorversion=$(PackageVersion);
+ aspnetcoreversion=$(ComponentsPackageVersion);
+ sharedfxversion=$(SharedFxVersion);
+ repositorycommit=$(RepositoryCommit);
+
+
+
+
+
+
diff --git a/src/Components/Blazor/Cli/src/Microsoft.AspNetCore.Blazor.Cli.nuspec b/src/Components/Blazor/Cli/src/Microsoft.AspNetCore.Blazor.Cli.nuspec
new file mode 100644
index 0000000000..cfbc5f966f
--- /dev/null
+++ b/src/Components/Blazor/Cli/src/Microsoft.AspNetCore.Blazor.Cli.nuspec
@@ -0,0 +1,32 @@
+
+
+
+ Microsoft.AspNetCore.Blazor.Cli
+ $blazorversion$
+ Microsoft
+ Microsoft
+ true
+ https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt
+ https://asp.net/
+ https://go.microsoft.com/fwlink/?LinkID=288859
+ Development server for use when building Blazor applications.
+
+This package was built from the source code at https://github.com/aspnet/AspNetCore/tree/$repositorycommit$
+ © Microsoft Corporation. All rights reserved.
+ aspnetcore components
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Cli/Program.cs b/src/Components/Blazor/Cli/src/Program.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Cli/Program.cs
rename to src/Components/Blazor/Cli/src/Program.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Cli/Server/Program.cs b/src/Components/Blazor/Cli/src/Server/Program.cs
similarity index 52%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Cli/Server/Program.cs
rename to src/Components/Blazor/Cli/src/Server/Program.cs
index 29f05fc9b7..4d5360d207 100644
--- a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Cli/Server/Program.cs
+++ b/src/Components/Blazor/Cli/src/Server/Program.cs
@@ -6,9 +6,19 @@ using Microsoft.Extensions.Configuration;
namespace Microsoft.AspNetCore.Blazor.Cli.Server
{
- internal class Program
+ // This project is a CLI tool, so we don't expect anyone to reference it
+ // as a runtime library. As such we consider it reasonable to mark the
+ // following method as public purely so the E2E tests project can invoke it.
+
+ ///
+ /// Intended for framework test use only.
+ ///
+ public class Program
{
- internal static IWebHost BuildWebHost(string[] args) =>
+ ///
+ /// Intended for framework test use only.
+ ///
+ public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseConfiguration(new ConfigurationBuilder()
.AddCommandLine(args)
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Cli/Server/Startup.cs b/src/Components/Blazor/Cli/src/Server/Startup.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Cli/Server/Startup.cs
rename to src/Components/Blazor/Cli/src/Server/Startup.cs
diff --git a/src/Components/Blazor/Cli/src/temporaryruntimeconfig.json b/src/Components/Blazor/Cli/src/temporaryruntimeconfig.json
new file mode 100644
index 0000000000..ab764021e6
--- /dev/null
+++ b/src/Components/Blazor/Cli/src/temporaryruntimeconfig.json
@@ -0,0 +1,9 @@
+{
+ "runtimeOptions": {
+ "tfm": "netcoreapp3.0",
+ "framework": {
+ "name": "Microsoft.AspNetCore.App",
+ "version": "${sharedfxversion}"
+ }
+ }
+}
diff --git a/src/Components/Blazor/Directory.Build.props b/src/Components/Blazor/Directory.Build.props
new file mode 100644
index 0000000000..cb599cac75
--- /dev/null
+++ b/src/Components/Blazor/Directory.Build.props
@@ -0,0 +1,10 @@
+
+
+
+
+ $(PackageVersion)
+ $(BlazorComponentsVersionPrefix)
+ $(VersionPrefix)
+ $(VersionPrefix)-$(VersionSuffix)
+
+
diff --git a/src/Components/Blazor/Server/src/Microsoft.AspNetCore.Blazor.Server.csproj b/src/Components/Blazor/Server/src/Microsoft.AspNetCore.Blazor.Server.csproj
new file mode 100644
index 0000000000..6cc0b40a19
--- /dev/null
+++ b/src/Components/Blazor/Server/src/Microsoft.AspNetCore.Blazor.Server.csproj
@@ -0,0 +1,19 @@
+
+
+
+ netcoreapp3.0
+ Runtime server features for ASP.NET Core Blazor applications.
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Server/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs b/src/Components/Blazor/Server/src/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Server/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs
rename to src/Components/Blazor/Server/src/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Server/MonoDebugProxy/UpdateSources.cmd b/src/Components/Blazor/Server/src/MonoDebugProxy/UpdateSources.cmd
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Server/MonoDebugProxy/UpdateSources.cmd
rename to src/Components/Blazor/Server/src/MonoDebugProxy/UpdateSources.cmd
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Server/MonoDebugProxy/ws-proxy/DebugStore.cs b/src/Components/Blazor/Server/src/MonoDebugProxy/ws-proxy/DebugStore.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Server/MonoDebugProxy/ws-proxy/DebugStore.cs
rename to src/Components/Blazor/Server/src/MonoDebugProxy/ws-proxy/DebugStore.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Server/MonoDebugProxy/ws-proxy/MonoProxy.cs b/src/Components/Blazor/Server/src/MonoDebugProxy/ws-proxy/MonoProxy.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Server/MonoDebugProxy/ws-proxy/MonoProxy.cs
rename to src/Components/Blazor/Server/src/MonoDebugProxy/ws-proxy/MonoProxy.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Server/MonoDebugProxy/ws-proxy/WsProxy.cs b/src/Components/Blazor/Server/src/MonoDebugProxy/ws-proxy/WsProxy.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Server/MonoDebugProxy/ws-proxy/WsProxy.cs
rename to src/Components/Blazor/Server/src/MonoDebugProxy/ws-proxy/WsProxy.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/.gitignore b/src/Components/Blazor/Templates/.gitignore
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/.gitignore
rename to src/Components/Blazor/Templates/.gitignore
diff --git a/src/Components/Blazor/Templates/src/Directory.Build.props b/src/Components/Blazor/Templates/src/Directory.Build.props
new file mode 100644
index 0000000000..c5666650b9
--- /dev/null
+++ b/src/Components/Blazor/Templates/src/Directory.Build.props
@@ -0,0 +1,14 @@
+
+
+
+
+ false
+
+
+
+
+ 0.8.0-preview-19064-0339
+ 3.0.0-preview-19064-0339
+
+
+
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/Directory.Build.targets b/src/Components/Blazor/Templates/src/Directory.Build.targets
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/Directory.Build.targets
rename to src/Components/Blazor/Templates/src/Directory.Build.targets
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/Microsoft.AspNetCore.Blazor.Templates.csproj b/src/Components/Blazor/Templates/src/Microsoft.AspNetCore.Blazor.Templates.csproj
similarity index 89%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/Microsoft.AspNetCore.Blazor.Templates.csproj
rename to src/Components/Blazor/Templates/src/Microsoft.AspNetCore.Blazor.Templates.csproj
index b5053c4993..f33d8fcc67 100644
--- a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/Microsoft.AspNetCore.Blazor.Templates.csproj
+++ b/src/Components/Blazor/Templates/src/Microsoft.AspNetCore.Blazor.Templates.csproj
@@ -2,20 +2,15 @@
netstandard2.0
Microsoft.AspNetCore.Blazor.Templates.nuspec
- true
+ true
False
False
False
2008
Templates for ASP.NET Core Blazor projects.
+ false
-
-
-
-
-
-
-
+
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/BlazorHosted-CSharp.Client.csproj b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/BlazorHosted-CSharp.Client.csproj
similarity index 87%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/BlazorHosted-CSharp.Client.csproj
rename to src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/BlazorHosted-CSharp.Client.csproj
index 942482234b..e213d7de3d 100644
--- a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/BlazorHosted-CSharp.Client.csproj
+++ b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/BlazorHosted-CSharp.Client.csproj
@@ -13,7 +13,6 @@
-
diff --git a/src/Components/blazor/samples/StandaloneApp/Pages/Counter.cshtml b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/Counter.cshtml
similarity index 100%
rename from src/Components/blazor/samples/StandaloneApp/Pages/Counter.cshtml
rename to src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/Counter.cshtml
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/FetchData.cshtml b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/FetchData.cshtml
similarity index 94%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/FetchData.cshtml
rename to src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/FetchData.cshtml
index 623bcf1771..2f8e580529 100644
--- a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/FetchData.cshtml
+++ b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/FetchData.cshtml
@@ -1,5 +1,5 @@
-@using BlazorHosted_CSharp.Shared
-@page "/fetchdata"
+@page "/fetchdata"
+@using BlazorHosted_CSharp.Shared
@inject HttpClient Http
Weather forecast
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/Index.cshtml b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/Index.cshtml
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/Index.cshtml
rename to src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/Index.cshtml
diff --git a/src/Components/blazor/benchmarks/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/_ViewImports.cshtml b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/_ViewImports.cshtml
similarity index 100%
rename from src/Components/blazor/benchmarks/Microsoft.AspNetCore.Blazor.E2EPerformance/Pages/_ViewImports.cshtml
rename to src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Pages/_ViewImports.cshtml
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Program.cs b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Program.cs
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Program.cs
rename to src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Program.cs
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Shared/MainLayout.cshtml b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Shared/MainLayout.cshtml
similarity index 100%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Shared/MainLayout.cshtml
rename to src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Shared/MainLayout.cshtml
diff --git a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Shared/NavMenu.cshtml b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Shared/NavMenu.cshtml
similarity index 78%
rename from src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Shared/NavMenu.cshtml
rename to src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Shared/NavMenu.cshtml
index b29ab68e03..6fd8763b01 100644
--- a/src/Components/blazor/src/Microsoft.AspNetCore.Blazor.Templates/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Shared/NavMenu.cshtml
+++ b/src/Components/Blazor/Templates/src/content/BlazorHosted-CSharp/BlazorHosted-CSharp.Client/Shared/NavMenu.cshtml
@@ -1,14 +1,14 @@
-
- Submit
+ Reset Password
diff --git a/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj b/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj
index b90fa1a437..663429210a 100644
--- a/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj
+++ b/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj
@@ -6,7 +6,7 @@
netcoreapp3.0
true
aspnetcore;identity;membership;razorpages
- true
+ true
true
Microsoft.AspNetCore.Mvc.ApplicationParts.NullApplicationPartFactory, Microsoft.AspNetCore.Mvc.Core
false
diff --git a/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj b/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj
index c31f9dabe6..80893bda8e 100644
--- a/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj
+++ b/src/Identity/test/Identity.FunctionalTests/Microsoft.AspNetCore.Identity.FunctionalTests.csproj
@@ -1,4 +1,4 @@
-
+
netcoreapp3.0
diff --git a/src/Installers/Archive/Archive.Internal.zipproj b/src/Installers/Archive/Archive.Internal.zipproj
index fe6c0c9c7e..4939325fd2 100644
--- a/src/Installers/Archive/Archive.Internal.zipproj
+++ b/src/Installers/Archive/Archive.Internal.zipproj
@@ -9,8 +9,8 @@
- $(RepositoryRoot)obj\ai\$(SharedFxRid)\
- $(InternalInstallerBaseName)-$(PackageVersion)-$(SharedFxRid)$(ArchiveExtension)
+ $(RepositoryRoot)obj\ai\$(TargetRuntimeIdentifier)\
+ $(InternalInstallerBaseName)-$(PackageVersion)-$(TargetRuntimeIdentifier)$(ArchiveExtension)
$(InstallersOutputPath)
$(InstallersOutputPath)$(OutputFileName)
@@ -47,5 +47,4 @@
Overwrite="true" />
-
diff --git a/src/Installers/Archive/Archive.Redist.zipproj b/src/Installers/Archive/Archive.Redist.zipproj
index c2c19617b6..5bd4b74373 100644
--- a/src/Installers/Archive/Archive.Redist.zipproj
+++ b/src/Installers/Archive/Archive.Redist.zipproj
@@ -9,18 +9,18 @@
$(RepositoryRoot)obj\ar\
- $(BaseIntermediateOutputPath)$(SharedFxRid)\
- $(RuntimeInstallerBaseName)-$(PackageVersion)-$(SharedFxRid)$(ArchiveExtension)
+ $(BaseIntermediateOutputPath)$(TargetRuntimeIdentifier)\
+ $(RuntimeInstallerBaseName)-$(PackageVersion)-$(TargetRuntimeIdentifier)$(ArchiveExtension)
$(InstallersOutputPath)
$(InstallersOutputPath)$(OutputFileName)
- dotnet-runtime-$(MicrosoftNETCoreAppPackageVersion)-$(SharedFxRid)$(ArchiveExtension)
+ dotnet-runtime-$(MicrosoftNETCoreAppPackageVersion)-$(TargetRuntimeIdentifier)$(ArchiveExtension)
$(DotNetAssetRootUrl)Runtime/$(MicrosoftNETCoreAppPackageVersion)/$(DotNetRuntimeArchiveFileName)
$(BaseIntermediateOutputPath)$(DotNetRuntimeArchiveFileName)
aspnetcore_base_runtime.version
$(OutputPath)$(BaseRuntimeVersionFileName)
- aspnetcore-runtime-$(SharedFxRid)-version-badge.svg
+ aspnetcore-runtime-$(TargetRuntimeIdentifier)-version-badge.svg
$(OutputPath)$(SvgBadgeFileName)
@@ -106,5 +106,4 @@
Overwrite="true" />
-
diff --git a/src/Installers/Debian/Runtime.debproj b/src/Installers/Debian/Runtime.debproj
index 7895bcd645..c1b4cbf907 100644
--- a/src/Installers/Debian/Runtime.debproj
+++ b/src/Installers/Debian/Runtime.debproj
@@ -10,7 +10,7 @@
$(RepositoryRoot)obj\Debian\$(MSBuildProjectName)\
- $(BaseIntermediateOutputPath)$(SharedFxRid)\
+ $(BaseIntermediateOutputPath)$(TargetRuntimeIdentifier)\
$(IntermediateOutputPath)package_root\
$(RuntimeInstallerBaseName)-$(SharedFxVersion)-x64.deb
@@ -51,7 +51,7 @@
-
+
@@ -96,8 +96,7 @@
-
- amd64
+ amd64
$(PackageId)_$(PackageVersion)-$(PackageRevision)_$(DebArch).deb
diff --git a/src/Installers/Directory.Build.props b/src/Installers/Directory.Build.props
index 489a37b2c8..b31d896477 100644
--- a/src/Installers/Directory.Build.props
+++ b/src/Installers/Directory.Build.props
@@ -8,7 +8,7 @@
$(RuntimeInstallerBaseName)-internal
.tar.gz
- .zip
+ .zip
diff --git a/src/Installers/Rpm/Rpm.props b/src/Installers/Rpm/Rpm.props
index f002b65eba..607f5ae374 100644
--- a/src/Installers/Rpm/Rpm.props
+++ b/src/Installers/Rpm/Rpm.props
@@ -8,7 +8,7 @@
$(RepositoryRoot)obj\Rpm\$(MSBuildProjectName)\
- $(BaseIntermediateOutputPath)$(SharedFxRid)\
+ $(BaseIntermediateOutputPath)$(TargetRuntimeIdentifier)\
$([MSBuild]::NormalizeDirectory('$(IntermediateOutputPath)content/'))
$(InstallersOutputPath)
diff --git a/src/Installers/Rpm/Rpm.targets b/src/Installers/Rpm/Rpm.targets
index ea8470f287..da8010bbd3 100644
--- a/src/Installers/Rpm/Rpm.targets
+++ b/src/Installers/Rpm/Rpm.targets
@@ -18,7 +18,7 @@
-
+
@@ -49,7 +49,7 @@
- amd64
+ amd64
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMIISExpressV1/AncmIISExpressV1.wixproj b/src/Installers/Windows/AspNetCoreModule-Setup/ANCMIISExpressV1/AncmIISExpressV1.wixproj
deleted file mode 100644
index a713211f99..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMIISExpressV1/AncmIISExpressV1.wixproj
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
- AspNetCoreModuleIISExpress
- true
- 2A6A4709-30D2-4716-A597-55DF0FB74D37
- Package
- ancm_iis_express_$(Platform)_en
- ICE03
- true
- 2.0
-
-
-
-
- $(WixExtDir)\WixUtilExtension.dll
- WixUtilExtension
-
-
- $(WixExtDir)\WixDependencyExtension.dll
- WixDependencyExtension
-
-
- $(WixExtDir)\WixUIExtension.dll
- WixUIExtension
-
-
-
-
-
- iisca.wxs
-
-
-
- setupstrings.wxl
-
-
- include.wxi
-
-
-
-
-
- aspnetcoreCA
- {7c27e72f-54d0-4820-8cfa-5e4be640974b}
- True
- True
-
-
-
-
-
-
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMIISExpressV1/ancm_iis_express.wxs b/src/Installers/Windows/AspNetCoreModule-Setup/ANCMIISExpressV1/ancm_iis_express.wxs
deleted file mode 100644
index 95838a853e..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMIISExpressV1/ancm_iis_express.wxs
+++ /dev/null
@@ -1,665 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Microsoft Corporation
-
-
-
-
-
-
-
-
-
-
- (NOT NEWERVERSIONFOUND) OR Installed
-
-
- Privileged
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- !(loc.Error30001)
- !(loc.Error30002)
-
- !(loc.WebServicesRunning)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMV1/AncmV1.wixproj b/src/Installers/Windows/AspNetCoreModule-Setup/ANCMV1/AncmV1.wixproj
deleted file mode 100644
index e9b0e79a40..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMV1/AncmV1.wixproj
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
- AspNetCoreModule
- true
- D36FDC38-FE53-48CC-BC82-A17C28F1CEE1
- true
- Package
- aspnetcoremodule_$(Platform)_en
- true
-
-
-
-
- $(WixExtDir)\WixUtilExtension.dll
- WixUtilExtension
-
-
- $(WixExtDir)\WixDependencyExtension.dll
- WixDependencyExtension
-
-
- $(WixExtDir)\WixUIExtension.dll
- WixUIExtension
-
-
-
-
-
- iisca.wxs
-
-
-
- setupstrings.wxl
-
-
- include.wxi
-
-
-
-
-
- aspnetcoreCA
- {7c27e72f-54d0-4820-8cfa-5e4be640974b}
- True
- True
-
-
-
-
-
-
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMV1/aspnetcoremodule.wxs b/src/Installers/Windows/AspNetCoreModule-Setup/ANCMV1/aspnetcoremodule.wxs
deleted file mode 100644
index 776ecfd404..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMV1/aspnetcoremodule.wxs
+++ /dev/null
@@ -1,270 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Microsoft Corporation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- (NOT NEWERVERSIONFOUND) OR Installed
-
-
-
- Privileged
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- = 601)]]>
-
-
-
-
- ((IISCOREWEBENGINEINSTALLED = "#1") AND (IISW3SVCINSTALLED = "#1")) OR (Installed)
-
-
-
-
- NOT ( (VersionNT = 600) AND (ServicePackLevel = 1) AND (WINDOWSUPDATE_START_TYPE = "#4") )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- !(loc.Error30001)
- !(loc.Error30002)
-
- !(loc.WebServicesRunning)
-
-
-
-
-
- AspNetCoreModule
- AspNetCoreModuleDll
-
-
-
-
-
- system.webServer/aspNetCore
- AspNetCoreSchemaFile
- Allow
-
-
-
-
-
- WWW Server
- {3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}
- ANCM
- 65536
- AspNetCoreModule
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMV2/aspnetcoremodulev2.wxs b/src/Installers/Windows/AspNetCoreModule-Setup/ANCMV2/aspnetcoremodulev2.wxs
index 7778785a64..87a66b5ddd 100644
--- a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMV2/aspnetcoremodulev2.wxs
+++ b/src/Installers/Windows/AspNetCoreModule-Setup/ANCMV2/aspnetcoremodulev2.wxs
@@ -51,6 +51,7 @@
Microsoft Corporation
+
@@ -274,7 +275,7 @@
-
+ OPT_NO_SHARED_CONFIG_CHECK=0 AND NOT Installed AND NOT REMOVE="ALL"
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/Directory.Build.props b/src/Installers/Windows/AspNetCoreModule-Setup/Directory.Build.props
index 88b706c2e7..186ba000da 100644
--- a/src/Installers/Windows/AspNetCoreModule-Setup/Directory.Build.props
+++ b/src/Installers/Windows/AspNetCoreModule-Setup/Directory.Build.props
@@ -1,6 +1,5 @@
-
@@ -41,12 +40,6 @@
-
- AspNetCoreV1WoW64
- True
- True
- false
-
AspNetCoreV2WoW64
True
@@ -60,12 +53,6 @@
false
-
- AspNetCoreV1
- True
- True
- false
-
AspNetCoreV2
True
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props b/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props
index 3dfffe943f..31d8887719 100644
--- a/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props
+++ b/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props
@@ -16,8 +16,6 @@
10.0.17134.0
$(IisOobWinSdkVersion)
Unicode
- bin\$(Configuration)\$(PlatformShortname)\
- obj\$(Configuration)\$(PlatformShortname)\
+
+
+ $(InstallersOutputPath)
+ $(InstallersOutputPath)
+ $(SharedFrameworkX64HarvestRootPath)aspnetcore-runtime-internal-$(PackageVersion)-win-x64.zip
+ $(SharedFrameworkX86HarvestRootPath)aspnetcore-runtime-internal-$(PackageVersion)-win-x86.zip
+
+
+
+
+
+
diff --git a/src/Installers/Windows/WindowsHostingBundle/ANCM.wxs b/src/Installers/Windows/WindowsHostingBundle/ANCM.wxs
index ce100ee0c0..47f2950fb2 100644
--- a/src/Installers/Windows/WindowsHostingBundle/ANCM.wxs
+++ b/src/Installers/Windows/WindowsHostingBundle/ANCM.wxs
@@ -1,36 +1,26 @@
-
+
-
-
-
-
+ InstallCondition="NOT VersionNT64 AND (VersionNT >= v6.1) AND (IISCoreWebEngineInstalled_x86=1) AND (IISW3SVCInstalled_x86=1) AND (NOT OPT_NO_ANCM)">
+
+
+ InstallCondition="VersionNT64 AND (VersionNT64 >= v6.1) AND (IISCoreWebEngineInstalled_x64=1) AND (IISW3SVCInstalled_x64=1) AND (NOT OPT_NO_ANCM)">
+
+
+
-
diff --git a/src/Installers/Windows/WindowsHostingBundle/WindowsHostingBundle.wixproj b/src/Installers/Windows/WindowsHostingBundle/WindowsHostingBundle.wixproj
index 1d926453e6..b042b37bfa 100644
--- a/src/Installers/Windows/WindowsHostingBundle/WindowsHostingBundle.wixproj
+++ b/src/Installers/Windows/WindowsHostingBundle/WindowsHostingBundle.wixproj
@@ -42,20 +42,6 @@
-
- Platform=x86
- AspNetCoreModule_x86
- D36FDC38-FE53-48CC-BC82-A17C28F1CEE1
- True
- true
-
-
- Platform=x64
- AspNetCoreModule_x64
- D36FDC38-FE53-48CC-BC82-A17C28F1CEE1
- True
- true
-
Platform=x86
AspNetCoreModuleV2_x86
diff --git a/src/Installers/Windows/build.ps1 b/src/Installers/Windows/build.ps1
index 252e850d37..e9cff09674 100644
--- a/src/Installers/Windows/build.ps1
+++ b/src/Installers/Windows/build.ps1
@@ -1,16 +1,13 @@
#requires -version 5
[cmdletbinding()]
param(
- [string]$Configuration = 'Debug',
- [Parameter(Mandatory = $true)]
+ [switch]$ci,
[Alias("x86")]
- [string]$Runtime86Zip,
- [Parameter(Mandatory = $true)]
+ [string]$sharedfx86harvestroot,
[Alias("x64")]
- [string]$Runtime64Zip,
- [string]$BuildNumber = 't000',
- [switch]$IsFinalBuild,
- [string]$SignType = ''
+ [string]$sharedfx64harvestroot,
+ [Parameter(ValueFromRemainingArguments = $true)]
+ [string[]]$AdditionalArgs
)
$ErrorActionPreference = 'Stop'
@@ -26,24 +23,24 @@ if ($clean) {
New-Item "$harvestRoot/x86", "$harvestRoot/x64" -ItemType Directory -ErrorAction Ignore | Out-Null
-if (-not (Test-Path "$harvestRoot/x86/shared/")) {
- Expand-Archive $Runtime86Zip -DestinationPath "$harvestRoot/x86"
+[string[]] $msbuildargs = @()
+if (-not $sharedfx86harvestroot) {
+ $msbuildargs += "-p:SharedFrameworkX86HarvestRootPath=$sharedfx86harvestroot"
}
-if (-not (Test-Path "$harvestRoot/x64/shared/")) {
- Expand-Archive $Runtime64Zip -DestinationPath "$harvestRoot/x64"
+if (-not $sharedfx64harvestroot) {
+ $msbuildargs += "-p:SharedFrameworkX64HarvestRootPath=$sharedfx64harvestroot"
}
Push-Location $PSScriptRoot
try {
& $repoRoot/build.ps1 `
- -Installers `
- "-p:SharedFrameworkHarvestRootPath=$repoRoot/obj/sfx/" `
- "-p:Configuration=$Configuration" `
- "-p:BuildNumberSuffix=$BuildNumber" `
- "-p:SignType=$SignType" `
- "-p:IsFinalBuild=$IsFinalBuild" `
- "-bl:$repoRoot/artifacts/logs/installers.msbuild.binlog"
+ -ci:$ci `
+ -sign `
+ -BuildInstallers `
+ "-bl:$repoRoot/artifacts/logs/installers.msbuild.binlog" `
+ @msbuildargs `
+ @AdditionalArgs
}
finally {
Pop-Location
diff --git a/src/Middleware/CORS/test/FunctionalTests/CORS.FunctionalTests.npmproj b/src/Middleware/CORS/test/FunctionalTests/CORS.FunctionalTests.npmproj
index 87da25f520..4581b617fc 100644
--- a/src/Middleware/CORS/test/FunctionalTests/CORS.FunctionalTests.npmproj
+++ b/src/Middleware/CORS/test/FunctionalTests/CORS.FunctionalTests.npmproj
@@ -12,5 +12,10 @@
false
+
+
+
+
+
diff --git a/src/Middleware/CORS/test/FunctionalTests/CorsMiddlewareFunctionalTest.cs b/src/Middleware/CORS/test/FunctionalTests/CorsMiddlewareFunctionalTest.cs
index 55d07ee94f..355dd0c658 100644
--- a/src/Middleware/CORS/test/FunctionalTests/CorsMiddlewareFunctionalTest.cs
+++ b/src/Middleware/CORS/test/FunctionalTests/CorsMiddlewareFunctionalTest.cs
@@ -8,6 +8,7 @@ using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Server.IntegrationTesting;
using Microsoft.AspNetCore.Testing;
+using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
using Xunit;
@@ -25,7 +26,8 @@ namespace FunctionalTests
public ITestOutputHelper Output { get; }
- [Theory]
+ [ConditionalTheory]
+ [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Disabling this test on OSX until we have a resolution for https://github.com/aspnet/AspNetCore-Internal/issues/1619")]
[InlineData("Startup")]
[InlineData("StartupWithoutEndpointRouting")]
public async Task RunClientTests(string startup)
@@ -39,7 +41,7 @@ namespace FunctionalTests
processStartInfo = new ProcessStartInfo
{
FileName = "cmd",
- Arguments = "/c npm test --no-color",
+ Arguments = "/c npm test --no-color --no-watchman",
};
}
else
@@ -47,9 +49,11 @@ namespace FunctionalTests
processStartInfo = new ProcessStartInfo
{
FileName = "npm",
- Arguments = "test",
+ Arguments = "test --no-watchman",
};
}
+ // Disallow the test from downloading \ installing chromium.
+ processStartInfo.Environment["PUPPETEER_SKIP_CHROMIUM_DOWNLOAD"] = "true";
// Act
var result = await ProcessManager.RunProcessAsync(processStartInfo, loggerFactory.CreateLogger("ProcessManager"));
diff --git a/src/Middleware/CORS/test/FunctionalTests/FunctionalTests.csproj b/src/Middleware/CORS/test/FunctionalTests/FunctionalTests.csproj
index 91ebcdd2a7..d59d1ff4cd 100644
--- a/src/Middleware/CORS/test/FunctionalTests/FunctionalTests.csproj
+++ b/src/Middleware/CORS/test/FunctionalTests/FunctionalTests.csproj
@@ -2,22 +2,18 @@
netcoreapp3.0
+ Cors.FunctionalTests
+ $(DefaultItemExcludes);node_modules\**\*
-
-
-
-
-
-
+
-
diff --git a/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj b/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj
index bdf570e00d..481720db16 100644
--- a/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj
+++ b/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj
@@ -6,7 +6,7 @@
$(NoWarn);CS1591
true
aspnetcore;diagnostics;entityframeworkcore
- true
+ true
diff --git a/src/Middleware/HealthChecks.EntityFrameworkCore/src/DependencyInjection/EntityFrameworkCoreHealthChecksBuilderExtensions.cs b/src/Middleware/HealthChecks.EntityFrameworkCore/src/DependencyInjection/EntityFrameworkCoreHealthChecksBuilderExtensions.cs
index bf299bc6b0..007eeaa586 100644
--- a/src/Middleware/HealthChecks.EntityFrameworkCore/src/DependencyInjection/EntityFrameworkCoreHealthChecksBuilderExtensions.cs
+++ b/src/Middleware/HealthChecks.EntityFrameworkCore/src/DependencyInjection/EntityFrameworkCoreHealthChecksBuilderExtensions.cs
@@ -41,12 +41,12 @@ namespace Microsoft.Extensions.DependencyInjection
///
/// By default the health check implementation will use the method
/// to test connectivity to the database. This method requires that the database provider has correctly implemented the
- /// interface. If the database provide has not implemented this interface
+ /// interface. If the database provide has not implemented this interface
/// then the health check will report a failure.
///
///
/// Providing a will replace the use of
- /// to test database connectivity. An implementation of a test query should handle exceptions that can arise due to connectivity failure,
+ /// to test database connectivity. An implementation of a test query should handle exceptions that can arise due to connectivity failure,
/// and should return a pass/fail result. The test query should be be designed to complete in a short and predicatable amount of time.
///
///
diff --git a/src/Middleware/HealthChecks.EntityFrameworkCore/src/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore.csproj b/src/Middleware/HealthChecks.EntityFrameworkCore/src/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore.csproj
index 2531c795a8..fd9542da8f 100644
--- a/src/Middleware/HealthChecks.EntityFrameworkCore/src/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore.csproj
+++ b/src/Middleware/HealthChecks.EntityFrameworkCore/src/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore.csproj
@@ -8,7 +8,7 @@
$(NoWarn);CS1591
true
diagnostics;healthchecks;entityframeworkcore
- true
+ true
Microsoft.Extensions.Diagnostics.HealthChecks
diff --git a/src/Middleware/MiddlewareAnalysis/src/Microsoft.AspNetCore.MiddlewareAnalysis.csproj b/src/Middleware/MiddlewareAnalysis/src/Microsoft.AspNetCore.MiddlewareAnalysis.csproj
index e9aec8c771..47fd76d040 100644
--- a/src/Middleware/MiddlewareAnalysis/src/Microsoft.AspNetCore.MiddlewareAnalysis.csproj
+++ b/src/Middleware/MiddlewareAnalysis/src/Microsoft.AspNetCore.MiddlewareAnalysis.csproj
@@ -6,7 +6,7 @@
$(NoWarn);CS1591
true
aspnetcore;diagnostics
- true
+ true
diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Prerendering.cshtml b/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Prerendering.cshtml
index bd5fff9df2..bda7d3df0e 100644
--- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Prerendering.cshtml
+++ b/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Prerendering.cshtml
@@ -4,7 +4,7 @@
This sample demonstrates how you can invoke a JavaScript module that contains
prerendering logic for a Single-Page Application framework.
-
+
Your prerendering boot function will receive parameters that describe the page
being rendered and any data supplied by the .NET code. The return value should be
a promise that resolves with data to be injected into the page, such as the
diff --git a/src/Middleware/NodeServices/src/Microsoft.AspNetCore.NodeServices.csproj b/src/Middleware/NodeServices/src/Microsoft.AspNetCore.NodeServices.csproj
index 8a1916ba5f..fc460f6afe 100644
--- a/src/Middleware/NodeServices/src/Microsoft.AspNetCore.NodeServices.csproj
+++ b/src/Middleware/NodeServices/src/Microsoft.AspNetCore.NodeServices.csproj
@@ -3,7 +3,7 @@
Invoke Node.js modules at runtime in ASP.NET Core applications.
netcoreapp3.0
- true
+ true
diff --git a/src/Middleware/ResponseCaching/src/Internal/FastGuid.cs b/src/Middleware/ResponseCaching/src/Internal/FastGuid.cs
index b62ba22f83..571227516b 100644
--- a/src/Middleware/ResponseCaching/src/Internal/FastGuid.cs
+++ b/src/Middleware/ResponseCaching/src/Internal/FastGuid.cs
@@ -1,4 +1,4 @@
-// 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.
using System;
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal
internal class FastGuid
{
// Base32 encoding - in ascii sort order for easy text based sorting
- private static readonly string _encode32Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
+ private static readonly char[] s_encode32Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUV".ToCharArray();
// Global ID
private static long NextId;
@@ -53,28 +53,25 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal
return new FastGuid(Interlocked.Increment(ref NextId));
}
- private static unsafe string GenerateGuidString(FastGuid guid)
+ private static string GenerateGuidString(FastGuid guid)
{
- // stackalloc to allocate array on stack rather than heap
- char* charBuffer = stackalloc char[13];
-
- // ID
- charBuffer[0] = _encode32Chars[(int)(guid.IdValue >> 60) & 31];
- charBuffer[1] = _encode32Chars[(int)(guid.IdValue >> 55) & 31];
- charBuffer[2] = _encode32Chars[(int)(guid.IdValue >> 50) & 31];
- charBuffer[3] = _encode32Chars[(int)(guid.IdValue >> 45) & 31];
- charBuffer[4] = _encode32Chars[(int)(guid.IdValue >> 40) & 31];
- charBuffer[5] = _encode32Chars[(int)(guid.IdValue >> 35) & 31];
- charBuffer[6] = _encode32Chars[(int)(guid.IdValue >> 30) & 31];
- charBuffer[7] = _encode32Chars[(int)(guid.IdValue >> 25) & 31];
- charBuffer[8] = _encode32Chars[(int)(guid.IdValue >> 20) & 31];
- charBuffer[9] = _encode32Chars[(int)(guid.IdValue >> 15) & 31];
- charBuffer[10] = _encode32Chars[(int)(guid.IdValue >> 10) & 31];
- charBuffer[11] = _encode32Chars[(int)(guid.IdValue >> 5) & 31];
- charBuffer[12] = _encode32Chars[(int)guid.IdValue & 31];
-
- // string ctor overload that takes char*
- return new string(charBuffer, 0, 13);
+ return string.Create(13, guid.IdValue, (buffer, value) =>
+ {
+ char[] encode32Chars = s_encode32Chars;
+ buffer[12] = encode32Chars[value & 31];
+ buffer[11] = encode32Chars[(value >> 5) & 31];
+ buffer[10] = encode32Chars[(value >> 10) & 31];
+ buffer[9] = encode32Chars[(value >> 15) & 31];
+ buffer[8] = encode32Chars[(value >> 20) & 31];
+ buffer[7] = encode32Chars[(value >> 25) & 31];
+ buffer[6] = encode32Chars[(value >> 30) & 31];
+ buffer[5] = encode32Chars[(value >> 35) & 31];
+ buffer[4] = encode32Chars[(value >> 40) & 31];
+ buffer[3] = encode32Chars[(value >> 45) & 31];
+ buffer[2] = encode32Chars[(value >> 50) & 31];
+ buffer[1] = encode32Chars[(value >> 55) & 31];
+ buffer[0] = encode32Chars[(value >> 60) & 31];
+ });
}
}
}
diff --git a/src/Middleware/ResponseCompression/test/ResponseCompressionMiddlewareTest.cs b/src/Middleware/ResponseCompression/test/ResponseCompressionMiddlewareTest.cs
index 4f5c6bf073..3c6be0aa8e 100644
--- a/src/Middleware/ResponseCompression/test/ResponseCompressionMiddlewareTest.cs
+++ b/src/Middleware/ResponseCompression/test/ResponseCompressionMiddlewareTest.cs
@@ -14,6 +14,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.TestHost;
+using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
@@ -460,7 +461,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
[MemberData(nameof(SupportedEncodingsWithBodyLength))]
public async Task FlushHeaders_SendsHeaders_Compresses(string encoding, int expectedBodyLength)
{
- var responseReceived = new ManualResetEvent(false);
+ var responseReceived = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var builder = new WebHostBuilder()
.ConfigureServices(services =>
@@ -470,13 +471,13 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
.Configure(app =>
{
app.UseResponseCompression();
- app.Run(context =>
+ app.Run(async context =>
{
context.Response.Headers[HeaderNames.ContentMD5] = "MD5";
context.Response.ContentType = TextPlain;
context.Response.Body.Flush();
- Assert.True(responseReceived.WaitOne(TimeSpan.FromSeconds(3)));
- return context.Response.WriteAsync(new string('a', 100));
+ await responseReceived.Task.TimeoutAfter(TimeSpan.FromSeconds(3));
+ await context.Response.WriteAsync(new string('a', 100));
});
});
@@ -487,7 +488,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
request.Headers.AcceptEncoding.ParseAdd(encoding);
var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
- responseReceived.Set();
+ responseReceived.SetResult(0);
await response.Content.LoadIntoBufferAsync();
@@ -498,7 +499,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
[MemberData(nameof(SupportedEncodingsWithBodyLength))]
public async Task FlushAsyncHeaders_SendsHeaders_Compresses(string encoding, int expectedBodyLength)
{
- var responseReceived = new ManualResetEvent(false);
+ var responseReceived = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var builder = new WebHostBuilder()
.ConfigureServices(services =>
@@ -513,7 +514,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
context.Response.Headers[HeaderNames.ContentMD5] = "MD5";
context.Response.ContentType = TextPlain;
await context.Response.Body.FlushAsync();
- Assert.True(responseReceived.WaitOne(TimeSpan.FromSeconds(3)));
+ await responseReceived.Task.TimeoutAfter(TimeSpan.FromSeconds(3));
await context.Response.WriteAsync(new string('a', 100));
});
});
@@ -525,7 +526,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
request.Headers.AcceptEncoding.ParseAdd(encoding);
var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
- responseReceived.Set();
+ responseReceived.SetResult(0);
await response.Content.LoadIntoBufferAsync();
@@ -536,7 +537,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
[MemberData(nameof(SupportedEncodings))]
public async Task FlushBody_CompressesAndFlushes(string encoding)
{
- var responseReceived = new ManualResetEvent(false);
+ var responseReceived = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var builder = new WebHostBuilder()
.ConfigureServices(services =>
@@ -546,7 +547,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
.Configure(app =>
{
app.UseResponseCompression();
- app.Run(context =>
+ app.Run(async context =>
{
var feature = context.Features.Get();
if (feature != null)
@@ -558,9 +559,8 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
context.Response.ContentType = TextPlain;
context.Response.Body.Write(new byte[10], 0, 10);
context.Response.Body.Flush();
- Assert.True(responseReceived.WaitOne(TimeSpan.FromSeconds(3)));
+ await responseReceived.Task.TimeoutAfter(TimeSpan.FromSeconds(3));
context.Response.Body.Write(new byte[90], 0, 90);
- return Task.FromResult(0);
});
});
@@ -579,7 +579,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
var read = await body.ReadAsync(new byte[100], 0, 100);
Assert.True(read > 0);
- responseReceived.Set();
+ responseReceived.SetResult(0);
read = await body.ReadAsync(new byte[100], 0, 100);
Assert.True(read > 0);
@@ -589,7 +589,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
[MemberData(nameof(SupportedEncodings))]
public async Task FlushAsyncBody_CompressesAndFlushes(string encoding)
{
- var responseReceived = new ManualResetEvent(false);
+ var responseReceived = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var builder = new WebHostBuilder()
.ConfigureServices(services =>
@@ -605,7 +605,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
context.Response.ContentType = TextPlain;
await context.Response.WriteAsync(new string('a', 10));
await context.Response.Body.FlushAsync();
- Assert.True(responseReceived.WaitOne(TimeSpan.FromSeconds(3)));
+ await responseReceived.Task.TimeoutAfter(TimeSpan.FromSeconds(3));
await context.Response.WriteAsync(new string('a', 90));
});
});
@@ -625,7 +625,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
var read = await body.ReadAsync(new byte[100], 0, 100);
Assert.True(read > 0);
- responseReceived.Set();
+ responseReceived.SetResult(0);
read = await body.ReadAsync(new byte[100], 0, 100);
Assert.True(read > 0);
@@ -637,11 +637,11 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
{
var responseReceived = new[]
{
- new ManualResetEvent(false),
- new ManualResetEvent(false),
- new ManualResetEvent(false),
- new ManualResetEvent(false),
- new ManualResetEvent(false),
+ new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously),
+ new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously),
+ new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously),
+ new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously),
+ new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously),
};
var builder = new WebHostBuilder()
@@ -652,7 +652,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
.Configure(app =>
{
app.UseResponseCompression();
- app.Run(context =>
+ app.Run(async context =>
{
context.Response.Headers[HeaderNames.ContentMD5] = "MD5";
context.Response.ContentType = TextPlain;
@@ -668,9 +668,8 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
{
context.Response.Body.Write(new byte[1], 0, 1);
context.Response.Body.Flush();
- Assert.True(signal.WaitOne(TimeSpan.FromSeconds(3)));
+ await signal.Task.TimeoutAfter(TimeSpan.FromSeconds(3));
}
- return Task.FromResult(0);
});
});
@@ -691,7 +690,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
var read = await body.ReadAsync(new byte[100], 0, 100);
Assert.True(read > 0);
- signal.Set();
+ signal.SetResult(0);
}
}
@@ -701,11 +700,11 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
{
var responseReceived = new[]
{
- new ManualResetEvent(false),
- new ManualResetEvent(false),
- new ManualResetEvent(false),
- new ManualResetEvent(false),
- new ManualResetEvent(false),
+ new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously),
+ new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously),
+ new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously),
+ new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously),
+ new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously),
};
var builder = new WebHostBuilder()
@@ -726,7 +725,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
{
await context.Response.WriteAsync("a");
await context.Response.Body.FlushAsync();
- Assert.True(signal.WaitOne(TimeSpan.FromSeconds(3)));
+ await signal.Task.TimeoutAfter(TimeSpan.FromSeconds(3));
}
});
});
@@ -748,7 +747,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
var read = await body.ReadAsync(new byte[100], 0, 100);
Assert.True(read > 0);
- signal.Set();
+ signal.SetResult(0);
}
}
@@ -918,7 +917,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
[MemberData(nameof(SupportedEncodings))]
public async Task Dispose_SyncWriteOrFlushNotCalled(string encoding)
{
- var responseReceived = new ManualResetEvent(false);
+ var responseReceived = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var builder = new WebHostBuilder()
.ConfigureServices(services =>
@@ -939,7 +938,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
context.Response.ContentType = TextPlain;
await context.Response.WriteAsync(new string('a', 10));
await context.Response.Body.FlushAsync();
- Assert.True(responseReceived.WaitOne(TimeSpan.FromSeconds(3)));
+ await responseReceived.Task.TimeoutAfter(TimeSpan.FromSeconds(3));
await context.Response.WriteAsync(new string('a', 90));
});
});
@@ -959,7 +958,7 @@ namespace Microsoft.AspNetCore.ResponseCompression.Tests
var read = await body.ReadAsync(new byte[100], 0, 100);
Assert.True(read > 0);
- responseReceived.Set();
+ responseReceived.SetResult(0);
read = await body.ReadAsync(new byte[100], 0, 100);
Assert.True(read > 0);
diff --git a/src/Middleware/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj b/src/Middleware/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj
index 482fb519dd..02741c62dc 100644
--- a/src/Middleware/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj
+++ b/src/Middleware/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj
@@ -3,13 +3,11 @@
Helpers for building single-page applications on ASP.NET MVC Core.
netcoreapp3.0
+ true
-
-
-
diff --git a/src/Middleware/SpaServices/src/Microsoft.AspNetCore.SpaServices.csproj b/src/Middleware/SpaServices/src/Microsoft.AspNetCore.SpaServices.csproj
index a0df83dcfd..94ff1d4f92 100644
--- a/src/Middleware/SpaServices/src/Microsoft.AspNetCore.SpaServices.csproj
+++ b/src/Middleware/SpaServices/src/Microsoft.AspNetCore.SpaServices.csproj
@@ -3,7 +3,7 @@
Helpers for building single-page applications on ASP.NET MVC Core.
netcoreapp3.0
- true
+ true
diff --git a/src/Middleware/StaticFiles/src/StaticFileContext.cs b/src/Middleware/StaticFiles/src/StaticFileContext.cs
index d6f0d72779..7473db4f36 100644
--- a/src/Middleware/StaticFiles/src/StaticFileContext.cs
+++ b/src/Middleware/StaticFiles/src/StaticFileContext.cs
@@ -233,7 +233,7 @@ namespace Microsoft.AspNetCore.StaticFiles
// the Range header field.
if (ifRangeHeader.LastModified.HasValue)
{
- if (_lastModified !=null && _lastModified > ifRangeHeader.LastModified)
+ if (_lastModified > ifRangeHeader.LastModified)
{
_isRangeRequest = false;
}
diff --git a/src/Middleware/StaticFiles/test/FunctionalTests/Microsoft.AspNetCore.StaticFiles.FunctionalTests.csproj b/src/Middleware/StaticFiles/test/FunctionalTests/Microsoft.AspNetCore.StaticFiles.FunctionalTests.csproj
index 3f5e2d4a75..ee5ff33e91 100644
--- a/src/Middleware/StaticFiles/test/FunctionalTests/Microsoft.AspNetCore.StaticFiles.FunctionalTests.csproj
+++ b/src/Middleware/StaticFiles/test/FunctionalTests/Microsoft.AspNetCore.StaticFiles.FunctionalTests.csproj
@@ -22,12 +22,12 @@
-
+
+
-
diff --git a/src/Middleware/StaticFiles/test/FunctionalTests/StaticFileMiddlewareTests.cs b/src/Middleware/StaticFiles/test/FunctionalTests/StaticFileMiddlewareTests.cs
index 268accc699..0f9be47e97 100644
--- a/src/Middleware/StaticFiles/test/FunctionalTests/StaticFileMiddlewareTests.cs
+++ b/src/Middleware/StaticFiles/test/FunctionalTests/StaticFileMiddlewareTests.cs
@@ -16,6 +16,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.IntegrationTesting;
using Microsoft.AspNetCore.Server.IntegrationTesting.Common;
+using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Testing;
@@ -164,25 +165,25 @@ namespace Microsoft.AspNetCore.StaticFiles
};
[Fact]
- public void ClientDisconnect_Kestrel_NoWriteExceptionThrown()
+ public Task ClientDisconnect_Kestrel_NoWriteExceptionThrown()
{
- ClientDisconnect_NoWriteExceptionThrown(ServerType.Kestrel);
+ return ClientDisconnect_NoWriteExceptionThrown(ServerType.Kestrel);
}
[ConditionalFact]
[OSSkipCondition(OperatingSystems.Linux)]
[OSSkipCondition(OperatingSystems.MacOSX)]
- public void ClientDisconnect_WebListener_NoWriteExceptionThrown()
+ public Task ClientDisconnect_WebListener_NoWriteExceptionThrown()
{
- ClientDisconnect_NoWriteExceptionThrown(ServerType.HttpSys);
+ return ClientDisconnect_NoWriteExceptionThrown(ServerType.HttpSys);
}
- private void ClientDisconnect_NoWriteExceptionThrown(ServerType serverType)
+ private async Task ClientDisconnect_NoWriteExceptionThrown(ServerType serverType)
{
var interval = TimeSpan.FromSeconds(15);
- var requestReceived = new ManualResetEvent(false);
- var requestCancelled = new ManualResetEvent(false);
- var responseComplete = new ManualResetEvent(false);
+ var requestReceived = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var requestCancelled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var responseComplete = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
Exception exception = null;
var builder = new WebHostBuilder()
.ConfigureServices(services => services.AddSingleton(LoggerFactory))
@@ -193,8 +194,8 @@ namespace Microsoft.AspNetCore.StaticFiles
{
try
{
- requestReceived.Set();
- Assert.True(requestCancelled.WaitOne(interval), "not cancelled");
+ requestReceived.SetResult(0);
+ await requestCancelled.Task.TimeoutAfter(interval);
Assert.True(context.RequestAborted.WaitHandle.WaitOne(interval), "not aborted");
await next();
}
@@ -202,7 +203,7 @@ namespace Microsoft.AspNetCore.StaticFiles
{
exception = ex;
}
- responseComplete.Set();
+ responseComplete.SetResult(0);
});
app.UseStaticFiles();
});
@@ -220,13 +221,13 @@ namespace Microsoft.AspNetCore.StaticFiles
{
// We don't use HttpClient here because it's disconnect behavior varies across platforms.
var socket = SendSocketRequestAsync(server.GetAddress(), "/TestDocument1MB.txt");
- Assert.True(requestReceived.WaitOne(interval), "not received");
+ await requestReceived.Task.TimeoutAfter(interval);
socket.LingerState = new LingerOption(true, 0);
socket.Dispose();
- requestCancelled.Set();
+ requestCancelled.SetResult(0);
- Assert.True(responseComplete.WaitOne(interval), "not completed");
+ await responseComplete.Task.TimeoutAfter(interval);
Assert.Null(exception);
}
}
diff --git a/src/Middleware/WebSockets/src/WebSocketMiddleware.cs b/src/Middleware/WebSockets/src/WebSocketMiddleware.cs
index 8f2c4dd717..bb9d7bea08 100644
--- a/src/Middleware/WebSockets/src/WebSocketMiddleware.cs
+++ b/src/Middleware/WebSockets/src/WebSocketMiddleware.cs
@@ -48,12 +48,6 @@ namespace Microsoft.AspNetCore.WebSockets
// TODO: validate options.
}
- [Obsolete("This constructor has been replaced with an equivalent constructor which requires an ILoggerFactory.")]
- public WebSocketMiddleware(RequestDelegate next, IOptions options)
- : this(next, options, NullLoggerFactory.Instance)
- {
- }
-
public Task Invoke(HttpContext context)
{
// Detect if an opaque upgrade is available. If so, add a websocket upgrade.
diff --git a/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/AutobahnTestApp.csproj b/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/AutobahnTestApp.csproj
index ee6c43d6d2..27988f2008 100644
--- a/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/AutobahnTestApp.csproj
+++ b/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/AutobahnTestApp.csproj
@@ -10,20 +10,13 @@
-
-
-
-
-
-
-
+
+
+
+
-
-
-
-
diff --git a/src/Middleware/WebSockets/test/ConformanceTests/Microsoft.AspNetCore.WebSockets.ConformanceTests.csproj b/src/Middleware/WebSockets/test/ConformanceTests/Microsoft.AspNetCore.WebSockets.ConformanceTests.csproj
index 5b009d7d65..45aefa89d5 100644
--- a/src/Middleware/WebSockets/test/ConformanceTests/Microsoft.AspNetCore.WebSockets.ConformanceTests.csproj
+++ b/src/Middleware/WebSockets/test/ConformanceTests/Microsoft.AspNetCore.WebSockets.ConformanceTests.csproj
@@ -6,11 +6,10 @@
-
-
+
-
+
diff --git a/src/Middleware/WebSockets/test/UnitTests/Microsoft.AspNetCore.WebSockets.Tests.csproj b/src/Middleware/WebSockets/test/UnitTests/Microsoft.AspNetCore.WebSockets.Tests.csproj
index fd13f1944f..879ed1707b 100644
--- a/src/Middleware/WebSockets/test/UnitTests/Microsoft.AspNetCore.WebSockets.Tests.csproj
+++ b/src/Middleware/WebSockets/test/UnitTests/Microsoft.AspNetCore.WebSockets.Tests.csproj
@@ -5,7 +5,8 @@
-
+
+
diff --git a/src/MusicStore/MusicStore.sln b/src/MusicStore/MusicStore.sln
index 7c9bd93ac3..5e27218a86 100644
--- a/src/MusicStore/MusicStore.sln
+++ b/src/MusicStore/MusicStore.sln
@@ -1,64 +1,1085 @@
+
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.12
MinimumVisualStudioVersion = 15.0.26730.03
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7D749BDA-4638-4517-B66A-D40DEDEEB141}"
- ProjectSection(SolutionItems) = preProject
- .appveyor.yml = .appveyor.yml
- .travis.yml = .travis.yml
- Directory.Build.props = Directory.Build.props
- Directory.Build.targets = Directory.Build.targets
- NuGet.config = NuGet.config
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{B7B176B6-8D4D-4EF1-BBD2-DDA650C78FFF}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{363D2681-31A6-48C9-90BB-9ACFF4A41F06}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusicStore", "samples\MusicStore\MusicStore.csproj", "{3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusicStore.Test", "test\MusicStore.Test\MusicStore.Test.csproj", "{CA663205-77DE-4E55-B300-85594181B5A9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusicStore.E2ETests", "test\MusicStore.E2ETests\MusicStore.E2ETests.csproj", "{72A5F455-121F-4954-BF28-D712C6BE88EA}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{88A30728-49E5-46C5-9CEC-9D8FD346A043}"
- ProjectSection(SolutionItems) = preProject
- build\dependencies.props = build\dependencies.props
- build\repo.props = build\repo.props
- build\repo.targets = build\repo.targets
- build\sources.props = build\sources.props
- EndProjectSection
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Antiforgery", "..\Antiforgery\src\Microsoft.AspNetCore.Antiforgery.csproj", "{DECBCA36-8E91-4A46-914D-832ECCE7D3F4}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.DataProtection.Abstractions", "..\DataProtection\Abstractions\src\Microsoft.AspNetCore.DataProtection.Abstractions.csproj", "{28C13B1C-3037-453F-B6CD-B30FC8106E06}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Cryptography.Internal", "..\DataProtection\Cryptography.Internal\src\Microsoft.AspNetCore.Cryptography.Internal.csproj", "{F189E09E-0C64-4A20-B148-D6502D3CD166}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Cryptography.KeyDerivation", "..\DataProtection\Cryptography.KeyDerivation\src\Microsoft.AspNetCore.Cryptography.KeyDerivation.csproj", "{809B5BC8-F020-4B78-9FD2-FC8704FA89D9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.DataProtection", "..\DataProtection\DataProtection\src\Microsoft.AspNetCore.DataProtection.csproj", "{7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore", "..\DefaultBuilder\src\Microsoft.AspNetCore.csproj", "{DB308907-C606-4C31-B55B-E8CC2625FE8A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.Abstractions", "..\Hosting\Abstractions\src\Microsoft.AspNetCore.Hosting.Abstractions.csproj", "{6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting", "..\Hosting\Hosting\src\Microsoft.AspNetCore.Hosting.csproj", "{6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.Server.Abstractions", "..\Hosting\Server.Abstractions\src\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj", "{C73F656D-41B6-4610-B9DD-8B0F5C2589EC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IntegrationTesting", "..\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj", "{7F5C0B6A-006E-456F-A806-1B0F502A9D84}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Html.Abstractions", "..\Html\Abstractions\src\Microsoft.AspNetCore.Html.Abstractions.csproj", "{04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Abstractions", "..\Http\Authentication.Abstractions\src\Microsoft.AspNetCore.Authentication.Abstractions.csproj", "{1812726B-6B81-4038-B1A0-C42A7CB6E83E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Core", "..\Http\Authentication.Core\src\Microsoft.AspNetCore.Authentication.Core.csproj", "{A567F04F-2C85-4D09-8C86-26A88F20C729}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Net.Http.Headers", "..\Http\Headers\src\Microsoft.Net.Http.Headers.csproj", "{406B4B46-6289-4061-984A-1DD9C9B6D329}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Abstractions", "..\Http\Http.Abstractions\src\Microsoft.AspNetCore.Http.Abstractions.csproj", "{CB0A64E2-DD42-43D9-B253-D94C2487BA0E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Extensions", "..\Http\Http.Extensions\src\Microsoft.AspNetCore.Http.Extensions.csproj", "{FC4215EC-D185-4698-AC55-ED953E10B042}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Features", "..\Http\Http.Features\src\Microsoft.AspNetCore.Http.Features.csproj", "{8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http", "..\Http\Http\src\Microsoft.AspNetCore.Http.csproj", "{7483F392-F394-46D6-9909-074D84CF09D3}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Routing.Abstractions", "..\Http\Routing.Abstractions\src\Microsoft.AspNetCore.Routing.Abstractions.csproj", "{144D7C8F-AF14-43EE-9720-EA4CF20F9C08}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Routing", "..\Http\Routing\src\Microsoft.AspNetCore.Routing.csproj", "{9F2C5373-27A5-4357-8A7A-4F22176AD5D7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.WebUtilities", "..\Http\WebUtilities\src\Microsoft.AspNetCore.WebUtilities.csproj", "{7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity", "..\Identity\Core\src\Microsoft.AspNetCore.Identity.csproj", "{CF91C6AB-B977-41FE-B26A-D8095BBF4213}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.EntityFrameworkCore", "..\Identity\EntityFrameworkCore\src\Microsoft.AspNetCore.Identity.EntityFrameworkCore.csproj", "{95F6D15B-293F-4E23-BCC6-FD81B40E886B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Identity.Core", "..\Identity\Extensions.Core\src\Microsoft.Extensions.Identity.Core.csproj", "{3ADD636D-4F44-4941-838E-ED399C080D19}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Identity.Stores", "..\Identity\Extensions.Stores\src\Microsoft.Extensions.Identity.Stores.csproj", "{4D95736B-7CC7-4CBE-BCA4-131F23D5D992}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Cors", "..\Middleware\CORS\src\Microsoft.AspNetCore.Cors.csproj", "{004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Diagnostics.Abstractions", "..\Middleware\Diagnostics.Abstractions\src\Microsoft.AspNetCore.Diagnostics.Abstractions.csproj", "{00447948-6BDD-4C7E-829A-06094B6F10D2}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore", "..\Middleware\Diagnostics.EntityFrameworkCore\src\Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj", "{8D8F84CB-2E48-42D3-8E48-D6213290FFB9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Diagnostics", "..\Middleware\Diagnostics\src\Microsoft.AspNetCore.Diagnostics.csproj", "{FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.HostFiltering", "..\Middleware\HostFiltering\src\Microsoft.AspNetCore.HostFiltering.csproj", "{353FE180-8B31-4947-9407-3FA1EE8DA8B9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.HttpOverrides", "..\Middleware\HttpOverrides\src\Microsoft.AspNetCore.HttpOverrides.csproj", "{11B29D93-5CD7-4282-98C8-124E5B16DD3F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Localization", "..\Middleware\Localization\src\Microsoft.AspNetCore.Localization.csproj", "{7FB812C6-617D-41C3-A08D-57CE93A9AA18}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.ResponseCaching.Abstractions", "..\Middleware\ResponseCaching.Abstractions\src\Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj", "{2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Session", "..\Middleware\Session\src\Microsoft.AspNetCore.Session.csproj", "{A73934B4-9A86-412B-B619-A6682183DF25}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.StaticFiles", "..\Middleware\StaticFiles\src\Microsoft.AspNetCore.StaticFiles.csproj", "{C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Abstractions", "..\Mvc\src\Microsoft.AspNetCore.Mvc.Abstractions\Microsoft.AspNetCore.Mvc.Abstractions.csproj", "{4ECBDB74-B257-4B06-9872-28BD4D778735}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Analyzers", "..\Mvc\src\Microsoft.AspNetCore.Mvc.Analyzers\Microsoft.AspNetCore.Mvc.Analyzers.csproj", "{BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.ApiExplorer", "..\Mvc\src\Microsoft.AspNetCore.Mvc.ApiExplorer\Microsoft.AspNetCore.Mvc.ApiExplorer.csproj", "{3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Core", "..\Mvc\src\Microsoft.AspNetCore.Mvc.Core\Microsoft.AspNetCore.Mvc.Core.csproj", "{896752D7-939A-4BE0-BB75-1132A516D41D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Cors", "..\Mvc\src\Microsoft.AspNetCore.Mvc.Cors\Microsoft.AspNetCore.Mvc.Cors.csproj", "{D8ED97C5-C491-4D4B-8B01-435835E7AAA9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.DataAnnotations", "..\Mvc\src\Microsoft.AspNetCore.Mvc.DataAnnotations\Microsoft.AspNetCore.Mvc.DataAnnotations.csproj", "{6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Localization", "..\Mvc\src\Microsoft.AspNetCore.Mvc.Localization\Microsoft.AspNetCore.Mvc.Localization.csproj", "{B6F13159-2E4D-4F86-A2F2-AFD3536105DA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Razor", "..\Mvc\src\Microsoft.AspNetCore.Mvc.Razor\Microsoft.AspNetCore.Mvc.Razor.csproj", "{3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.RazorPages", "..\Mvc\src\Microsoft.AspNetCore.Mvc.RazorPages\Microsoft.AspNetCore.Mvc.RazorPages.csproj", "{688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.TagHelpers", "..\Mvc\src\Microsoft.AspNetCore.Mvc.TagHelpers\Microsoft.AspNetCore.Mvc.TagHelpers.csproj", "{E2589D5F-F774-413F-B26A-DF2173565B6C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.ViewFeatures", "..\Mvc\src\Microsoft.AspNetCore.Mvc.ViewFeatures\Microsoft.AspNetCore.Mvc.ViewFeatures.csproj", "{D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc", "..\Mvc\src\Microsoft.AspNetCore.Mvc\Microsoft.AspNetCore.Mvc.csproj", "{3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Runtime", "..\Razor\Razor.Runtime\src\Microsoft.AspNetCore.Razor.Runtime.csproj", "{C2C58C19-DF71-4E78-A658-84AF01146637}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor", "..\Razor\Razor\src\Microsoft.AspNetCore.Razor.csproj", "{7BDC3249-5402-4DFF-A34B-C2E8262568AB}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Cookies", "..\Security\Authentication\Cookies\src\Microsoft.AspNetCore.Authentication.Cookies.csproj", "{2F9FF701-31CA-43D9-9212-21CF3640F54F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication", "..\Security\Authentication\Core\src\Microsoft.AspNetCore.Authentication.csproj", "{50B6D43E-2677-4818-923E-54EF513675F8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Facebook", "..\Security\Authentication\Facebook\src\Microsoft.AspNetCore.Authentication.Facebook.csproj", "{3B68E545-0B46-4089-B46C-29A01EC6BF30}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Google", "..\Security\Authentication\Google\src\Microsoft.AspNetCore.Authentication.Google.csproj", "{1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.MicrosoftAccount", "..\Security\Authentication\MicrosoftAccount\src\Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj", "{121C4468-A224-4DDB-B7C5-704EE0319A26}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.OAuth", "..\Security\Authentication\OAuth\src\Microsoft.AspNetCore.Authentication.OAuth.csproj", "{D593E79F-22A8-45A4-A34A-187B3D383A21}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.OpenIdConnect", "..\Security\Authentication\OpenIdConnect\src\Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj", "{42F24A07-6C68-4E5E-B533-01AE81FCFB0D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Twitter", "..\Security\Authentication\Twitter\src\Microsoft.AspNetCore.Authentication.Twitter.csproj", "{8305691A-DD86-4BB3-B79A-DBB28980EE5A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authorization", "..\Security\Authorization\Core\src\Microsoft.AspNetCore.Authorization.csproj", "{99CCB774-5298-4E22-8F56-073B231D0A3D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authorization.Policy", "..\Security\Authorization\Policy\src\Microsoft.AspNetCore.Authorization.Policy.csproj", "{39AEA24E-6D73-4EB1-9773-5BCF02957AC7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Connections.Abstractions", "..\Servers\Connections.Abstractions\src\Microsoft.AspNetCore.Connections.Abstractions.csproj", "{B4C977F0-9027-4728-9F50-C895E71582A5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.HttpSys", "..\Servers\HttpSys\src\Microsoft.AspNetCore.Server.HttpSys.csproj", "{D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IIS", "..\Servers\IIS\IIS\src\Microsoft.AspNetCore.Server.IIS.csproj", "{E12AA11A-AD3B-42A3-9200-C22644959EA8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IISIntegration", "..\Servers\IIS\IISIntegration\src\Microsoft.AspNetCore.Server.IISIntegration.csproj", "{CA51F9EF-137E-4679-AFBC-298FCDF027E1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IntegrationTesting.IIS", "..\Servers\IIS\IntegrationTesting.IIS\src\Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj", "{7A3B24E6-3620-4018-A7BE-DE5B3BB38137}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel.Core", "..\Servers\Kestrel\Core\src\Microsoft.AspNetCore.Server.Kestrel.Core.csproj", "{501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel", "..\Servers\Kestrel\Kestrel\src\Microsoft.AspNetCore.Server.Kestrel.csproj", "{FFA9F547-B412-47D3-AA65-581B51F765A8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions", "..\Servers\Kestrel\Transport.Abstractions\src\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.csproj", "{658DAA95-3941-448A-AF39-C2826043716D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets", "..\Servers\Kestrel\Transport.Sockets\src\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj", "{3F5589F9-5D13-4662-96C6-52367D14061C}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dependencies", "dependencies", "{B21EACAA-1EBC-45D3-8831-8A8E7888CD03}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
- RuntimeStore|Any CPU = RuntimeStore|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}.Debug|x64.ActiveCfg = Debug|x64
+ {3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}.Debug|x64.Build.0 = Debug|x64
+ {3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}.Debug|x86.ActiveCfg = Debug|x86
+ {3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}.Debug|x86.Build.0 = Debug|x86
{3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}.Release|Any CPU.ActiveCfg = Release|x86
- {3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}.RuntimeStore|Any CPU.ActiveCfg = RuntimeStore|x86
+ {3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}.Release|x64.ActiveCfg = Release|x64
+ {3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}.Release|x64.Build.0 = Release|x64
+ {3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}.Release|x86.ActiveCfg = Release|x86
+ {3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0}.Release|x86.Build.0 = Release|x86
{CA663205-77DE-4E55-B300-85594181B5A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CA663205-77DE-4E55-B300-85594181B5A9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CA663205-77DE-4E55-B300-85594181B5A9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CA663205-77DE-4E55-B300-85594181B5A9}.Debug|x64.Build.0 = Debug|Any CPU
+ {CA663205-77DE-4E55-B300-85594181B5A9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CA663205-77DE-4E55-B300-85594181B5A9}.Debug|x86.Build.0 = Debug|Any CPU
{CA663205-77DE-4E55-B300-85594181B5A9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CA663205-77DE-4E55-B300-85594181B5A9}.Release|Any CPU.Build.0 = Release|Any CPU
- {CA663205-77DE-4E55-B300-85594181B5A9}.RuntimeStore|Any CPU.ActiveCfg = Release|Any CPU
- {CA663205-77DE-4E55-B300-85594181B5A9}.RuntimeStore|Any CPU.Build.0 = Release|Any CPU
+ {CA663205-77DE-4E55-B300-85594181B5A9}.Release|x64.ActiveCfg = Release|Any CPU
+ {CA663205-77DE-4E55-B300-85594181B5A9}.Release|x64.Build.0 = Release|Any CPU
+ {CA663205-77DE-4E55-B300-85594181B5A9}.Release|x86.ActiveCfg = Release|Any CPU
+ {CA663205-77DE-4E55-B300-85594181B5A9}.Release|x86.Build.0 = Release|Any CPU
{72A5F455-121F-4954-BF28-D712C6BE88EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{72A5F455-121F-4954-BF28-D712C6BE88EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {72A5F455-121F-4954-BF28-D712C6BE88EA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {72A5F455-121F-4954-BF28-D712C6BE88EA}.Debug|x64.Build.0 = Debug|Any CPU
+ {72A5F455-121F-4954-BF28-D712C6BE88EA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {72A5F455-121F-4954-BF28-D712C6BE88EA}.Debug|x86.Build.0 = Debug|Any CPU
{72A5F455-121F-4954-BF28-D712C6BE88EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{72A5F455-121F-4954-BF28-D712C6BE88EA}.Release|Any CPU.Build.0 = Release|Any CPU
- {72A5F455-121F-4954-BF28-D712C6BE88EA}.RuntimeStore|Any CPU.ActiveCfg = Release|Any CPU
- {72A5F455-121F-4954-BF28-D712C6BE88EA}.RuntimeStore|Any CPU.Build.0 = Release|Any CPU
+ {72A5F455-121F-4954-BF28-D712C6BE88EA}.Release|x64.ActiveCfg = Release|Any CPU
+ {72A5F455-121F-4954-BF28-D712C6BE88EA}.Release|x64.Build.0 = Release|Any CPU
+ {72A5F455-121F-4954-BF28-D712C6BE88EA}.Release|x86.ActiveCfg = Release|Any CPU
+ {72A5F455-121F-4954-BF28-D712C6BE88EA}.Release|x86.Build.0 = Release|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Debug|x64.Build.0 = Debug|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Debug|x86.Build.0 = Debug|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Release|x64.ActiveCfg = Release|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Release|x64.Build.0 = Release|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Release|x86.ActiveCfg = Release|Any CPU
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4}.Release|x86.Build.0 = Release|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Debug|x64.Build.0 = Debug|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Debug|x86.Build.0 = Debug|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Release|Any CPU.Build.0 = Release|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Release|x64.ActiveCfg = Release|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Release|x64.Build.0 = Release|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Release|x86.ActiveCfg = Release|Any CPU
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06}.Release|x86.Build.0 = Release|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Debug|x64.Build.0 = Debug|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Debug|x86.Build.0 = Debug|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Release|x64.ActiveCfg = Release|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Release|x64.Build.0 = Release|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Release|x86.ActiveCfg = Release|Any CPU
+ {F189E09E-0C64-4A20-B148-D6502D3CD166}.Release|x86.Build.0 = Release|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Debug|x64.Build.0 = Debug|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Debug|x86.Build.0 = Debug|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Release|x64.ActiveCfg = Release|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Release|x64.Build.0 = Release|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Release|x86.ActiveCfg = Release|Any CPU
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9}.Release|x86.Build.0 = Release|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Debug|x64.Build.0 = Debug|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Debug|x86.Build.0 = Debug|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Release|x64.ActiveCfg = Release|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Release|x64.Build.0 = Release|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Release|x86.ActiveCfg = Release|Any CPU
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE}.Release|x86.Build.0 = Release|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Debug|x64.Build.0 = Debug|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Debug|x86.Build.0 = Debug|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Release|x64.ActiveCfg = Release|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Release|x64.Build.0 = Release|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Release|x86.ActiveCfg = Release|Any CPU
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A}.Release|x86.Build.0 = Release|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Debug|x64.Build.0 = Debug|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Debug|x86.Build.0 = Debug|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Release|x64.ActiveCfg = Release|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Release|x64.Build.0 = Release|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Release|x86.ActiveCfg = Release|Any CPU
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623}.Release|x86.Build.0 = Release|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Debug|x64.Build.0 = Debug|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Debug|x86.Build.0 = Debug|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Release|x64.ActiveCfg = Release|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Release|x64.Build.0 = Release|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Release|x86.ActiveCfg = Release|Any CPU
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F}.Release|x86.Build.0 = Release|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Debug|x64.Build.0 = Debug|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Debug|x86.Build.0 = Debug|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Release|x64.ActiveCfg = Release|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Release|x64.Build.0 = Release|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Release|x86.ActiveCfg = Release|Any CPU
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC}.Release|x86.Build.0 = Release|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Debug|x64.Build.0 = Debug|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Debug|x86.Build.0 = Debug|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Release|x64.ActiveCfg = Release|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Release|x64.Build.0 = Release|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Release|x86.ActiveCfg = Release|Any CPU
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84}.Release|x86.Build.0 = Release|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Debug|x64.Build.0 = Debug|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Debug|x86.Build.0 = Debug|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Release|x64.ActiveCfg = Release|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Release|x64.Build.0 = Release|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Release|x86.ActiveCfg = Release|Any CPU
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3}.Release|x86.Build.0 = Release|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Debug|x64.Build.0 = Debug|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Debug|x86.Build.0 = Debug|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Release|x64.ActiveCfg = Release|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Release|x64.Build.0 = Release|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Release|x86.ActiveCfg = Release|Any CPU
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E}.Release|x86.Build.0 = Release|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Debug|x64.Build.0 = Debug|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Debug|x86.Build.0 = Debug|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Release|x64.ActiveCfg = Release|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Release|x64.Build.0 = Release|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Release|x86.ActiveCfg = Release|Any CPU
+ {A567F04F-2C85-4D09-8C86-26A88F20C729}.Release|x86.Build.0 = Release|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Debug|x64.Build.0 = Debug|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Debug|x86.Build.0 = Debug|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Release|Any CPU.Build.0 = Release|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Release|x64.ActiveCfg = Release|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Release|x64.Build.0 = Release|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Release|x86.ActiveCfg = Release|Any CPU
+ {406B4B46-6289-4061-984A-1DD9C9B6D329}.Release|x86.Build.0 = Release|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Debug|x64.Build.0 = Debug|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Debug|x86.Build.0 = Debug|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Release|x64.ActiveCfg = Release|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Release|x64.Build.0 = Release|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Release|x86.ActiveCfg = Release|Any CPU
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E}.Release|x86.Build.0 = Release|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Debug|x64.Build.0 = Debug|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Debug|x86.Build.0 = Debug|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Release|x64.ActiveCfg = Release|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Release|x64.Build.0 = Release|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Release|x86.ActiveCfg = Release|Any CPU
+ {FC4215EC-D185-4698-AC55-ED953E10B042}.Release|x86.Build.0 = Release|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Debug|x64.Build.0 = Debug|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Debug|x86.Build.0 = Debug|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Release|x64.ActiveCfg = Release|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Release|x64.Build.0 = Release|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Release|x86.ActiveCfg = Release|Any CPU
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1}.Release|x86.Build.0 = Release|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Debug|x64.Build.0 = Debug|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Debug|x86.Build.0 = Debug|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Release|x64.ActiveCfg = Release|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Release|x64.Build.0 = Release|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Release|x86.ActiveCfg = Release|Any CPU
+ {7483F392-F394-46D6-9909-074D84CF09D3}.Release|x86.Build.0 = Release|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Debug|x64.Build.0 = Debug|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Debug|x86.Build.0 = Debug|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Release|Any CPU.Build.0 = Release|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Release|x64.ActiveCfg = Release|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Release|x64.Build.0 = Release|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Release|x86.ActiveCfg = Release|Any CPU
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08}.Release|x86.Build.0 = Release|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Debug|x64.Build.0 = Debug|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Debug|x86.Build.0 = Debug|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Release|x64.ActiveCfg = Release|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Release|x64.Build.0 = Release|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Release|x86.ActiveCfg = Release|Any CPU
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7}.Release|x86.Build.0 = Release|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Debug|x64.Build.0 = Debug|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Debug|x86.Build.0 = Debug|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Release|x64.ActiveCfg = Release|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Release|x64.Build.0 = Release|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Release|x86.ActiveCfg = Release|Any CPU
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC}.Release|x86.Build.0 = Release|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Debug|x64.Build.0 = Debug|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Debug|x86.Build.0 = Debug|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Release|x64.ActiveCfg = Release|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Release|x64.Build.0 = Release|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Release|x86.ActiveCfg = Release|Any CPU
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213}.Release|x86.Build.0 = Release|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Debug|x64.Build.0 = Debug|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Debug|x86.Build.0 = Debug|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Release|x64.ActiveCfg = Release|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Release|x64.Build.0 = Release|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Release|x86.ActiveCfg = Release|Any CPU
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B}.Release|x86.Build.0 = Release|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Debug|x64.Build.0 = Debug|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Debug|x86.Build.0 = Debug|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Release|x64.ActiveCfg = Release|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Release|x64.Build.0 = Release|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Release|x86.ActiveCfg = Release|Any CPU
+ {3ADD636D-4F44-4941-838E-ED399C080D19}.Release|x86.Build.0 = Release|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Debug|x64.Build.0 = Debug|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Debug|x86.Build.0 = Debug|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Release|x64.ActiveCfg = Release|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Release|x64.Build.0 = Release|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Release|x86.ActiveCfg = Release|Any CPU
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992}.Release|x86.Build.0 = Release|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Debug|x64.Build.0 = Debug|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Debug|x86.Build.0 = Debug|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Release|x64.ActiveCfg = Release|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Release|x64.Build.0 = Release|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Release|x86.ActiveCfg = Release|Any CPU
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B}.Release|x86.Build.0 = Release|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Debug|x64.Build.0 = Debug|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Debug|x86.Build.0 = Debug|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Release|x64.ActiveCfg = Release|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Release|x64.Build.0 = Release|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Release|x86.ActiveCfg = Release|Any CPU
+ {00447948-6BDD-4C7E-829A-06094B6F10D2}.Release|x86.Build.0 = Release|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Debug|x64.Build.0 = Debug|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Debug|x86.Build.0 = Debug|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Release|x64.ActiveCfg = Release|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Release|x64.Build.0 = Release|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Release|x86.ActiveCfg = Release|Any CPU
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9}.Release|x86.Build.0 = Release|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Debug|x64.Build.0 = Debug|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Debug|x86.Build.0 = Debug|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Release|x64.ActiveCfg = Release|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Release|x64.Build.0 = Release|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Release|x86.ActiveCfg = Release|Any CPU
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D}.Release|x86.Build.0 = Release|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Debug|x64.Build.0 = Debug|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Debug|x86.Build.0 = Debug|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Release|x64.ActiveCfg = Release|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Release|x64.Build.0 = Release|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Release|x86.ActiveCfg = Release|Any CPU
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9}.Release|x86.Build.0 = Release|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Debug|x64.Build.0 = Debug|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Debug|x86.Build.0 = Debug|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Release|x64.ActiveCfg = Release|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Release|x64.Build.0 = Release|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Release|x86.ActiveCfg = Release|Any CPU
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F}.Release|x86.Build.0 = Release|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Debug|x64.Build.0 = Debug|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Debug|x86.Build.0 = Debug|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Release|x64.ActiveCfg = Release|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Release|x64.Build.0 = Release|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Release|x86.ActiveCfg = Release|Any CPU
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18}.Release|x86.Build.0 = Release|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Debug|x64.Build.0 = Debug|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Debug|x86.Build.0 = Debug|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Release|x64.ActiveCfg = Release|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Release|x64.Build.0 = Release|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Release|x86.ActiveCfg = Release|Any CPU
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC}.Release|x86.Build.0 = Release|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Debug|x64.Build.0 = Debug|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Debug|x86.Build.0 = Debug|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Release|x64.ActiveCfg = Release|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Release|x64.Build.0 = Release|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Release|x86.ActiveCfg = Release|Any CPU
+ {A73934B4-9A86-412B-B619-A6682183DF25}.Release|x86.Build.0 = Release|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Debug|x64.Build.0 = Debug|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Debug|x86.Build.0 = Debug|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Release|x64.ActiveCfg = Release|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Release|x64.Build.0 = Release|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Release|x86.ActiveCfg = Release|Any CPU
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D}.Release|x86.Build.0 = Release|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Debug|x64.Build.0 = Debug|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Debug|x86.Build.0 = Debug|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Release|x64.ActiveCfg = Release|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Release|x64.Build.0 = Release|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Release|x86.ActiveCfg = Release|Any CPU
+ {4ECBDB74-B257-4B06-9872-28BD4D778735}.Release|x86.Build.0 = Release|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Debug|x64.Build.0 = Debug|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Debug|x86.Build.0 = Debug|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Release|x64.ActiveCfg = Release|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Release|x64.Build.0 = Release|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Release|x86.ActiveCfg = Release|Any CPU
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8}.Release|x86.Build.0 = Release|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Debug|x64.Build.0 = Debug|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Debug|x86.Build.0 = Debug|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Release|x64.ActiveCfg = Release|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Release|x64.Build.0 = Release|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Release|x86.ActiveCfg = Release|Any CPU
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3}.Release|x86.Build.0 = Release|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Debug|x64.Build.0 = Debug|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Debug|x86.Build.0 = Debug|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Release|x64.ActiveCfg = Release|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Release|x64.Build.0 = Release|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Release|x86.ActiveCfg = Release|Any CPU
+ {896752D7-939A-4BE0-BB75-1132A516D41D}.Release|x86.Build.0 = Release|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Debug|x64.Build.0 = Debug|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Debug|x86.Build.0 = Debug|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Release|x64.ActiveCfg = Release|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Release|x64.Build.0 = Release|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Release|x86.ActiveCfg = Release|Any CPU
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9}.Release|x86.Build.0 = Release|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Debug|x64.Build.0 = Debug|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Debug|x86.Build.0 = Debug|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Release|x64.ActiveCfg = Release|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Release|x64.Build.0 = Release|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Release|x86.ActiveCfg = Release|Any CPU
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE}.Release|x86.Build.0 = Release|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Debug|x64.Build.0 = Debug|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Debug|x86.Build.0 = Debug|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Release|x64.ActiveCfg = Release|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Release|x64.Build.0 = Release|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Release|x86.ActiveCfg = Release|Any CPU
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA}.Release|x86.Build.0 = Release|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Debug|x64.Build.0 = Debug|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Debug|x86.Build.0 = Debug|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Release|x64.ActiveCfg = Release|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Release|x64.Build.0 = Release|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Release|x86.ActiveCfg = Release|Any CPU
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1}.Release|x86.Build.0 = Release|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Debug|x64.Build.0 = Debug|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Debug|x86.Build.0 = Debug|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Release|x64.ActiveCfg = Release|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Release|x64.Build.0 = Release|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Release|x86.ActiveCfg = Release|Any CPU
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4}.Release|x86.Build.0 = Release|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Debug|x64.Build.0 = Debug|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Debug|x86.Build.0 = Debug|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Release|x64.ActiveCfg = Release|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Release|x64.Build.0 = Release|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Release|x86.ActiveCfg = Release|Any CPU
+ {E2589D5F-F774-413F-B26A-DF2173565B6C}.Release|x86.Build.0 = Release|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Debug|x64.Build.0 = Debug|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Debug|x86.Build.0 = Debug|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Release|x64.ActiveCfg = Release|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Release|x64.Build.0 = Release|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Release|x86.ActiveCfg = Release|Any CPU
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3}.Release|x86.Build.0 = Release|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Debug|x64.Build.0 = Debug|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Debug|x86.Build.0 = Debug|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Release|x64.ActiveCfg = Release|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Release|x64.Build.0 = Release|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Release|x86.ActiveCfg = Release|Any CPU
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F}.Release|x86.Build.0 = Release|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Debug|x64.Build.0 = Debug|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Debug|x86.Build.0 = Debug|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Release|x64.ActiveCfg = Release|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Release|x64.Build.0 = Release|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Release|x86.ActiveCfg = Release|Any CPU
+ {C2C58C19-DF71-4E78-A658-84AF01146637}.Release|x86.Build.0 = Release|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Debug|x64.Build.0 = Debug|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Debug|x86.Build.0 = Debug|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Release|x64.ActiveCfg = Release|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Release|x64.Build.0 = Release|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Release|x86.ActiveCfg = Release|Any CPU
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB}.Release|x86.Build.0 = Release|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Debug|x64.Build.0 = Debug|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Debug|x86.Build.0 = Debug|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Release|x64.ActiveCfg = Release|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Release|x64.Build.0 = Release|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Release|x86.ActiveCfg = Release|Any CPU
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F}.Release|x86.Build.0 = Release|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Debug|x64.Build.0 = Debug|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Debug|x86.Build.0 = Debug|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Release|x64.ActiveCfg = Release|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Release|x64.Build.0 = Release|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Release|x86.ActiveCfg = Release|Any CPU
+ {50B6D43E-2677-4818-923E-54EF513675F8}.Release|x86.Build.0 = Release|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Debug|x64.Build.0 = Debug|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Debug|x86.Build.0 = Debug|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Release|x64.ActiveCfg = Release|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Release|x64.Build.0 = Release|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Release|x86.ActiveCfg = Release|Any CPU
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30}.Release|x86.Build.0 = Release|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Debug|x64.Build.0 = Debug|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Debug|x86.Build.0 = Debug|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Release|x64.ActiveCfg = Release|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Release|x64.Build.0 = Release|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Release|x86.ActiveCfg = Release|Any CPU
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7}.Release|x86.Build.0 = Release|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Debug|x64.Build.0 = Debug|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Debug|x86.Build.0 = Debug|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Release|Any CPU.Build.0 = Release|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Release|x64.ActiveCfg = Release|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Release|x64.Build.0 = Release|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Release|x86.ActiveCfg = Release|Any CPU
+ {121C4468-A224-4DDB-B7C5-704EE0319A26}.Release|x86.Build.0 = Release|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Debug|x64.Build.0 = Debug|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Debug|x86.Build.0 = Debug|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Release|x64.ActiveCfg = Release|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Release|x64.Build.0 = Release|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Release|x86.ActiveCfg = Release|Any CPU
+ {D593E79F-22A8-45A4-A34A-187B3D383A21}.Release|x86.Build.0 = Release|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Debug|x64.Build.0 = Debug|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Debug|x86.Build.0 = Debug|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Release|x64.ActiveCfg = Release|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Release|x64.Build.0 = Release|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Release|x86.ActiveCfg = Release|Any CPU
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D}.Release|x86.Build.0 = Release|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Debug|x64.Build.0 = Debug|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Debug|x86.Build.0 = Debug|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Release|x64.ActiveCfg = Release|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Release|x64.Build.0 = Release|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Release|x86.ActiveCfg = Release|Any CPU
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A}.Release|x86.Build.0 = Release|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Debug|x64.Build.0 = Debug|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Debug|x86.Build.0 = Debug|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Release|x64.ActiveCfg = Release|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Release|x64.Build.0 = Release|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Release|x86.ActiveCfg = Release|Any CPU
+ {99CCB774-5298-4E22-8F56-073B231D0A3D}.Release|x86.Build.0 = Release|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Debug|x64.Build.0 = Debug|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Debug|x86.Build.0 = Debug|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Release|x64.ActiveCfg = Release|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Release|x64.Build.0 = Release|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Release|x86.ActiveCfg = Release|Any CPU
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7}.Release|x86.Build.0 = Release|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Debug|x64.Build.0 = Debug|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Debug|x86.Build.0 = Debug|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Release|x64.ActiveCfg = Release|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Release|x64.Build.0 = Release|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Release|x86.ActiveCfg = Release|Any CPU
+ {B4C977F0-9027-4728-9F50-C895E71582A5}.Release|x86.Build.0 = Release|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Debug|x64.Build.0 = Debug|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Debug|x86.Build.0 = Debug|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Release|x64.ActiveCfg = Release|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Release|x64.Build.0 = Release|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Release|x86.ActiveCfg = Release|Any CPU
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E}.Release|x86.Build.0 = Release|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Debug|x64.Build.0 = Debug|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Debug|x86.Build.0 = Debug|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Release|x64.ActiveCfg = Release|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Release|x64.Build.0 = Release|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Release|x86.ActiveCfg = Release|Any CPU
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8}.Release|x86.Build.0 = Release|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Debug|x64.Build.0 = Debug|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Debug|x86.Build.0 = Debug|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Release|x64.ActiveCfg = Release|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Release|x64.Build.0 = Release|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Release|x86.ActiveCfg = Release|Any CPU
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1}.Release|x86.Build.0 = Release|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Debug|x64.Build.0 = Debug|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Debug|x86.Build.0 = Debug|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Release|x64.ActiveCfg = Release|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Release|x64.Build.0 = Release|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Release|x86.ActiveCfg = Release|Any CPU
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137}.Release|x86.Build.0 = Release|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Debug|x64.Build.0 = Debug|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Debug|x86.Build.0 = Debug|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Release|x64.ActiveCfg = Release|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Release|x64.Build.0 = Release|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Release|x86.ActiveCfg = Release|Any CPU
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0}.Release|x86.Build.0 = Release|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Debug|x64.Build.0 = Debug|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Debug|x86.Build.0 = Debug|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Release|x64.ActiveCfg = Release|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Release|x64.Build.0 = Release|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Release|x86.ActiveCfg = Release|Any CPU
+ {FFA9F547-B412-47D3-AA65-581B51F765A8}.Release|x86.Build.0 = Release|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Debug|x64.Build.0 = Debug|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Debug|x86.Build.0 = Debug|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Release|x64.ActiveCfg = Release|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Release|x64.Build.0 = Release|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Release|x86.ActiveCfg = Release|Any CPU
+ {658DAA95-3941-448A-AF39-C2826043716D}.Release|x86.Build.0 = Release|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Debug|x64.Build.0 = Debug|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Debug|x86.Build.0 = Debug|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Release|x64.ActiveCfg = Release|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Release|x64.Build.0 = Release|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Release|x86.ActiveCfg = Release|Any CPU
+ {3F5589F9-5D13-4662-96C6-52367D14061C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
- {3CFBED5D-2ED8-49DB-96FB-BDAA748DC5A0} = {B7B176B6-8D4D-4EF1-BBD2-DDA650C78FFF}
- {CA663205-77DE-4E55-B300-85594181B5A9} = {363D2681-31A6-48C9-90BB-9ACFF4A41F06}
- {72A5F455-121F-4954-BF28-D712C6BE88EA} = {363D2681-31A6-48C9-90BB-9ACFF4A41F06}
+ {DECBCA36-8E91-4A46-914D-832ECCE7D3F4} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {28C13B1C-3037-453F-B6CD-B30FC8106E06} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {F189E09E-0C64-4A20-B148-D6502D3CD166} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {809B5BC8-F020-4B78-9FD2-FC8704FA89D9} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {7F608EFD-817B-4240-A6D4-B82CAC0C1CCE} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {DB308907-C606-4C31-B55B-E8CC2625FE8A} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {6A7A7A6E-7593-44D3-A96F-CCFC6FF4E623} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {6DDE1B56-A1E4-4E3C-BF83-8236C46FB62F} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {C73F656D-41B6-4610-B9DD-8B0F5C2589EC} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {7F5C0B6A-006E-456F-A806-1B0F502A9D84} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {04B04AE5-7AA4-4894-8EA4-C08000A4F9F3} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {1812726B-6B81-4038-B1A0-C42A7CB6E83E} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {A567F04F-2C85-4D09-8C86-26A88F20C729} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {406B4B46-6289-4061-984A-1DD9C9B6D329} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {CB0A64E2-DD42-43D9-B253-D94C2487BA0E} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {FC4215EC-D185-4698-AC55-ED953E10B042} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {8C94398F-BF49-4D0D-8A60-AED8BC6E53A1} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {7483F392-F394-46D6-9909-074D84CF09D3} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {144D7C8F-AF14-43EE-9720-EA4CF20F9C08} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {9F2C5373-27A5-4357-8A7A-4F22176AD5D7} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {7B89A938-E9F0-4D09-8F47-D0E2B6B1E8AC} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {CF91C6AB-B977-41FE-B26A-D8095BBF4213} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {95F6D15B-293F-4E23-BCC6-FD81B40E886B} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {3ADD636D-4F44-4941-838E-ED399C080D19} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {4D95736B-7CC7-4CBE-BCA4-131F23D5D992} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {004D3BCB-6585-4317-BF8E-5BA3F07ACA3B} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {00447948-6BDD-4C7E-829A-06094B6F10D2} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {8D8F84CB-2E48-42D3-8E48-D6213290FFB9} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {FC10BAD6-EC2E-4E9F-9BB7-1E33306A5D4D} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {353FE180-8B31-4947-9407-3FA1EE8DA8B9} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {11B29D93-5CD7-4282-98C8-124E5B16DD3F} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {7FB812C6-617D-41C3-A08D-57CE93A9AA18} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {2AE8210B-8C1E-4C0B-A94E-D4C8209E49EC} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {A73934B4-9A86-412B-B619-A6682183DF25} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {C76336AB-F5C5-4DC2-91AD-A1C891F6FA6D} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {4ECBDB74-B257-4B06-9872-28BD4D778735} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {BBD295AC-C95C-481C-B44B-9EB7C9EB85E8} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {3E75B412-69C0-4BD0-9DF0-2A2C865DAEB3} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {896752D7-939A-4BE0-BB75-1132A516D41D} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {D8ED97C5-C491-4D4B-8B01-435835E7AAA9} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {6192109A-C3D2-4BFC-84FC-BEF2AD074DBE} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {B6F13159-2E4D-4F86-A2F2-AFD3536105DA} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {3E89B6A4-A54F-4ADD-93A0-066D4165F3D1} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {688FC3EF-7A2A-4E20-8AEA-BF9EE02211C4} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {E2589D5F-F774-413F-B26A-DF2173565B6C} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {D564FC69-B6C2-4EA3-ADF0-DAA3C95057B3} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {3FA0A685-B35C-4B9A-B933-BBCFBC945D2F} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {C2C58C19-DF71-4E78-A658-84AF01146637} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {7BDC3249-5402-4DFF-A34B-C2E8262568AB} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {2F9FF701-31CA-43D9-9212-21CF3640F54F} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {50B6D43E-2677-4818-923E-54EF513675F8} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {3B68E545-0B46-4089-B46C-29A01EC6BF30} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {1A54B5FD-6A71-44C5-BC1B-CEA670F684F7} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {121C4468-A224-4DDB-B7C5-704EE0319A26} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {D593E79F-22A8-45A4-A34A-187B3D383A21} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {42F24A07-6C68-4E5E-B533-01AE81FCFB0D} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {8305691A-DD86-4BB3-B79A-DBB28980EE5A} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {99CCB774-5298-4E22-8F56-073B231D0A3D} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {39AEA24E-6D73-4EB1-9773-5BCF02957AC7} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {B4C977F0-9027-4728-9F50-C895E71582A5} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {D3C9F8FC-B101-4CA9-B68C-EE2F2C88CF6E} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {E12AA11A-AD3B-42A3-9200-C22644959EA8} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {CA51F9EF-137E-4679-AFBC-298FCDF027E1} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {7A3B24E6-3620-4018-A7BE-DE5B3BB38137} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {501E13FC-E3BD-4C03-9AFB-DD39A5260DF0} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {FFA9F547-B412-47D3-AA65-581B51F765A8} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {658DAA95-3941-448A-AF39-C2826043716D} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
+ {3F5589F9-5D13-4662-96C6-52367D14061C} = {B21EACAA-1EBC-45D3-8831-8A8E7888CD03}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4AC7A44E-260A-4E70-88A7-77A0027E12A5}
diff --git a/src/MusicStore/samples/MusicStore/Controllers/CheckoutController.cs b/src/MusicStore/samples/MusicStore/Controllers/CheckoutController.cs
index 5f7a5e2ae8..ff26a5ed71 100644
--- a/src/MusicStore/samples/MusicStore/Controllers/CheckoutController.cs
+++ b/src/MusicStore/samples/MusicStore/Controllers/CheckoutController.cs
@@ -66,16 +66,17 @@ namespace MusicStore.Controllers
var cart = ShoppingCart.GetCart(dbContext, HttpContext);
await cart.CreateOrder(order);
- _logger.LogInformation("User {userName} started checkout of {orderId}.", order.Username, order.OrderId);
-
// Save all changes
await dbContext.SaveChangesAsync(requestAborted);
+ _logger.LogInformation("User {userName} started checkout of {orderId}.", order.Username, order.OrderId);
+
return RedirectToAction("Complete", new { id = order.OrderId });
}
}
- catch
+ catch (Exception ex)
{
+ _logger.LogError(ex, "Checkout failed");
//Invalid - redisplay with errors
return View(order);
}
@@ -110,4 +111,4 @@ namespace MusicStore.Controllers
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/MusicStore/samples/MusicStore/Models/ShoppingCart.cs b/src/MusicStore/samples/MusicStore/Models/ShoppingCart.cs
index 5d05325401..cdc21eb01d 100644
--- a/src/MusicStore/samples/MusicStore/Models/ShoppingCart.cs
+++ b/src/MusicStore/samples/MusicStore/Models/ShoppingCart.cs
@@ -18,7 +18,7 @@ namespace MusicStore.Models
_shoppingCartId = id;
}
- public static ShoppingCart GetCart(MusicStoreContext db, HttpContext context)
+ public static ShoppingCart GetCart(MusicStoreContext db, HttpContext context)
=> GetCart(db, GetCartId(context));
public static ShoppingCart GetCart(MusicStoreContext db, string cartId)
@@ -94,7 +94,7 @@ namespace MusicStore.Models
.Include(c => c.Album)
.ToListAsync();
}
-
+
public Task> GetCartAlbumTitles()
{
return _dbContext
@@ -117,7 +117,7 @@ namespace MusicStore.Models
public Task GetTotal()
{
- // Multiply album price by count of that album to get
+ // Multiply album price by count of that album to get
// the current price for each of those albums in the cart
// sum all album price totals to get the cart total
@@ -128,7 +128,7 @@ namespace MusicStore.Models
.SumAsync();
}
- public async Task CreateOrder(Order order)
+ public async Task CreateOrder(Order order)
{
decimal orderTotal = 0;
@@ -143,7 +143,7 @@ namespace MusicStore.Models
var orderDetail = new OrderDetail
{
AlbumId = item.AlbumId,
- OrderId = order.OrderId,
+ Order = order,
UnitPrice = album.Price,
Quantity = item.Count,
};
@@ -159,9 +159,6 @@ namespace MusicStore.Models
// Empty the shopping cart
await EmptyCart();
-
- // Return the OrderId as the confirmation number
- return order.OrderId;
}
// We're using HttpContextBase to allow access to sessions.
@@ -171,7 +168,7 @@ namespace MusicStore.Models
if (cartId == null)
{
- //A GUID to hold the cartId.
+ //A GUID to hold the cartId.
cartId = Guid.NewGuid().ToString();
// Send cart Id as a cookie to the client.
@@ -181,4 +178,4 @@ namespace MusicStore.Models
return cartId;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/MusicStore/samples/MusicStore/MusicStore.csproj b/src/MusicStore/samples/MusicStore/MusicStore.csproj
index ca1966649d..f720307d05 100644
--- a/src/MusicStore/samples/MusicStore/MusicStore.csproj
+++ b/src/MusicStore/samples/MusicStore/MusicStore.csproj
@@ -1,4 +1,4 @@
-
+
@@ -6,22 +6,15 @@
Music store application on ASP.NET Core
netcoreapp3.0
$(DefineConstants);DEMO
- true
win7-x86;win7-x64;linux-x64;osx-x64
- Debug;Release;RuntimeStore
true
- AspNetCoreModuleV2
-
-
-
-
-
+
diff --git a/src/MusicStore/startvs.cmd b/src/MusicStore/startvs.cmd
new file mode 100644
index 0000000000..1daed6b6ff
--- /dev/null
+++ b/src/MusicStore/startvs.cmd
@@ -0,0 +1,3 @@
+@ECHO OFF
+
+%~dp0..\..\startvs.cmd %~dp0MusicStore.sln
diff --git a/src/MusicStore/test/MusicStore.E2ETests/MusicStore.E2ETests.csproj b/src/MusicStore/test/MusicStore.E2ETests/MusicStore.E2ETests.csproj
index 3603ca8429..d5a887ef27 100644
--- a/src/MusicStore/test/MusicStore.E2ETests/MusicStore.E2ETests.csproj
+++ b/src/MusicStore/test/MusicStore.E2ETests/MusicStore.E2ETests.csproj
@@ -20,7 +20,7 @@
-
+
diff --git a/src/MusicStore/test/MusicStore.E2ETests/NtlmAuthentationTest.cs b/src/MusicStore/test/MusicStore.E2ETests/NtlmAuthentationTest.cs
index 59d668d09e..aa547f15e8 100644
--- a/src/MusicStore/test/MusicStore.E2ETests/NtlmAuthentationTest.cs
+++ b/src/MusicStore/test/MusicStore.E2ETests/NtlmAuthentationTest.cs
@@ -20,6 +20,7 @@ namespace E2ETests
=> TestMatrix.ForServers(ServerType.IISExpress, ServerType.HttpSys)
.WithTfms(Tfm.NetCoreApp30)
.WithAllApplicationTypes()
+ .WithAncmVersions(AncmVersion.AspNetCoreModuleV2)
.WithAllArchitectures();
[ConditionalTheory]
diff --git a/src/MusicStore/test/MusicStore.E2ETests/OpenIdConnectTests.cs b/src/MusicStore/test/MusicStore.E2ETests/OpenIdConnectTests.cs
index dd47eb8740..9d7ecf2855 100644
--- a/src/MusicStore/test/MusicStore.E2ETests/OpenIdConnectTests.cs
+++ b/src/MusicStore/test/MusicStore.E2ETests/OpenIdConnectTests.cs
@@ -15,6 +15,7 @@ namespace E2ETests
{
public static TestMatrix TestVariants
=> TestMatrix.ForServers(ServerType.IISExpress, ServerType.Kestrel)
+ .WithAncmVersions(AncmVersion.AspNetCoreModuleV2)
.WithTfms(Tfm.NetCoreApp30);
[ConditionalTheory]
diff --git a/src/MusicStore/test/MusicStore.E2ETests/PublishAndRunTests.cs b/src/MusicStore/test/MusicStore.E2ETests/PublishAndRunTests.cs
index 8105744498..3c5254cc0e 100644
--- a/src/MusicStore/test/MusicStore.E2ETests/PublishAndRunTests.cs
+++ b/src/MusicStore/test/MusicStore.E2ETests/PublishAndRunTests.cs
@@ -18,7 +18,7 @@ namespace E2ETests
=> TestMatrix.ForServers(ServerType.IISExpress, ServerType.Kestrel, ServerType.HttpSys)
.WithTfms(Tfm.NetCoreApp30)
.WithAllApplicationTypes()
- .WithAllAncmVersions()
+ .WithAncmVersions(AncmVersion.AspNetCoreModuleV2)
.WithAllHostingModels()
.WithAllArchitectures();
diff --git a/src/MusicStore/test/MusicStore.E2ETests/SmokeTests.cs b/src/MusicStore/test/MusicStore.E2ETests/SmokeTests.cs
index 7ac9817197..9aac88e225 100644
--- a/src/MusicStore/test/MusicStore.E2ETests/SmokeTests.cs
+++ b/src/MusicStore/test/MusicStore.E2ETests/SmokeTests.cs
@@ -19,7 +19,7 @@ namespace E2ETests
=> TestMatrix.ForServers(ServerType.IISExpress, ServerType.Kestrel, ServerType.HttpSys)
.WithTfms(Tfm.NetCoreApp30)
.WithAllApplicationTypes()
- .WithAllAncmVersions()
+ .WithAncmVersions(AncmVersion.AspNetCoreModuleV2)
.WithAllHostingModels();
[ConditionalTheory]
diff --git a/src/Mvc/Mvc.sln b/src/Mvc/Mvc.sln
index 316098c927..66b627bbb8 100644
--- a/src/Mvc/Mvc.sln
+++ b/src/Mvc/Mvc.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
-VisualStudioVersion = 16.0.28414.68
+VisualStudioVersion = 16.0.28531.181
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{DAAE4C74-D06F-4874-A166-33305D2643CE}"
EndProject
@@ -158,90 +158,90 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RazorPagesClassLibrary", "t
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Views.TestCommon", "test\Microsoft.AspNetCore.Mvc.Views.TestCommon\Microsoft.AspNetCore.Mvc.Views.TestCommon.csproj", "{51E3E785-A9D1-4196-BAFE-A17FF4304B89}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarkapps", "benchmarkapps", "{2859F266-673A-45A2-9E3C-7B39C6DDD38E}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicApi", "benchmarkapps\BasicApi\BasicApi.csproj", "{910F023A-88E3-4CB4-8793-AC4005C7B421}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicViews", "benchmarkapps\BasicViews\BasicViews.csproj", "{E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mvc.Api.Analyzers.Test", "test\Mvc.Api.Analyzers.Test\Mvc.Api.Analyzers.Test.csproj", "{DD7B9F20-354C-4D9E-8C8A-8AE6E7595A87}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Api.Analyzers", "src\Microsoft.AspNetCore.Mvc.Api.Analyzers\Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj", "{3B550487-10E4-4E6D-9CEF-B1B4CA1253DA}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RazorRendering", "benchmarkapps\RazorRendering\RazorRendering.csproj", "{D7C6A696-F232-4288-BCCD-367407E4A934}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-getdocument", "src\dotnet-getdocument\dotnet-getdocument.csproj", "{4EDC489F-3EC5-4AE3-9841-A285F40F5FF6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GetDocumentInsider", "src\GetDocumentInsider\GetDocumentInsider.csproj", "{2F683CF8-B055-46AE-BF83-9D1307F8D45F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.ApiDescription.Design", "src\Microsoft.Extensions.ApiDescription.Design\Microsoft.Extensions.ApiDescription.Design.csproj", "{34E3C302-B767-40C8-B538-3EE2BD4000C4}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_dependencies", "_dependencies", "{5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Html.Abstractions", "..\Html\Abstractions\src\Microsoft.AspNetCore.Html.Abstractions.csproj", "{0930C2EA-FA36-4EDF-A571-215765D1F2C7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http", "..\Http\Http\src\Microsoft.AspNetCore.Http.csproj", "{A273BAAB-DA92-401D-B781-ADA9E3B7717C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Cors", "..\Middleware\CORS\src\Microsoft.AspNetCore.Cors.csproj", "{E07B7D3A-1D4D-4644-84C2-06FEDB64885B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting", "..\Hosting\Hosting\src\Microsoft.AspNetCore.Hosting.csproj", "{0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.TestHost", "..\Hosting\TestHost\src\Microsoft.AspNetCore.TestHost.csproj", "{2E18C4FD-9982-4BD9-A067-3CE56E68C450}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Diagnostics", "..\Middleware\Diagnostics\src\Microsoft.AspNetCore.Diagnostics.csproj", "{C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IntegrationTesting", "..\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj", "{BCD18147-D96D-4240-A89F-5F890392E58E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.WebUtilities", "..\Http\WebUtilities\src\Microsoft.AspNetCore.WebUtilities.csproj", "{986BF4FD-D0E3-48AE-917C-6C168D6395D3}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.ResponseCaching", "..\Middleware\ResponseCaching\src\Microsoft.AspNetCore.ResponseCaching.csproj", "{F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.StaticFiles", "..\Middleware\StaticFiles\src\Microsoft.AspNetCore.StaticFiles.csproj", "{F4846AC2-384E-4C0B-8DE5-9784715E4A9F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Session", "..\Middleware\Session\src\Microsoft.AspNetCore.Session.csproj", "{C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Localization.Routing", "..\Middleware\Localization.Routing\src\Microsoft.AspNetCore.Localization.Routing.csproj", "{68C9E09E-F7FA-4853-B512-6BCD02BB69C1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Runtime", "..\Razor\Razor.Runtime\src\Microsoft.AspNetCore.Razor.Runtime.csproj", "{9F2C52EA-1869-4610-921F-5FD654582019}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Cookies", "..\Security\Authentication\Cookies\src\Microsoft.AspNetCore.Authentication.Cookies.csproj", "{AA074523-64D3-4CA7-8C2E-EACD977D2B19}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IISIntegration", "..\Servers\IIS\IISIntegration\src\Microsoft.AspNetCore.Server.IISIntegration.csproj", "{47D5BF2A-7B05-4630-8C7C-A682382EA6F1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication", "..\Security\Authentication\Core\src\Microsoft.AspNetCore.Authentication.csproj", "{72D40CFE-93B5-4877-92DC-E79203641342}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel", "..\Servers\Kestrel\Kestrel\src\Microsoft.AspNetCore.Server.Kestrel.csproj", "{62952E87-88DB-45BA-9FE0-8A24FA983750}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.CookiePolicy", "..\Security\CookiePolicy\src\Microsoft.AspNetCore.CookiePolicy.csproj", "{F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authorization.Policy", "..\Security\Authorization\Policy\src\Microsoft.AspNetCore.Authorization.Policy.csproj", "{157F16EA-C5C1-4BDF-A81C-44A7771A13D7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Routing", "..\Http\Routing\src\Microsoft.AspNetCore.Routing.csproj", "{457D7B8F-C81D-4F0C-BE88-B0516374944E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Routing.Abstractions", "..\Http\Routing.Abstractions\src\Microsoft.AspNetCore.Routing.Abstractions.csproj", "{69D6513F-66AD-44C6-BD3F-8DE78CB4398F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.JwtBearer", "..\Security\Authentication\JwtBearer\src\Microsoft.AspNetCore.Authentication.JwtBearer.csproj", "{1348A3AB-8401-4DAE-90CC-A5907ED52A36}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.Server.Abstractions", "..\Hosting\Server.Abstractions\src\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj", "{1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.Abstractions", "..\Hosting\Abstractions\src\Microsoft.AspNetCore.Hosting.Abstractions.csproj", "{94A04746-8698-4DEF-BCFC-8BA2D3F8A451}"
+EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Performance.Views", "benchmarks\Microsoft.AspNetCore.Mvc.Performance.Views\Microsoft.AspNetCore.Mvc.Performance.Views.csproj", "{0CA44B59-6538-4668-BB5E-D586946426F3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.JsonPatch", "..\Features\JsonPatch\src\Microsoft.AspNetCore.JsonPatch.csproj", "{0F41EB10-BD4E-443C-868B-95109F0843E0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Localization", "..\Middleware\Localization\src\Microsoft.AspNetCore.Localization.csproj", "{68C06221-185E-41E3-B2C8-B4A1B3D20631}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Routing.Abstractions", "..\Http\Routing.Abstractions\src\Microsoft.AspNetCore.Routing.Abstractions.csproj", "{AFA70552-7405-4655-8899-FED6B5F393BD}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Runtime", "..\Razor\Razor.Runtime\src\Microsoft.AspNetCore.Razor.Runtime.csproj", "{47F3C605-0674-4943-A378-45B4A54B5F14}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Antiforgery", "..\Antiforgery\src\Microsoft.AspNetCore.Antiforgery.csproj", "{9C584DF9-CDF2-4522-A0A5-55AAE36820EC}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Html.Abstractions", "..\Html\Abstractions\src\Microsoft.AspNetCore.Html.Abstractions.csproj", "{CFEFED8B-D109-4628-BE40-B02A3A659AB0}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Diagnostics.Abstractions", "..\Middleware\Diagnostics.Abstractions\src\Microsoft.AspNetCore.Diagnostics.Abstractions.csproj", "{C1A7CBEB-06C9-40DD-B1A0-3FD61045B3AE}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Cors", "..\Middleware\CORS\src\Microsoft.AspNetCore.Cors.csproj", "{5C838817-4DEC-4BA0-BACC-2F512B8245AC}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.Abstractions", "..\Hosting\Abstractions\src\Microsoft.AspNetCore.Hosting.Abstractions.csproj", "{0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Routing", "..\Http\Routing\src\Microsoft.AspNetCore.Routing.csproj", "{E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Extensions", "..\Http\Http.Extensions\src\Microsoft.AspNetCore.Http.Extensions.csproj", "{0500845C-2F0F-4380-8D48-FC1CC5C3A9F3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.ResponseCaching.Abstractions", "..\Middleware\ResponseCaching.Abstractions\src\Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj", "{A04124E5-E4AA-4311-8049-DAF371871B31}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authorization.Policy", "..\Security\Authorization\Policy\src\Microsoft.AspNetCore.Authorization.Policy.csproj", "{A6018CDE-37DD-4317-80EB-01DB306EA5B9}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http", "..\Http\Http\src\Microsoft.AspNetCore.Http.csproj", "{B3AE9A77-1198-4974-AA78-531CE6C568F3}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Core", "..\Http\Authentication.Core\src\Microsoft.AspNetCore.Authentication.Core.csproj", "{F95DC77B-CA52-4BBB-817E-79ABFE330C5C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Net.Http.Headers", "..\Http\Headers\src\Microsoft.Net.Http.Headers.csproj", "{1024A6BE-E0AF-4170-B61D-E6C092780195}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel", "..\Servers\Kestrel\Kestrel\src\Microsoft.AspNetCore.Server.Kestrel.csproj", "{0F04DD66-08B7-47F4-9826-66CD8FD539FF}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dependencies", "dependencies", "{9328599D-A7AF-43BC-BE08-7503DF9B8CE6}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets", "..\Servers\Kestrel\Transport.Sockets\src\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj", "{449AD5B2-9CC7-4542-A28C-8BF2DAB96AC6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel.Core", "..\Servers\Kestrel\Core\src\Microsoft.AspNetCore.Server.Kestrel.Core.csproj", "{39F64AD3-9F14-4898-B9C5-5A2900D0E9C6}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.Server.Abstractions", "..\Hosting\Server.Abstractions\src\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj", "{CC2FF678-438C-4343-A1A7-BF3E75470EB9}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Abstractions", "..\Http\Http.Abstractions\src\Microsoft.AspNetCore.Http.Abstractions.csproj", "{8BA78D3C-4474-4FC5-B36F-9B19A7D6BCA4}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.TestHost", "..\Hosting\TestHost\src\Microsoft.AspNetCore.TestHost.csproj", "{C185A2B1-64C0-491B-9AAE-382C24F9B4AE}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Diagnostics", "..\Middleware\Diagnostics\src\Microsoft.AspNetCore.Diagnostics.csproj", "{B37FF37D-0A47-494A-B5ED-497F273B9067}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.StaticFiles", "..\Middleware\StaticFiles\src\Microsoft.AspNetCore.StaticFiles.csproj", "{22F657F5-7D95-438A-985A-A390938E7843}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Cookies", "..\Security\Authentication\Cookies\src\Microsoft.AspNetCore.Authentication.Cookies.csproj", "{731B64B8-AB91-4A05-AE5C-929996D58A52}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting", "..\Hosting\Hosting\src\Microsoft.AspNetCore.Hosting.csproj", "{2D665D68-BF48-41E0-B74C-A88A83F8AFD5}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication", "..\Security\Authentication\Core\src\Microsoft.AspNetCore.Authentication.csproj", "{E07090BD-05AF-4DC0-9D59-35EF70EBC764}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.JwtBearer", "..\Security\Authentication\JwtBearer\src\Microsoft.AspNetCore.Authentication.JwtBearer.csproj", "{22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Session", "..\Middleware\Session\src\Microsoft.AspNetCore.Session.csproj", "{E335D925-771A-4FB9-A94C-1D74A8F01DCE}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.CookiePolicy", "..\Security\CookiePolicy\src\Microsoft.AspNetCore.CookiePolicy.csproj", "{FF88FB5E-0096-4096-A0D7-FCFE5D55F164}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Localization.Routing", "..\Middleware\Localization.Routing\src\Microsoft.AspNetCore.Localization.Routing.csproj", "{4D04F472-8E7C-487D-8B57-9533B1F7F3DE}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authorization", "..\Security\Authorization\Core\src\Microsoft.AspNetCore.Authorization.csproj", "{7DBA484B-BA85-4768-9002-68F49C2D9A86}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Abstractions", "..\Http\Authentication.Abstractions\src\Microsoft.AspNetCore.Authentication.Abstractions.csproj", "{60FC5D94-2FE1-47B4-BDBA-72611BFD7C90}"
@@ -250,8 +250,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.F
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions", "..\Servers\Kestrel\Transport.Abstractions\src\Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions.csproj", "{DCB4C407-1121-4AB0-A6B6-DF28B8EBCBD1}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.WebUtilities", "..\Http\WebUtilities\src\Microsoft.AspNetCore.WebUtilities.csproj", "{47C60935-CF5B-459C-B6C4-760350F3904B}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor", "..\Razor\Razor\src\Microsoft.AspNetCore.Razor.csproj", "{12D0BEB8-A1C6-4712-8368-83BC65428CA8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.DataProtection", "..\DataProtection\DataProtection\src\Microsoft.AspNetCore.DataProtection.csproj", "{CC355676-B7EF-4A0E-9659-BCB50127E850}"
@@ -264,12 +262,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Crypto
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.DataProtection.Abstractions", "..\DataProtection\Abstractions\src\Microsoft.AspNetCore.DataProtection.Abstractions.csproj", "{C75C6E51-4FFD-4902-8739-9109E51875B4}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.ResponseCaching", "..\Middleware\ResponseCaching\src\Microsoft.AspNetCore.ResponseCaching.csproj", "{11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IISIntegration", "..\Servers\IIS\IISIntegration\src\Microsoft.AspNetCore.Server.IISIntegration.csproj", "{35AE5599-AD99-4198-AC91-C599459E9023}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GenericHostWebSite", "test\WebSites\GenericHostWebSite\GenericHostWebSite.csproj", "{D9BE3E50-5CE8-4D8D-BA19-AA219D009752}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation", "src\Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation\Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.csproj", "{F2D4A859-7B84-403E-9745-01032EC705C5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test", "test\Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test\Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test.csproj", "{23A6033D-2AA6-4629-BC1B-14694E3794FF}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components", "..\Components\Components\src\Microsoft.AspNetCore.Components.csproj", "{69E18B21-E4B9-4866-ABDA-3C2D9664D24C}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -928,30 +928,6 @@ Global
{51E3E785-A9D1-4196-BAFE-A17FF4304B89}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{51E3E785-A9D1-4196-BAFE-A17FF4304B89}.Release|x86.ActiveCfg = Release|Any CPU
{51E3E785-A9D1-4196-BAFE-A17FF4304B89}.Release|x86.Build.0 = Release|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Debug|x86.ActiveCfg = Debug|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Debug|x86.Build.0 = Debug|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Release|Any CPU.Build.0 = Release|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Release|x86.ActiveCfg = Release|Any CPU
- {910F023A-88E3-4CB4-8793-AC4005C7B421}.Release|x86.Build.0 = Release|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Debug|x86.Build.0 = Debug|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Release|Any CPU.Build.0 = Release|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Release|x86.ActiveCfg = Release|Any CPU
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB}.Release|x86.Build.0 = Release|Any CPU
{DD7B9F20-354C-4D9E-8C8A-8AE6E7595A87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DD7B9F20-354C-4D9E-8C8A-8AE6E7595A87}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DD7B9F20-354C-4D9E-8C8A-8AE6E7595A87}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -976,18 +952,6 @@ Global
{3B550487-10E4-4E6D-9CEF-B1B4CA1253DA}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{3B550487-10E4-4E6D-9CEF-B1B4CA1253DA}.Release|x86.ActiveCfg = Release|Any CPU
{3B550487-10E4-4E6D-9CEF-B1B4CA1253DA}.Release|x86.Build.0 = Release|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Debug|x86.ActiveCfg = Debug|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Debug|x86.Build.0 = Debug|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Release|Any CPU.Build.0 = Release|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Release|x86.ActiveCfg = Release|Any CPU
- {D7C6A696-F232-4288-BCCD-367407E4A934}.Release|x86.Build.0 = Release|Any CPU
{4EDC489F-3EC5-4AE3-9841-A285F40F5FF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4EDC489F-3EC5-4AE3-9841-A285F40F5FF6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4EDC489F-3EC5-4AE3-9841-A285F40F5FF6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1024,6 +988,294 @@ Global
{34E3C302-B767-40C8-B538-3EE2BD4000C4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{34E3C302-B767-40C8-B538-3EE2BD4000C4}.Release|x86.ActiveCfg = Release|Any CPU
{34E3C302-B767-40C8-B538-3EE2BD4000C4}.Release|x86.Build.0 = Release|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Debug|x86.Build.0 = Debug|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Release|x86.ActiveCfg = Release|Any CPU
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7}.Release|x86.Build.0 = Release|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Debug|x86.Build.0 = Debug|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Release|x86.ActiveCfg = Release|Any CPU
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C}.Release|x86.Build.0 = Release|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Debug|x86.Build.0 = Debug|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Release|x86.ActiveCfg = Release|Any CPU
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B}.Release|x86.Build.0 = Release|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Debug|x86.Build.0 = Debug|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Release|x86.ActiveCfg = Release|Any CPU
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A}.Release|x86.Build.0 = Release|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Debug|x86.Build.0 = Debug|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Release|x86.ActiveCfg = Release|Any CPU
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450}.Release|x86.Build.0 = Release|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Debug|x86.Build.0 = Debug|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Release|x86.ActiveCfg = Release|Any CPU
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2}.Release|x86.Build.0 = Release|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Debug|x86.Build.0 = Debug|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Release|x86.ActiveCfg = Release|Any CPU
+ {BCD18147-D96D-4240-A89F-5F890392E58E}.Release|x86.Build.0 = Release|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Debug|x86.Build.0 = Debug|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Release|x86.ActiveCfg = Release|Any CPU
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3}.Release|x86.Build.0 = Release|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Debug|x86.Build.0 = Debug|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Release|x86.ActiveCfg = Release|Any CPU
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1}.Release|x86.Build.0 = Release|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Debug|x86.Build.0 = Debug|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Release|x86.ActiveCfg = Release|Any CPU
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F}.Release|x86.Build.0 = Release|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Debug|x86.Build.0 = Debug|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Release|x86.ActiveCfg = Release|Any CPU
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A}.Release|x86.Build.0 = Release|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Debug|x86.Build.0 = Debug|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Release|x86.ActiveCfg = Release|Any CPU
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1}.Release|x86.Build.0 = Release|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Debug|x86.Build.0 = Debug|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Release|x86.ActiveCfg = Release|Any CPU
+ {9F2C52EA-1869-4610-921F-5FD654582019}.Release|x86.Build.0 = Release|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Debug|x86.Build.0 = Debug|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Release|x86.ActiveCfg = Release|Any CPU
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19}.Release|x86.Build.0 = Release|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Debug|x86.Build.0 = Debug|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Release|x86.ActiveCfg = Release|Any CPU
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1}.Release|x86.Build.0 = Release|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Debug|x86.Build.0 = Debug|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Release|Any CPU.Build.0 = Release|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Release|x86.ActiveCfg = Release|Any CPU
+ {72D40CFE-93B5-4877-92DC-E79203641342}.Release|x86.Build.0 = Release|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Debug|x86.Build.0 = Debug|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Release|Any CPU.Build.0 = Release|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Release|x86.ActiveCfg = Release|Any CPU
+ {62952E87-88DB-45BA-9FE0-8A24FA983750}.Release|x86.Build.0 = Release|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Debug|x86.Build.0 = Debug|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Release|x86.ActiveCfg = Release|Any CPU
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D}.Release|x86.Build.0 = Release|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Debug|x86.Build.0 = Debug|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Release|x86.ActiveCfg = Release|Any CPU
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7}.Release|x86.Build.0 = Release|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Debug|x86.Build.0 = Debug|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Release|x86.ActiveCfg = Release|Any CPU
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E}.Release|x86.Build.0 = Release|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Debug|x86.Build.0 = Debug|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Release|x86.ActiveCfg = Release|Any CPU
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F}.Release|x86.Build.0 = Release|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Debug|x86.Build.0 = Debug|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Release|x86.ActiveCfg = Release|Any CPU
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36}.Release|x86.Build.0 = Release|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Debug|x86.Build.0 = Debug|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Release|x86.ActiveCfg = Release|Any CPU
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B}.Release|x86.Build.0 = Release|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Debug|x86.Build.0 = Debug|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Release|Any CPU.Build.0 = Release|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Release|x86.ActiveCfg = Release|Any CPU
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451}.Release|x86.Build.0 = Release|Any CPU
{0CA44B59-6538-4668-BB5E-D586946426F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0CA44B59-6538-4668-BB5E-D586946426F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0CA44B59-6538-4668-BB5E-D586946426F3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1060,30 +1312,6 @@ Global
{68C06221-185E-41E3-B2C8-B4A1B3D20631}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{68C06221-185E-41E3-B2C8-B4A1B3D20631}.Release|x86.ActiveCfg = Release|Any CPU
{68C06221-185E-41E3-B2C8-B4A1B3D20631}.Release|x86.Build.0 = Release|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Debug|x86.ActiveCfg = Debug|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Debug|x86.Build.0 = Debug|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Release|Any CPU.Build.0 = Release|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Release|x86.ActiveCfg = Release|Any CPU
- {AFA70552-7405-4655-8899-FED6B5F393BD}.Release|x86.Build.0 = Release|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Debug|x86.ActiveCfg = Debug|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Debug|x86.Build.0 = Debug|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Release|Any CPU.Build.0 = Release|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Release|x86.ActiveCfg = Release|Any CPU
- {47F3C605-0674-4943-A378-45B4A54B5F14}.Release|x86.Build.0 = Release|Any CPU
{9C584DF9-CDF2-4522-A0A5-55AAE36820EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9C584DF9-CDF2-4522-A0A5-55AAE36820EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9C584DF9-CDF2-4522-A0A5-55AAE36820EC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1096,18 +1324,6 @@ Global
{9C584DF9-CDF2-4522-A0A5-55AAE36820EC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{9C584DF9-CDF2-4522-A0A5-55AAE36820EC}.Release|x86.ActiveCfg = Release|Any CPU
{9C584DF9-CDF2-4522-A0A5-55AAE36820EC}.Release|x86.Build.0 = Release|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Debug|x86.Build.0 = Debug|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Release|Any CPU.Build.0 = Release|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Release|x86.ActiveCfg = Release|Any CPU
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0}.Release|x86.Build.0 = Release|Any CPU
{C1A7CBEB-06C9-40DD-B1A0-3FD61045B3AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C1A7CBEB-06C9-40DD-B1A0-3FD61045B3AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C1A7CBEB-06C9-40DD-B1A0-3FD61045B3AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1120,42 +1336,6 @@ Global
{C1A7CBEB-06C9-40DD-B1A0-3FD61045B3AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{C1A7CBEB-06C9-40DD-B1A0-3FD61045B3AE}.Release|x86.ActiveCfg = Release|Any CPU
{C1A7CBEB-06C9-40DD-B1A0-3FD61045B3AE}.Release|x86.Build.0 = Release|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Debug|x86.ActiveCfg = Debug|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Debug|x86.Build.0 = Debug|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Release|Any CPU.Build.0 = Release|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Release|x86.ActiveCfg = Release|Any CPU
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC}.Release|x86.Build.0 = Release|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Debug|x86.ActiveCfg = Debug|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Debug|x86.Build.0 = Debug|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Release|Any CPU.Build.0 = Release|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Release|x86.ActiveCfg = Release|Any CPU
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A}.Release|x86.Build.0 = Release|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Debug|x86.Build.0 = Debug|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Release|Any CPU.Build.0 = Release|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Release|x86.ActiveCfg = Release|Any CPU
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE}.Release|x86.Build.0 = Release|Any CPU
{0500845C-2F0F-4380-8D48-FC1CC5C3A9F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0500845C-2F0F-4380-8D48-FC1CC5C3A9F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0500845C-2F0F-4380-8D48-FC1CC5C3A9F3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1180,30 +1360,6 @@ Global
{A04124E5-E4AA-4311-8049-DAF371871B31}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{A04124E5-E4AA-4311-8049-DAF371871B31}.Release|x86.ActiveCfg = Release|Any CPU
{A04124E5-E4AA-4311-8049-DAF371871B31}.Release|x86.Build.0 = Release|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Debug|x86.ActiveCfg = Debug|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Debug|x86.Build.0 = Debug|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Release|Any CPU.Build.0 = Release|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Release|x86.ActiveCfg = Release|Any CPU
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9}.Release|x86.Build.0 = Release|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Debug|x86.Build.0 = Debug|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Release|Any CPU.Build.0 = Release|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Release|x86.ActiveCfg = Release|Any CPU
- {B3AE9A77-1198-4974-AA78-531CE6C568F3}.Release|x86.Build.0 = Release|Any CPU
{F95DC77B-CA52-4BBB-817E-79ABFE330C5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F95DC77B-CA52-4BBB-817E-79ABFE330C5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F95DC77B-CA52-4BBB-817E-79ABFE330C5C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1228,18 +1384,6 @@ Global
{1024A6BE-E0AF-4170-B61D-E6C092780195}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{1024A6BE-E0AF-4170-B61D-E6C092780195}.Release|x86.ActiveCfg = Release|Any CPU
{1024A6BE-E0AF-4170-B61D-E6C092780195}.Release|x86.Build.0 = Release|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Debug|x86.ActiveCfg = Debug|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Debug|x86.Build.0 = Debug|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Release|Any CPU.Build.0 = Release|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Release|x86.ActiveCfg = Release|Any CPU
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF}.Release|x86.Build.0 = Release|Any CPU
{449AD5B2-9CC7-4542-A28C-8BF2DAB96AC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{449AD5B2-9CC7-4542-A28C-8BF2DAB96AC6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{449AD5B2-9CC7-4542-A28C-8BF2DAB96AC6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1264,18 +1408,6 @@ Global
{39F64AD3-9F14-4898-B9C5-5A2900D0E9C6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{39F64AD3-9F14-4898-B9C5-5A2900D0E9C6}.Release|x86.ActiveCfg = Release|Any CPU
{39F64AD3-9F14-4898-B9C5-5A2900D0E9C6}.Release|x86.Build.0 = Release|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Debug|x86.Build.0 = Debug|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Release|Any CPU.Build.0 = Release|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Release|x86.ActiveCfg = Release|Any CPU
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9}.Release|x86.Build.0 = Release|Any CPU
{8BA78D3C-4474-4FC5-B36F-9B19A7D6BCA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8BA78D3C-4474-4FC5-B36F-9B19A7D6BCA4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8BA78D3C-4474-4FC5-B36F-9B19A7D6BCA4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1288,126 +1420,6 @@ Global
{8BA78D3C-4474-4FC5-B36F-9B19A7D6BCA4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{8BA78D3C-4474-4FC5-B36F-9B19A7D6BCA4}.Release|x86.ActiveCfg = Release|Any CPU
{8BA78D3C-4474-4FC5-B36F-9B19A7D6BCA4}.Release|x86.Build.0 = Release|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Debug|x86.Build.0 = Debug|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Release|Any CPU.Build.0 = Release|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Release|x86.ActiveCfg = Release|Any CPU
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE}.Release|x86.Build.0 = Release|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Debug|x86.Build.0 = Debug|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Release|Any CPU.Build.0 = Release|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Release|x86.ActiveCfg = Release|Any CPU
- {B37FF37D-0A47-494A-B5ED-497F273B9067}.Release|x86.Build.0 = Release|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Debug|x86.ActiveCfg = Debug|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Debug|x86.Build.0 = Debug|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Release|Any CPU.Build.0 = Release|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Release|x86.ActiveCfg = Release|Any CPU
- {22F657F5-7D95-438A-985A-A390938E7843}.Release|x86.Build.0 = Release|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Debug|x86.ActiveCfg = Debug|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Debug|x86.Build.0 = Debug|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Release|Any CPU.Build.0 = Release|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Release|x86.ActiveCfg = Release|Any CPU
- {731B64B8-AB91-4A05-AE5C-929996D58A52}.Release|x86.Build.0 = Release|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Debug|x86.Build.0 = Debug|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Release|Any CPU.Build.0 = Release|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Release|x86.ActiveCfg = Release|Any CPU
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5}.Release|x86.Build.0 = Release|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Debug|x86.Build.0 = Debug|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Release|Any CPU.Build.0 = Release|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Release|x86.ActiveCfg = Release|Any CPU
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764}.Release|x86.Build.0 = Release|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Debug|x86.ActiveCfg = Debug|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Debug|x86.Build.0 = Debug|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Release|Any CPU.Build.0 = Release|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Release|x86.ActiveCfg = Release|Any CPU
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257}.Release|x86.Build.0 = Release|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Debug|x86.Build.0 = Debug|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Release|Any CPU.Build.0 = Release|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Release|x86.ActiveCfg = Release|Any CPU
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE}.Release|x86.Build.0 = Release|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Debug|x86.ActiveCfg = Debug|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Debug|x86.Build.0 = Debug|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Release|Any CPU.Build.0 = Release|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Release|x86.ActiveCfg = Release|Any CPU
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164}.Release|x86.Build.0 = Release|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Debug|x86.Build.0 = Debug|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Release|Any CPU.Build.0 = Release|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Release|x86.ActiveCfg = Release|Any CPU
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE}.Release|x86.Build.0 = Release|Any CPU
{7DBA484B-BA85-4768-9002-68F49C2D9A86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7DBA484B-BA85-4768-9002-68F49C2D9A86}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7DBA484B-BA85-4768-9002-68F49C2D9A86}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1456,18 +1468,6 @@ Global
{DCB4C407-1121-4AB0-A6B6-DF28B8EBCBD1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{DCB4C407-1121-4AB0-A6B6-DF28B8EBCBD1}.Release|x86.ActiveCfg = Release|Any CPU
{DCB4C407-1121-4AB0-A6B6-DF28B8EBCBD1}.Release|x86.Build.0 = Release|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Debug|x86.Build.0 = Debug|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Release|Any CPU.Build.0 = Release|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Release|x86.ActiveCfg = Release|Any CPU
- {47C60935-CF5B-459C-B6C4-760350F3904B}.Release|x86.Build.0 = Release|Any CPU
{12D0BEB8-A1C6-4712-8368-83BC65428CA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{12D0BEB8-A1C6-4712-8368-83BC65428CA8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{12D0BEB8-A1C6-4712-8368-83BC65428CA8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1540,30 +1540,6 @@ Global
{C75C6E51-4FFD-4902-8739-9109E51875B4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{C75C6E51-4FFD-4902-8739-9109E51875B4}.Release|x86.ActiveCfg = Release|Any CPU
{C75C6E51-4FFD-4902-8739-9109E51875B4}.Release|x86.Build.0 = Release|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Debug|x86.ActiveCfg = Debug|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Debug|x86.Build.0 = Debug|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Release|Any CPU.Build.0 = Release|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Release|x86.ActiveCfg = Release|Any CPU
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189}.Release|x86.Build.0 = Release|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Debug|x86.ActiveCfg = Debug|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Debug|x86.Build.0 = Debug|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Release|Any CPU.Build.0 = Release|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Release|x86.ActiveCfg = Release|Any CPU
- {35AE5599-AD99-4198-AC91-C599459E9023}.Release|x86.Build.0 = Release|Any CPU
{D9BE3E50-5CE8-4D8D-BA19-AA219D009752}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D9BE3E50-5CE8-4D8D-BA19-AA219D009752}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D9BE3E50-5CE8-4D8D-BA19-AA219D009752}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1576,6 +1552,42 @@ Global
{D9BE3E50-5CE8-4D8D-BA19-AA219D009752}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{D9BE3E50-5CE8-4D8D-BA19-AA219D009752}.Release|x86.ActiveCfg = Release|Any CPU
{D9BE3E50-5CE8-4D8D-BA19-AA219D009752}.Release|x86.Build.0 = Release|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Debug|x86.Build.0 = Debug|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Release|x86.ActiveCfg = Release|Any CPU
+ {F2D4A859-7B84-403E-9745-01032EC705C5}.Release|x86.Build.0 = Release|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Debug|x86.Build.0 = Debug|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Release|x86.ActiveCfg = Release|Any CPU
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF}.Release|x86.Build.0 = Release|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Debug|x86.Build.0 = Debug|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Release|x86.ActiveCfg = Release|Any CPU
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1639,60 +1651,61 @@ Global
{E3E09D2F-1FCF-4396-9B09-5A62CA8CC831} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
{17122147-ADFD-41C8-87D9-CCC582CCA8F9} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
{51E3E785-A9D1-4196-BAFE-A17FF4304B89} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
- {910F023A-88E3-4CB4-8793-AC4005C7B421} = {2859F266-673A-45A2-9E3C-7B39C6DDD38E}
- {E89EB74D-C1CE-456F-B42D-CCF1575E0CFB} = {2859F266-673A-45A2-9E3C-7B39C6DDD38E}
{DD7B9F20-354C-4D9E-8C8A-8AE6E7595A87} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
{3B550487-10E4-4E6D-9CEF-B1B4CA1253DA} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
- {D7C6A696-F232-4288-BCCD-367407E4A934} = {2859F266-673A-45A2-9E3C-7B39C6DDD38E}
{4EDC489F-3EC5-4AE3-9841-A285F40F5FF6} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
{2F683CF8-B055-46AE-BF83-9D1307F8D45F} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
{34E3C302-B767-40C8-B538-3EE2BD4000C4} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
+ {0930C2EA-FA36-4EDF-A571-215765D1F2C7} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {A273BAAB-DA92-401D-B781-ADA9E3B7717C} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {E07B7D3A-1D4D-4644-84C2-06FEDB64885B} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {0F5F9381-D3B4-4E0D-9FAA-CC12520DBB4A} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {2E18C4FD-9982-4BD9-A067-3CE56E68C450} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {C79D9793-FADA-4B1A-8AD7-8AEDB2358CA2} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {BCD18147-D96D-4240-A89F-5F890392E58E} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {986BF4FD-D0E3-48AE-917C-6C168D6395D3} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {F4E1F1ED-2DE9-4659-B2E7-C9B6B8454AD1} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {F4846AC2-384E-4C0B-8DE5-9784715E4A9F} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {C019C7EC-FDEE-4EAF-ABF1-89D946EFC95A} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {68C9E09E-F7FA-4853-B512-6BCD02BB69C1} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {9F2C52EA-1869-4610-921F-5FD654582019} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {AA074523-64D3-4CA7-8C2E-EACD977D2B19} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {47D5BF2A-7B05-4630-8C7C-A682382EA6F1} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {72D40CFE-93B5-4877-92DC-E79203641342} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {62952E87-88DB-45BA-9FE0-8A24FA983750} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {F4879FAE-CD3C-4158-9BF0-B8D9294CCD0D} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {157F16EA-C5C1-4BDF-A81C-44A7771A13D7} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {457D7B8F-C81D-4F0C-BE88-B0516374944E} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {69D6513F-66AD-44C6-BD3F-8DE78CB4398F} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {1348A3AB-8401-4DAE-90CC-A5907ED52A36} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {1C4D389D-F3BB-4328-A730-E3CC2F5D8B1B} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {94A04746-8698-4DEF-BCFC-8BA2D3F8A451} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
{0CA44B59-6538-4668-BB5E-D586946426F3} = {FDC66952-A3EA-4074-899E-C29816BF7C1F}
- {0F41EB10-BD4E-443C-868B-95109F0843E0} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {68C06221-185E-41E3-B2C8-B4A1B3D20631} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {AFA70552-7405-4655-8899-FED6B5F393BD} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {47F3C605-0674-4943-A378-45B4A54B5F14} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {9C584DF9-CDF2-4522-A0A5-55AAE36820EC} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {CFEFED8B-D109-4628-BE40-B02A3A659AB0} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {C1A7CBEB-06C9-40DD-B1A0-3FD61045B3AE} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {5C838817-4DEC-4BA0-BACC-2F512B8245AC} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {0FFF6859-E8EF-485C-9F61-CE64BAE8E95A} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {E78D6ACC-439B-44ED-9EB0-98A93B40A7FE} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {0500845C-2F0F-4380-8D48-FC1CC5C3A9F3} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {A04124E5-E4AA-4311-8049-DAF371871B31} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {A6018CDE-37DD-4317-80EB-01DB306EA5B9} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {B3AE9A77-1198-4974-AA78-531CE6C568F3} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {F95DC77B-CA52-4BBB-817E-79ABFE330C5C} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {1024A6BE-E0AF-4170-B61D-E6C092780195} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {0F04DD66-08B7-47F4-9826-66CD8FD539FF} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {449AD5B2-9CC7-4542-A28C-8BF2DAB96AC6} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {39F64AD3-9F14-4898-B9C5-5A2900D0E9C6} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {CC2FF678-438C-4343-A1A7-BF3E75470EB9} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {8BA78D3C-4474-4FC5-B36F-9B19A7D6BCA4} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {C185A2B1-64C0-491B-9AAE-382C24F9B4AE} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {B37FF37D-0A47-494A-B5ED-497F273B9067} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {22F657F5-7D95-438A-985A-A390938E7843} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {731B64B8-AB91-4A05-AE5C-929996D58A52} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {2D665D68-BF48-41E0-B74C-A88A83F8AFD5} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {E07090BD-05AF-4DC0-9D59-35EF70EBC764} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {22D26FB5-C5AE-4B0C-B1CB-AAE1C3519257} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {E335D925-771A-4FB9-A94C-1D74A8F01DCE} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {FF88FB5E-0096-4096-A0D7-FCFE5D55F164} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {4D04F472-8E7C-487D-8B57-9533B1F7F3DE} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {7DBA484B-BA85-4768-9002-68F49C2D9A86} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {60FC5D94-2FE1-47B4-BDBA-72611BFD7C90} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {C72560B4-C9AC-49EA-B202-89BCD3826EB8} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {DCB4C407-1121-4AB0-A6B6-DF28B8EBCBD1} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {47C60935-CF5B-459C-B6C4-760350F3904B} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {12D0BEB8-A1C6-4712-8368-83BC65428CA8} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {CC355676-B7EF-4A0E-9659-BCB50127E850} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {D4ED031D-12F4-4522-BDDA-1D36E0E75D8C} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {9401F793-F2F3-45C6-8232-EF40700DA0A4} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {848E2620-EAF9-4BFD-8810-4AF71E09A8FB} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {C75C6E51-4FFD-4902-8739-9109E51875B4} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {11D8DEBD-2E84-4EF2-8039-4B4BAC58F189} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
- {35AE5599-AD99-4198-AC91-C599459E9023} = {9328599D-A7AF-43BC-BE08-7503DF9B8CE6}
+ {0F41EB10-BD4E-443C-868B-95109F0843E0} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {68C06221-185E-41E3-B2C8-B4A1B3D20631} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {9C584DF9-CDF2-4522-A0A5-55AAE36820EC} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {C1A7CBEB-06C9-40DD-B1A0-3FD61045B3AE} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {0500845C-2F0F-4380-8D48-FC1CC5C3A9F3} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {A04124E5-E4AA-4311-8049-DAF371871B31} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {F95DC77B-CA52-4BBB-817E-79ABFE330C5C} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {1024A6BE-E0AF-4170-B61D-E6C092780195} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {449AD5B2-9CC7-4542-A28C-8BF2DAB96AC6} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {39F64AD3-9F14-4898-B9C5-5A2900D0E9C6} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {8BA78D3C-4474-4FC5-B36F-9B19A7D6BCA4} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {7DBA484B-BA85-4768-9002-68F49C2D9A86} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {60FC5D94-2FE1-47B4-BDBA-72611BFD7C90} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {C72560B4-C9AC-49EA-B202-89BCD3826EB8} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {DCB4C407-1121-4AB0-A6B6-DF28B8EBCBD1} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {12D0BEB8-A1C6-4712-8368-83BC65428CA8} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {CC355676-B7EF-4A0E-9659-BCB50127E850} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {D4ED031D-12F4-4522-BDDA-1D36E0E75D8C} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {9401F793-F2F3-45C6-8232-EF40700DA0A4} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {848E2620-EAF9-4BFD-8810-4AF71E09A8FB} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
+ {C75C6E51-4FFD-4902-8739-9109E51875B4} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
{D9BE3E50-5CE8-4D8D-BA19-AA219D009752} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C}
+ {F2D4A859-7B84-403E-9745-01032EC705C5} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E}
+ {23A6033D-2AA6-4629-BC1B-14694E3794FF} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1}
+ {69E18B21-E4B9-4866-ABDA-3C2D9664D24C} = {5FE3048A-E96B-44F8-A7C4-FC590D7E04B4}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {63D344F6-F86D-40E6-85B9-0AABBE338C4A}
diff --git a/src/Mvc/benchmarkapps/BasicApi/BasicApi.csproj b/src/Mvc/benchmarkapps/BasicApi/BasicApi.csproj
index 6e5e88e453..5cc6259844 100644
--- a/src/Mvc/benchmarkapps/BasicApi/BasicApi.csproj
+++ b/src/Mvc/benchmarkapps/BasicApi/BasicApi.csproj
@@ -6,7 +6,8 @@
$(DefineConstants);GENERATE_SQL_SCRIPTS
$(DefineConstants);__RemoveThisBitTo__GENERATE_SQL_SCRIPTS
- CS8002;$(WarningsNotAsErrors)
+
+ false
true
@@ -17,6 +18,8 @@
+
+
diff --git a/src/Mvc/benchmarkapps/BasicViews/BasicViews.csproj b/src/Mvc/benchmarkapps/BasicViews/BasicViews.csproj
index 10a068db81..ef8b17d1e2 100644
--- a/src/Mvc/benchmarkapps/BasicViews/BasicViews.csproj
+++ b/src/Mvc/benchmarkapps/BasicViews/BasicViews.csproj
@@ -6,21 +6,20 @@
$(DefineConstants);GENERATE_SQL_SCRIPTS
$(DefineConstants);__RemoveThisBitTo__GENERATE_SQL_SCRIPTS
- CS8002;$(WarningsNotAsErrors)
+
+ false
true
-
-
-
-
+
+
diff --git a/src/Mvc/benchmarkapps/Directory.Build.props b/src/Mvc/benchmarkapps/Directory.Build.props
new file mode 100644
index 0000000000..56a40aaa38
--- /dev/null
+++ b/src/Mvc/benchmarkapps/Directory.Build.props
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Mvc/benchmarkapps/Directory.Build.targets b/src/Mvc/benchmarkapps/Directory.Build.targets
new file mode 100644
index 0000000000..2e3fb2fa71
--- /dev/null
+++ b/src/Mvc/benchmarkapps/Directory.Build.targets
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/Mvc/samples/MvcSandbox/HealthChecks/HealthChecksEndpointRouteBuilderExtensions.cs b/src/Mvc/samples/MvcSandbox/HealthChecks/HealthChecksEndpointRouteBuilderExtensions.cs
deleted file mode 100644
index b89acdd2b4..0000000000
--- a/src/Mvc/samples/MvcSandbox/HealthChecks/HealthChecksEndpointRouteBuilderExtensions.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.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!");
- });
- }
- }
-}
diff --git a/src/Mvc/samples/MvcSandbox/MvcSandbox.csproj b/src/Mvc/samples/MvcSandbox/MvcSandbox.csproj
index 3e0d928151..9d3ee6d844 100644
--- a/src/Mvc/samples/MvcSandbox/MvcSandbox.csproj
+++ b/src/Mvc/samples/MvcSandbox/MvcSandbox.csproj
@@ -7,6 +7,7 @@
+
@@ -14,7 +15,7 @@
-
+
diff --git a/src/Mvc/samples/MvcSandbox/Startup.cs b/src/Mvc/samples/MvcSandbox/Startup.cs
index c958e06b8e..d6c039de1a 100644
--- a/src/Mvc/samples/MvcSandbox/Startup.cs
+++ b/src/Mvc/samples/MvcSandbox/Startup.cs
@@ -26,7 +26,9 @@ namespace MvcSandbox
{
options.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer);
});
- services.AddMvc().SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Latest);
+ services.AddMvc()
+ .AddRazorRuntimeCompilation()
+ .SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Latest);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
@@ -65,8 +67,6 @@ namespace MvcSandbox
});
builder.MapApplication();
-
- builder.MapHealthChecks("/healthz");
});
app.UseDeveloperExceptionPage();
diff --git a/src/Mvc/src/GetDocumentInsider/GetDocumentInsider.csproj b/src/Mvc/src/GetDocumentInsider/GetDocumentInsider.csproj
index 81f0d939d7..3b09c3a0db 100644
--- a/src/Mvc/src/GetDocumentInsider/GetDocumentInsider.csproj
+++ b/src/Mvc/src/GetDocumentInsider/GetDocumentInsider.csproj
@@ -18,7 +18,9 @@
-
+
+ true
+
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Analyzers/Microsoft.AspNetCore.Mvc.Analyzers.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Analyzers/Microsoft.AspNetCore.Mvc.Analyzers.csproj
index 23c329ceb2..4d9d6e4ea2 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Analyzers/Microsoft.AspNetCore.Mvc.Analyzers.csproj
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Analyzers/Microsoft.AspNetCore.Mvc.Analyzers.csproj
@@ -2,7 +2,7 @@
CSharp Analyzers for ASP.NET Core MVC.
aspnetcore;aspnetcoremvc
- true
+ true
netstandard1.3
false
@@ -15,10 +15,6 @@
-
-
-
-
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Api.Analyzers/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Api.Analyzers/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj
index 35900f7360..f874b02d1e 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Api.Analyzers/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Api.Analyzers/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj
@@ -2,7 +2,7 @@
CSharp Analyzers for ASP.NET Core MVC.
aspnetcore;aspnetcoremvc
- true
+ true
netstandard1.3
false
@@ -20,10 +20,6 @@
-
-
-
-
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/AttributeRouteModel.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/AttributeRouteModel.cs
index 4623d67090..333033d00d 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/AttributeRouteModel.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ApplicationModels/AttributeRouteModel.cs
@@ -231,6 +231,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
var state = TemplateParserState.Plaintext;
int? tokenStart = null;
+ var scope = 0;
// We'll run the loop one extra time with 'null' to detect the end of the string.
for (var i = 0; i <= template.Length; i++)
@@ -241,6 +242,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
case TemplateParserState.Plaintext:
if (c == '[')
{
+ scope++;
state = TemplateParserState.SeenLeft;
break;
}
@@ -321,6 +323,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
}
else if (c == ']')
{
+ --scope;
state = TemplateParserState.InsideToken | TemplateParserState.SeenRight;
break;
}
@@ -353,7 +356,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
throw new InvalidOperationException(message);
}
case TemplateParserState.InsideToken | TemplateParserState.SeenRight:
- if (c == ']')
+ if (c == ']' && scope == 0)
{
// This is an escaped right-bracket
state = TemplateParserState.InsideToken;
@@ -402,6 +405,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
state = TemplateParserState.Plaintext;
}
+ scope = 0;
tokenStart = null;
break;
}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs
index 22078bb2a5..359b43c14d 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs
@@ -221,8 +221,7 @@ namespace Microsoft.AspNetCore.Mvc
}
///
- /// Creates a object with by specifying a
- /// string.
+ /// Creates a object by specifying a string.
///
/// The content to write to the response.
/// The created object for the response.
@@ -231,7 +230,7 @@ namespace Microsoft.AspNetCore.Mvc
=> Content(content, (MediaTypeHeaderValue)null);
///
- /// Creates a object with by specifying a
+ /// Creates a object by specifying a
/// string and a content type.
///
/// The content to write to the response.
@@ -242,7 +241,7 @@ namespace Microsoft.AspNetCore.Mvc
=> Content(content, MediaTypeHeaderValue.Parse(contentType));
///
- /// Creates a object with by specifying a
+ /// Creates a object by specifying a
/// string, a , and .
///
/// The content to write to the response.
@@ -262,7 +261,7 @@ namespace Microsoft.AspNetCore.Mvc
}
///
- /// Creates a object with by specifying a
+ /// Creates a object by specifying a
/// string and a .
///
/// The content to write to the response.
@@ -282,7 +281,7 @@ namespace Microsoft.AspNetCore.Mvc
///
/// Creates a object that produces an empty
- /// response.
+ /// response.
///
/// The created object for the response.
[NonAction]
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Binders/CollectionModelBinder.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Binders/CollectionModelBinder.cs
index 0eaf3b92c8..70aa099cfe 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Binders/CollectionModelBinder.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Binders/CollectionModelBinder.cs
@@ -448,17 +448,8 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders
private static IEnumerable GetIndexNamesFromValueProviderResult(ValueProviderResult valueProviderResult)
{
- IEnumerable indexNames = null;
- if (valueProviderResult != null)
- {
- var indexes = (string[])valueProviderResult;
- if (indexes != null && indexes.Length > 0)
- {
- indexNames = indexes;
- }
- }
-
- return indexNames;
+ var indexes = (string[])valueProviderResult;
+ return (indexes == null || indexes.Length == 0) ? null : indexes;
}
}
}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/UrlHelperExtensions.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/UrlHelperExtensions.cs
index 40c673da8c..7767263b9d 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/UrlHelperExtensions.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/UrlHelperExtensions.cs
@@ -117,8 +117,8 @@ namespace Microsoft.AspNetCore.Mvc
///
///
/// This method uses the value of to populate the host section of the generated URI.
- /// Relying on the value of the current request can allow untrusted input to influence the resulting URI unless
- /// the Host header has been validated. See the deployment documentation for instructions on how to properly
+ /// Relying on the value of the current request can allow untrusted input to influence the resulting URI unless
+ /// the Host header has been validated. See the deployment documentation for instructions on how to properly
/// validate the Host header in your deployment environment.
///
///
@@ -286,8 +286,8 @@ namespace Microsoft.AspNetCore.Mvc
///
///
/// This method uses the value of to populate the host section of the generated URI.
- /// Relying on the value of the current request can allow untrusted input to influence the resulting URI unless
- /// the Host header has been validated. See the deployment documentation for instructions on how to properly
+ /// Relying on the value of the current request can allow untrusted input to influence the resulting URI unless
+ /// the Host header has been validated. See the deployment documentation for instructions on how to properly
/// validate the Host header in your deployment environment.
///
///
@@ -443,8 +443,8 @@ namespace Microsoft.AspNetCore.Mvc
///
///
/// This method uses the value of to populate the host section of the generated URI.
- /// Relying on the value of the current request can allow untrusted input to influence the resulting URI unless
- /// the Host header has been validated. See the deployment documentation for instructions on how to properly
+ /// Relying on the value of the current request can allow untrusted input to influence the resulting URI unless
+ /// the Host header has been validated. See the deployment documentation for instructions on how to properly
/// validate the Host header in your deployment environment.
///
///
@@ -457,7 +457,7 @@ namespace Microsoft.AspNetCore.Mvc
=> Page(urlHelper, pageName, pageHandler, values, protocol, host: null, fragment: null);
///
- /// Generates a URL with an absolute path for the specified . See the remarks section for
+ /// Generates a URL with an absolute path for the specified . See the remarks section for
/// important security information.
///
/// The .
@@ -530,5 +530,109 @@ namespace Microsoft.AspNetCore.Mvc
host: host,
fragment: fragment);
}
+
+ ///
+ /// Generates an absolute URL for an action method, which contains the specified
+ /// name, name, route ,
+ /// to use, name, and .
+ /// Generates an absolute URL if the and are
+ /// non-null . See the remarks section for important security information.
+ ///
+ /// The .
+ /// The name of the action method. When , defaults to the current executing action.
+ /// The name of the controller. When , defaults to the current executing controller.
+ /// An object that contains route values.
+ /// The protocol for the URL, such as "http" or "https".
+ /// The host name for the URL.
+ /// The fragment for the URL.
+ /// The generated URL.
+ ///
+ ///
+ /// The value of should be a trusted value. Relying on the value of the current request
+ /// can allow untrusted input to influence the resulting URI unless the Host header has been validated.
+ /// See the deployment documentation for instructions on how to properly validate the Host header in
+ /// your deployment environment.
+ ///
+ ///
+ public static string ActionLink(
+ this IUrlHelper helper,
+ string action = null,
+ string controller = null,
+ object values = null,
+ string protocol = null,
+ string host = null,
+ string fragment = null)
+ {
+ if (helper == null)
+ {
+ throw new ArgumentNullException(nameof(helper));
+ }
+
+ var httpContext = helper.ActionContext.HttpContext;
+
+ if (protocol == null)
+ {
+ protocol = httpContext.Request.Protocol;
+ }
+
+ if (host == null)
+ {
+ host = httpContext.Request.Host.ToUriComponent();
+ }
+
+ return Action(helper, action, controller, values, protocol, host, fragment);
+ }
+
+ ///
+ /// Generates an absolute URL for a page, which contains the specified
+ /// , , route ,
+ /// to use, name, and .
+ /// Generates an absolute URL if the and are
+ /// non-null . See the remarks section for important security information.
+ ///
+ /// The .
+ /// The page name to generate the url for. When , defaults to the current executing page.
+ /// The handler to generate the url for. When , defaults to the current executing handler.
+ /// An object that contains route values.
+ /// The protocol for the URL, such as "http" or "https".
+ /// The host name for the URL.
+ /// The fragment for the URL.
+ /// The generated URL.
+ ///
+ ///
+ /// The value of should be a trusted value. Relying on the value of the current request
+ /// can allow untrusted input to influence the resulting URI unless the Host header has been validated.
+ /// See the deployment documentation for instructions on how to properly validate the Host header in
+ /// your deployment environment.
+ ///
+ ///
+ public static string PageLink(
+ this IUrlHelper urlHelper,
+ string pageName = null,
+ string pageHandler = null,
+ object values = null,
+ string protocol = null,
+ string host = null,
+ string fragment = null)
+ {
+ if (urlHelper == null)
+ {
+ throw new ArgumentNullException(nameof(urlHelper));
+ }
+
+ var httpContext = urlHelper.ActionContext.HttpContext;
+
+ if (protocol == null)
+ {
+ protocol = httpContext.Request.Protocol;
+ }
+
+ if (host == null)
+ {
+ host = httpContext.Request.Host.ToUriComponent();
+ }
+
+ return Page(urlHelper, pageName, pageHandler, values, protocol, host, fragment);
+ }
}
}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.NewtonsoftJson/Microsoft.AspNetCore.Mvc.NewtonsoftJson.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.NewtonsoftJson/Microsoft.AspNetCore.Mvc.NewtonsoftJson.csproj
index 9bb08478c3..e1645892c9 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.NewtonsoftJson/Microsoft.AspNetCore.Mvc.NewtonsoftJson.csproj
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.NewtonsoftJson/Microsoft.AspNetCore.Mvc.NewtonsoftJson.csproj
@@ -6,6 +6,7 @@
$(NoWarn);CS1591
true
aspnetcore;aspnetcoremvc;json
+ true
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/CSharpCompiler.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/CSharpCompiler.cs
new file mode 100644
index 0000000000..4aeb006421
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/CSharpCompiler.cs
@@ -0,0 +1,226 @@
+// 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.Hosting;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.Emit;
+using Microsoft.CodeAnalysis.Text;
+using Microsoft.Extensions.DependencyModel;
+using DependencyContextCompilationOptions = Microsoft.Extensions.DependencyModel.CompilationOptions;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class CSharpCompiler
+ {
+ private readonly RazorReferenceManager _referenceManager;
+ private readonly IHostingEnvironment _hostingEnvironment;
+ private bool _optionsInitialized;
+ private CSharpParseOptions _parseOptions;
+ private CSharpCompilationOptions _compilationOptions;
+ private EmitOptions _emitOptions;
+ private bool _emitPdb;
+
+ public CSharpCompiler(RazorReferenceManager manager, IHostingEnvironment hostingEnvironment)
+ {
+ _referenceManager = manager ?? throw new ArgumentNullException(nameof(manager));
+ _hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
+ }
+
+ public virtual CSharpParseOptions ParseOptions
+ {
+ get
+ {
+ EnsureOptions();
+ return _parseOptions;
+ }
+ }
+
+ public virtual CSharpCompilationOptions CSharpCompilationOptions
+ {
+ get
+ {
+ EnsureOptions();
+ return _compilationOptions;
+ }
+ }
+
+ public virtual bool EmitPdb
+ {
+ get
+ {
+ EnsureOptions();
+ return _emitPdb;
+ }
+ }
+
+ public virtual EmitOptions EmitOptions
+ {
+ get
+ {
+ EnsureOptions();
+ return _emitOptions;
+ }
+ }
+
+ public SyntaxTree CreateSyntaxTree(SourceText sourceText)
+ {
+ return CSharpSyntaxTree.ParseText(
+ sourceText,
+ options: ParseOptions);
+ }
+
+ public CSharpCompilation CreateCompilation(string assemblyName)
+ {
+ return CSharpCompilation.Create(
+ assemblyName,
+ options: CSharpCompilationOptions,
+ references: _referenceManager.CompilationReferences);
+ }
+
+ // Internal for unit testing.
+ protected internal virtual DependencyContextCompilationOptions GetDependencyContextCompilationOptions()
+ {
+ if (!string.IsNullOrEmpty(_hostingEnvironment.ApplicationName))
+ {
+ var applicationAssembly = Assembly.Load(new AssemblyName(_hostingEnvironment.ApplicationName));
+ var dependencyContext = DependencyContext.Load(applicationAssembly);
+ if (dependencyContext?.CompilationOptions != null)
+ {
+ return dependencyContext.CompilationOptions;
+ }
+ }
+
+ return DependencyContextCompilationOptions.Default;
+ }
+
+ private void EnsureOptions()
+ {
+ if (!_optionsInitialized)
+ {
+ var dependencyContextOptions = GetDependencyContextCompilationOptions();
+ _parseOptions = GetParseOptions(_hostingEnvironment, dependencyContextOptions);
+ _compilationOptions = GetCompilationOptions(_hostingEnvironment, dependencyContextOptions);
+ _emitOptions = GetEmitOptions(dependencyContextOptions);
+
+ _optionsInitialized = true;
+ }
+ }
+
+ private EmitOptions GetEmitOptions(DependencyContextCompilationOptions dependencyContextOptions)
+ {
+ // Assume we're always producing pdbs unless DebugType = none
+ _emitPdb = true;
+ DebugInformationFormat debugInformationFormat;
+ if (string.IsNullOrEmpty(dependencyContextOptions.DebugType))
+ {
+ debugInformationFormat = DebugInformationFormat.PortablePdb;
+ }
+ else
+ {
+ // Based on https://github.com/dotnet/roslyn/blob/1d28ff9ba248b332de3c84d23194a1d7bde07e4d/src/Compilers/CSharp/Portable/CommandLine/CSharpCommandLineParser.cs#L624-L640
+ switch (dependencyContextOptions.DebugType.ToLower())
+ {
+ case "none":
+ // There isn't a way to represent none in DebugInformationFormat.
+ // We'll set EmitPdb to false and let callers handle it by setting a null pdb-stream.
+ _emitPdb = false;
+ return new EmitOptions();
+ case "portable":
+ debugInformationFormat = DebugInformationFormat.PortablePdb;
+ break;
+ case "embedded":
+ // Roslyn does not expose enough public APIs to produce a binary with embedded pdbs.
+ // We'll produce PortablePdb instead to continue providing a reasonable user experience.
+ debugInformationFormat = DebugInformationFormat.PortablePdb;
+ break;
+ case "full":
+ case "pdbonly":
+ debugInformationFormat = DebugInformationFormat.PortablePdb;
+ break;
+ default:
+ throw new InvalidOperationException(Resources.FormatUnsupportedDebugInformationFormat(dependencyContextOptions.DebugType));
+ }
+ }
+
+ var emitOptions = new EmitOptions(debugInformationFormat: debugInformationFormat);
+ return emitOptions;
+ }
+
+ private static CSharpCompilationOptions GetCompilationOptions(
+ IHostingEnvironment hostingEnvironment,
+ DependencyContextCompilationOptions dependencyContextOptions)
+ {
+ var csharpCompilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
+
+ // Disable 1702 until roslyn turns this off by default
+ csharpCompilationOptions = csharpCompilationOptions.WithSpecificDiagnosticOptions(
+ new Dictionary
+ {
+ {"CS1701", ReportDiagnostic.Suppress}, // Binding redirects
+ {"CS1702", ReportDiagnostic.Suppress},
+ {"CS1705", ReportDiagnostic.Suppress}
+ });
+
+ if (dependencyContextOptions.AllowUnsafe.HasValue)
+ {
+ csharpCompilationOptions = csharpCompilationOptions.WithAllowUnsafe(
+ dependencyContextOptions.AllowUnsafe.Value);
+ }
+
+ OptimizationLevel optimizationLevel;
+ if (dependencyContextOptions.Optimize.HasValue)
+ {
+ optimizationLevel = dependencyContextOptions.Optimize.Value ?
+ OptimizationLevel.Release :
+ OptimizationLevel.Debug;
+ }
+ else
+ {
+ optimizationLevel = hostingEnvironment.IsDevelopment() ?
+ OptimizationLevel.Debug :
+ OptimizationLevel.Release;
+ }
+ csharpCompilationOptions = csharpCompilationOptions.WithOptimizationLevel(optimizationLevel);
+
+ if (dependencyContextOptions.WarningsAsErrors.HasValue)
+ {
+ var reportDiagnostic = dependencyContextOptions.WarningsAsErrors.Value ?
+ ReportDiagnostic.Error :
+ ReportDiagnostic.Default;
+ csharpCompilationOptions = csharpCompilationOptions.WithGeneralDiagnosticOption(reportDiagnostic);
+ }
+
+ return csharpCompilationOptions;
+ }
+
+ private static CSharpParseOptions GetParseOptions(
+ IHostingEnvironment hostingEnvironment,
+ DependencyContextCompilationOptions dependencyContextOptions)
+ {
+ var configurationSymbol = hostingEnvironment.IsDevelopment() ? "DEBUG" : "RELEASE";
+ var defines = dependencyContextOptions.Defines.Concat(new[] { configurationSymbol });
+
+ var parseOptions = new CSharpParseOptions(preprocessorSymbols: defines);
+
+ if (!string.IsNullOrEmpty(dependencyContextOptions.LanguageVersion))
+ {
+ if (LanguageVersionFacts.TryParse(dependencyContextOptions.LanguageVersion, out var languageVersion))
+ {
+ parseOptions = parseOptions.WithLanguageVersion(languageVersion);
+ }
+ else
+ {
+ Debug.Fail($"LanguageVersion {languageVersion} specified in the deps file could not be parsed.");
+ }
+ }
+
+ return parseOptions;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/ChecksumValidator.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/ChecksumValidator.cs
new file mode 100644
index 0000000000..220d803151
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/ChecksumValidator.cs
@@ -0,0 +1,122 @@
+// 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.Razor.Hosting;
+using Microsoft.AspNetCore.Razor.Language;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal static class ChecksumValidator
+ {
+ public static bool IsRecompilationSupported(RazorCompiledItem item)
+ {
+ if (item == null)
+ {
+ throw new ArgumentNullException(nameof(item));
+ }
+
+ // A Razor item only supports recompilation if its primary source file has a checksum.
+ //
+ // Other files (view imports) may or may not have existed at the time of compilation,
+ // so we may not have checksums for them.
+ var checksums = item.GetChecksumMetadata();
+ return checksums.Any(c => string.Equals(item.Identifier, c.Identifier, StringComparison.OrdinalIgnoreCase));
+ }
+
+ // Validates that we can use an existing precompiled view by comparing checksums with files on
+ // disk.
+ public static bool IsItemValid(RazorProjectFileSystem fileSystem, RazorCompiledItem item)
+ {
+ if (fileSystem == null)
+ {
+ throw new ArgumentNullException(nameof(fileSystem));
+ }
+
+ if (item == null)
+ {
+ throw new ArgumentNullException(nameof(item));
+ }
+
+ var checksums = item.GetChecksumMetadata();
+
+ // The checksum that matches 'Item.Identity' in this list is significant. That represents the main file.
+ //
+ // We don't really care about the validation unless the main file exists. This is because we expect
+ // most sites to have some _ViewImports in common location. That means that in the case you're
+ // using views from a 3rd party library, you'll always have **some** conflicts.
+ //
+ // The presence of the main file with the same content is a very strong signal that you're in a
+ // development scenario.
+ var primaryChecksum = checksums
+ .FirstOrDefault(c => string.Equals(item.Identifier, c.Identifier, StringComparison.OrdinalIgnoreCase));
+ if (primaryChecksum == null)
+ {
+ // No primary checksum, assume valid.
+ return true;
+ }
+
+ var projectItem = fileSystem.GetItem(primaryChecksum.Identifier);
+ if (!projectItem.Exists)
+ {
+ // Main file doesn't exist - assume valid.
+ return true;
+ }
+
+ var sourceDocument = RazorSourceDocument.ReadFrom(projectItem);
+ if (!string.Equals(sourceDocument.GetChecksumAlgorithm(), primaryChecksum.ChecksumAlgorithm) ||
+ !ChecksumsEqual(primaryChecksum.Checksum, sourceDocument.GetChecksum()))
+ {
+ // Main file exists, but checksums not equal.
+ return false;
+ }
+
+ for (var i = 0; i < checksums.Count; i++)
+ {
+ var checksum = checksums[i];
+ if (string.Equals(item.Identifier, checksum.Identifier, StringComparison.OrdinalIgnoreCase))
+ {
+ // Ignore primary checksum on this pass.
+ continue;
+ }
+
+ var importItem = fileSystem.GetItem(checksum.Identifier);
+ if (!importItem.Exists)
+ {
+ // Import file doesn't exist - assume invalid.
+ return false;
+ }
+
+ sourceDocument = RazorSourceDocument.ReadFrom(importItem);
+ if (!string.Equals(sourceDocument.GetChecksumAlgorithm(), checksum.ChecksumAlgorithm) ||
+ !ChecksumsEqual(checksum.Checksum, sourceDocument.GetChecksum()))
+ {
+ // Import file exists, but checksums not equal.
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private static bool ChecksumsEqual(string checksum, byte[] bytes)
+ {
+ if (bytes.Length * 2 != checksum.Length)
+ {
+ return false;
+ }
+
+ for (var i = 0; i < bytes.Length; i++)
+ {
+ var text = bytes[i].ToString("x2");
+ if (checksum[i * 2] != text[0] || checksum[i * 2 + 1] != text[1])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/CompilationFailedException.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/CompilationFailedException.cs
new file mode 100644
index 0000000000..bb5dac8d2f
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/CompilationFailedException.cs
@@ -0,0 +1,35 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Microsoft.AspNetCore.Diagnostics;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class CompilationFailedException : Exception, ICompilationException
+ {
+ public CompilationFailedException(
+ IEnumerable compilationFailures)
+ : base(FormatMessage(compilationFailures))
+ {
+ if (compilationFailures == null)
+ {
+ throw new ArgumentNullException(nameof(compilationFailures));
+ }
+
+ CompilationFailures = compilationFailures;
+ }
+
+ public IEnumerable CompilationFailures { get; }
+
+ private static string FormatMessage(IEnumerable compilationFailures)
+ {
+ return Resources.CompilationFailed + Environment.NewLine +
+ string.Join(
+ Environment.NewLine,
+ compilationFailures.SelectMany(f => f.Messages).Select(message => message.FormattedMessage));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/CompilationFailedExceptionFactory.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/CompilationFailedExceptionFactory.cs
new file mode 100644
index 0000000000..86cfc0a223
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/CompilationFailedExceptionFactory.cs
@@ -0,0 +1,157 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Microsoft.AspNetCore.Diagnostics;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal static class CompilationFailedExceptionFactory
+ {
+ // error CS0234: The type or namespace name 'C' does not exist in the namespace 'N' (are you missing
+ // an assembly reference?)
+ private const string CS0234 = nameof(CS0234);
+ // error CS0246: The type or namespace name 'T' could not be found (are you missing a using directive
+ // or an assembly reference?)
+ private const string CS0246 = nameof(CS0246);
+
+ public static CompilationFailedException Create(
+ RazorCodeDocument codeDocument,
+ IEnumerable diagnostics)
+ {
+ // If a SourceLocation does not specify a file path, assume it is produced from parsing the current file.
+ var messageGroups = diagnostics.GroupBy(
+ razorError => razorError.Span.FilePath ?? codeDocument.Source.FilePath,
+ StringComparer.Ordinal);
+
+ var failures = new List();
+ foreach (var group in messageGroups)
+ {
+ var filePath = group.Key;
+ var fileContent = ReadContent(codeDocument, filePath);
+ var compilationFailure = new CompilationFailure(
+ filePath,
+ fileContent,
+ compiledContent: string.Empty,
+ messages: group.Select(parserError => CreateDiagnosticMessage(parserError, filePath)));
+ failures.Add(compilationFailure);
+ }
+
+ return new CompilationFailedException(failures);
+ }
+
+ public static CompilationFailedException Create(
+ RazorCodeDocument codeDocument,
+ string compilationContent,
+ string assemblyName,
+ IEnumerable diagnostics)
+ {
+ var diagnosticGroups = diagnostics
+ .Where(diagnostic => diagnostic.IsWarningAsError || diagnostic.Severity == DiagnosticSeverity.Error)
+ .GroupBy(diagnostic => GetFilePath(codeDocument, diagnostic), StringComparer.Ordinal);
+
+ var failures = new List();
+ foreach (var group in diagnosticGroups)
+ {
+ var sourceFilePath = group.Key;
+ string sourceFileContent;
+ if (string.Equals(assemblyName, sourceFilePath, StringComparison.Ordinal))
+ {
+ // The error is in the generated code and does not have a mapping line pragma
+ sourceFileContent = compilationContent;
+ sourceFilePath = Resources.GeneratedCodeFileName;
+ }
+ else
+ {
+ sourceFileContent = ReadContent(codeDocument, sourceFilePath);
+ }
+
+ string additionalMessage = null;
+ if (group.Any(g =>
+ string.Equals(CS0234, g.Id, StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(CS0246, g.Id, StringComparison.OrdinalIgnoreCase)))
+ {
+ additionalMessage = Resources.FormatCompilation_MissingReferences(
+ "CopyRefAssembliesToPublishDirectory");
+ }
+
+ var compilationFailure = new CompilationFailure(
+ sourceFilePath,
+ sourceFileContent,
+ compilationContent,
+ group.Select(GetDiagnosticMessage),
+ additionalMessage);
+
+ failures.Add(compilationFailure);
+ }
+
+ return new CompilationFailedException(failures);
+ }
+
+ private static string ReadContent(RazorCodeDocument codeDocument, string filePath)
+ {
+ RazorSourceDocument sourceDocument;
+ if (string.IsNullOrEmpty(filePath) || string.Equals(codeDocument.Source.FilePath, filePath, StringComparison.Ordinal))
+ {
+ sourceDocument = codeDocument.Source;
+ }
+ else
+ {
+ sourceDocument = codeDocument.Imports.FirstOrDefault(f => string.Equals(f.FilePath, filePath, StringComparison.Ordinal));
+ }
+
+ if (sourceDocument != null)
+ {
+ var contentChars = new char[sourceDocument.Length];
+ sourceDocument.CopyTo(0, contentChars, 0, sourceDocument.Length);
+ return new string(contentChars);
+ }
+
+ return string.Empty;
+ }
+
+ private static DiagnosticMessage GetDiagnosticMessage(Diagnostic diagnostic)
+ {
+ var mappedLineSpan = diagnostic.Location.GetMappedLineSpan();
+ return new DiagnosticMessage(
+ diagnostic.GetMessage(),
+ CSharpDiagnosticFormatter.Instance.Format(diagnostic),
+ mappedLineSpan.Path,
+ mappedLineSpan.StartLinePosition.Line + 1,
+ mappedLineSpan.StartLinePosition.Character + 1,
+ mappedLineSpan.EndLinePosition.Line + 1,
+ mappedLineSpan.EndLinePosition.Character + 1);
+ }
+
+ private static DiagnosticMessage CreateDiagnosticMessage(
+ RazorDiagnostic razorDiagnostic,
+ string filePath)
+ {
+ var sourceSpan = razorDiagnostic.Span;
+ var message = razorDiagnostic.GetMessage();
+ return new DiagnosticMessage(
+ message: message,
+ formattedMessage: razorDiagnostic.ToString(),
+ filePath: filePath,
+ startLine: sourceSpan.LineIndex + 1,
+ startColumn: sourceSpan.CharacterIndex,
+ endLine: sourceSpan.LineIndex + 1,
+ endColumn: sourceSpan.CharacterIndex + sourceSpan.Length);
+ }
+
+ private static string GetFilePath(RazorCodeDocument codeDocument, Diagnostic diagnostic)
+ {
+ if (diagnostic.Location == Location.None)
+ {
+ return codeDocument.Source.FilePath;
+ }
+
+ return diagnostic.Location.GetMappedLineSpan().Path;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/DependencyInjection/MvcRazorRuntimeCompilationOptionsSetup.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/DependencyInjection/MvcRazorRuntimeCompilationOptionsSetup.cs
new file mode 100644
index 0000000000..e18689ccb3
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/DependencyInjection/MvcRazorRuntimeCompilationOptionsSetup.cs
@@ -0,0 +1,29 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class MvcRazorRuntimeCompilationOptionsSetup : IConfigureOptions
+ {
+ private readonly IHostingEnvironment _hostingEnvironment;
+
+ public MvcRazorRuntimeCompilationOptionsSetup(IHostingEnvironment hostingEnvironment)
+ {
+ _hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
+ }
+
+ public void Configure(MvcRazorRuntimeCompilationOptions options)
+ {
+ if (options == null)
+ {
+ throw new ArgumentNullException(nameof(options));
+ }
+
+ options.FileProviders.Add(_hostingEnvironment.ContentRootFileProvider);
+ }
+ }
+}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/DependencyInjection/RazorRuntimeCompilationMvcBuilderExtensions.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/DependencyInjection/RazorRuntimeCompilationMvcBuilderExtensions.cs
new file mode 100644
index 0000000000..a673954e3d
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/DependencyInjection/RazorRuntimeCompilationMvcBuilderExtensions.cs
@@ -0,0 +1,50 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
+
+namespace Microsoft.Extensions.DependencyInjection
+{
+ public static class RazorRuntimeCompilationMvcBuilderExtensions
+ {
+ ///
+ /// Configures to support runtime compilation of Razor views and Razor Pages.
+ ///
+ /// The .
+ /// The .
+ public static IMvcBuilder AddRazorRuntimeCompilation(this IMvcBuilder builder)
+ {
+ if (builder == null)
+ {
+ throw new ArgumentNullException(nameof(builder));
+ }
+
+ RazorRuntimeCompilationMvcCoreBuilderExtensions.AddServices(builder.Services);
+ return builder;
+ }
+
+ ///
+ /// Configures to support runtime compilation of Razor views and Razor Pages.
+ ///
+ /// The .
+ /// An action to configure the .
+ /// The .
+ public static IMvcBuilder AddRazorRuntimeCompilation(this IMvcBuilder builder, Action setupAction)
+ {
+ if (builder == null)
+ {
+ throw new ArgumentNullException(nameof(builder));
+ }
+
+ if (setupAction == null)
+ {
+ throw new ArgumentNullException(nameof(setupAction));
+ }
+
+ RazorRuntimeCompilationMvcCoreBuilderExtensions.AddServices(builder.Services);
+ builder.Services.Configure(setupAction);
+ return builder;
+ }
+ }
+}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/DependencyInjection/RazorRuntimeCompilationMvcCoreBuilderExtensions.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/DependencyInjection/RazorRuntimeCompilationMvcCoreBuilderExtensions.cs
new file mode 100644
index 0000000000..bd42adb829
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/DependencyInjection/RazorRuntimeCompilationMvcCoreBuilderExtensions.cs
@@ -0,0 +1,113 @@
+// 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.ApplicationModels;
+using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.AspNetCore.Mvc.Razor.Compilation;
+using Microsoft.AspNetCore.Mvc.Razor.Extensions;
+using Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.CodeAnalysis.Razor;
+using Microsoft.Extensions.DependencyInjection.Extensions;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.Extensions.DependencyInjection
+{
+ public static class RazorRuntimeCompilationMvcCoreBuilderExtensions
+ {
+ ///
+ /// Configures to support runtime compilation of Razor views and Razor Pages.
+ ///
+ /// The .
+ /// The .
+ public static IMvcCoreBuilder AddRazorRuntimeCompilation(this IMvcCoreBuilder builder)
+ {
+ if (builder == null)
+ {
+ throw new ArgumentNullException(nameof(builder));
+ }
+
+ AddServices(builder.Services);
+ return builder;
+ }
+
+ ///
+ /// Configures to support runtime compilation of Razor views and Razor Pages.
+ ///
+ /// The .
+ /// An action to configure the .
+ /// The .
+ public static IMvcCoreBuilder AddRazorRuntimeCompilation(this IMvcCoreBuilder builder, Action setupAction)
+ {
+ if (builder == null)
+ {
+ throw new ArgumentNullException(nameof(builder));
+ }
+
+ if (setupAction == null)
+ {
+ throw new ArgumentNullException(nameof(setupAction));
+ }
+
+ AddServices(builder.Services);
+ builder.Services.Configure(setupAction);
+ return builder;
+ }
+
+ // Internal for testing.
+ internal static void AddServices(IServiceCollection services)
+ {
+ services.TryAddEnumerable(
+ ServiceDescriptor.Transient, MvcRazorRuntimeCompilationOptionsSetup>());
+
+ var compilerProvider = services.FirstOrDefault(f =>
+ f.ServiceType == typeof(IViewCompilerProvider) &&
+ f.ImplementationType?.Assembly == typeof(IViewCompilerProvider).Assembly &&
+ f.ImplementationType.FullName == "Microsoft.AspNetCore.Mvc.Razor.Compilation.DefaultViewCompilerProvider");
+
+ if (compilerProvider != null)
+ {
+ // Replace the default implementation of IViewCompilerProvider
+ services.Remove(compilerProvider);
+ }
+
+ services.TryAddSingleton();
+
+ services.TryAddSingleton();
+ services.TryAddSingleton();
+ services.TryAddSingleton();
+
+ services.TryAddSingleton();
+ services.TryAddSingleton(s =>
+ {
+ var fileSystem = s.GetRequiredService();
+ var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem, builder =>
+ {
+ RazorExtensions.Register(builder);
+
+ // Roslyn + TagHelpers infrastructure
+ var referenceManager = s.GetRequiredService();
+ builder.Features.Add(new LazyMetadataReferenceFeature(referenceManager));
+ builder.Features.Add(new CompilationTagHelperFeature());
+
+ // TagHelperDescriptorProviders (actually do tag helper discovery)
+ builder.Features.Add(new DefaultTagHelperDescriptorProvider());
+ builder.Features.Add(new ViewComponentTagHelperDescriptorProvider());
+ });
+
+ return projectEngine;
+ });
+
+ //
+ // Razor Pages
+ //
+ services.TryAddEnumerable(
+ ServiceDescriptor.Singleton());
+
+ services.TryAddEnumerable(
+ ServiceDescriptor.Singleton());
+ }
+ }
+}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/FileProviderRazorProjectFileSystem.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/FileProviderRazorProjectFileSystem.cs
new file mode 100644
index 0000000000..f15d523b21
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/FileProviderRazorProjectFileSystem.cs
@@ -0,0 +1,93 @@
+// 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.IO;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.Extensions.FileProviders;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class FileProviderRazorProjectFileSystem : RazorProjectFileSystem
+ {
+ private const string RazorFileExtension = ".cshtml";
+ private readonly RuntimeCompilationFileProvider _fileProvider;
+ private readonly IHostingEnvironment _hostingEnvironment;
+
+ public FileProviderRazorProjectFileSystem(RuntimeCompilationFileProvider fileProvider, IHostingEnvironment hostingEnvironment)
+ {
+ if (fileProvider == null)
+ {
+ throw new ArgumentNullException(nameof(fileProvider));
+ }
+
+ if (hostingEnvironment == null)
+ {
+ throw new ArgumentNullException(nameof(hostingEnvironment));
+ }
+
+ _fileProvider = fileProvider;
+ _hostingEnvironment = hostingEnvironment;
+ }
+
+ public IFileProvider FileProvider => _fileProvider.FileProvider;
+
+ public override RazorProjectItem GetItem(string path)
+ {
+ path = NormalizeAndEnsureValidPath(path);
+ var fileInfo = FileProvider.GetFileInfo(path);
+
+ return new FileProviderRazorProjectItem(fileInfo, basePath: string.Empty, filePath: path, root: _hostingEnvironment.ContentRootPath);
+ }
+
+ public override IEnumerable EnumerateItems(string path)
+ {
+ path = NormalizeAndEnsureValidPath(path);
+ return EnumerateFiles(FileProvider.GetDirectoryContents(path), path, prefix: string.Empty);
+ }
+
+ private IEnumerable EnumerateFiles(IDirectoryContents directory, string basePath, string prefix)
+ {
+ if (directory.Exists)
+ {
+ foreach (var fileInfo in directory)
+ {
+ if (fileInfo.IsDirectory)
+ {
+ var relativePath = prefix + "/" + fileInfo.Name;
+ var subDirectory = FileProvider.GetDirectoryContents(JoinPath(basePath, relativePath));
+ var children = EnumerateFiles(subDirectory, basePath, relativePath);
+ foreach (var child in children)
+ {
+ yield return child;
+ }
+ }
+ else if (string.Equals(RazorFileExtension, Path.GetExtension(fileInfo.Name), StringComparison.OrdinalIgnoreCase))
+ {
+ var filePath = prefix + "/" + fileInfo.Name;
+
+ yield return new FileProviderRazorProjectItem(fileInfo, basePath, filePath: filePath, root: _hostingEnvironment.ContentRootPath);
+ }
+ }
+ }
+ }
+
+ private static string JoinPath(string path1, string path2)
+ {
+ var hasTrailingSlash = path1.EndsWith("/", StringComparison.Ordinal);
+ var hasLeadingSlash = path2.StartsWith("/", StringComparison.Ordinal);
+ if (hasLeadingSlash && hasTrailingSlash)
+ {
+ return path1 + path2.Substring(1);
+ }
+ else if (hasLeadingSlash || hasTrailingSlash)
+ {
+ return path1 + path2;
+ }
+
+ return path1 + "/" + path2;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/FileProviderRazorProjectItem.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/FileProviderRazorProjectItem.cs
new file mode 100644
index 0000000000..f616dd4d06
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/FileProviderRazorProjectItem.cs
@@ -0,0 +1,65 @@
+// 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.IO;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.Extensions.FileProviders;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ public class FileProviderRazorProjectItem : RazorProjectItem
+ {
+ private string _root;
+ private string _relativePhysicalPath;
+ private bool _isRelativePhysicalPathSet;
+
+ public FileProviderRazorProjectItem(IFileInfo fileInfo, string basePath, string filePath, string root)
+ {
+ FileInfo = fileInfo;
+ BasePath = basePath;
+ FilePath = filePath;
+ _root = root;
+ }
+
+ public IFileInfo FileInfo { get; }
+
+ public override string BasePath { get; }
+
+ public override string FilePath { get; }
+
+ public override bool Exists => FileInfo.Exists;
+
+ public override string PhysicalPath => FileInfo.PhysicalPath;
+
+ public override string RelativePhysicalPath
+ {
+ get
+ {
+ if (!_isRelativePhysicalPathSet)
+ {
+ _isRelativePhysicalPathSet = true;
+
+ if (Exists)
+ {
+ if (_root != null &&
+ !string.IsNullOrEmpty(PhysicalPath) &&
+ PhysicalPath.StartsWith(_root, StringComparison.OrdinalIgnoreCase) &&
+ PhysicalPath.Length > _root.Length &&
+ (PhysicalPath[_root.Length] == Path.DirectorySeparatorChar || PhysicalPath[_root.Length] == Path.AltDirectorySeparatorChar))
+ {
+ _relativePhysicalPath = PhysicalPath.Substring(_root.Length + 1); // Include leading separator
+ }
+ }
+ }
+
+ return _relativePhysicalPath;
+ }
+ }
+
+ public override Stream Read()
+ {
+ return FileInfo.CreateReadStream();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/LazyMetadataReferenceFeature.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/LazyMetadataReferenceFeature.cs
new file mode 100644
index 0000000000..3f150a9a5d
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/LazyMetadataReferenceFeature.cs
@@ -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.Collections.Generic;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.Razor;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class LazyMetadataReferenceFeature : IMetadataReferenceFeature
+ {
+ private readonly RazorReferenceManager _referenceManager;
+
+ public LazyMetadataReferenceFeature(RazorReferenceManager referenceManager)
+ {
+ _referenceManager = referenceManager;
+ }
+
+ ///
+ /// Invoking ensures that compilation
+ /// references are lazily evaluated.
+ ///
+ public IReadOnlyList References => _referenceManager.CompilationReferences;
+
+ public RazorEngine Engine { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.csproj
new file mode 100644
index 0000000000..680bed7d5a
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.csproj
@@ -0,0 +1,23 @@
+
+
+
+ Runtime compilation support for Razor views and Razor Pages in ASP.NET Core MVC.
+ netcoreapp3.0
+ $(NoWarn);CS1591
+ true
+ aspnetcore;aspnetcoremvc;razor
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/MvcRazorRuntimeCompilationOptions.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/MvcRazorRuntimeCompilationOptions.cs
new file mode 100644
index 0000000000..237d9554ca
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/MvcRazorRuntimeCompilationOptions.cs
@@ -0,0 +1,31 @@
+// 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 Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc.ApplicationParts;
+using Microsoft.Extensions.FileProviders;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ public class MvcRazorRuntimeCompilationOptions
+ {
+ ///
+ /// Gets the instances used to locate Razor files.
+ ///
+ ///
+ /// At startup, this collection is initialized to include an instance of
+ /// that is rooted at the application root.
+ ///
+ public IList FileProviders { get; } = new List();
+
+ ///
+ /// Gets paths to additional references used during runtime compilation of Razor files.
+ ///
+ ///
+ /// By default, the runtime compiler to gather references
+ /// uses to compile a Razor file. This API allows providing additional references to the compiler.
+ ///
+ public IList AdditionalReferencePaths { get; } = new List();
+ }
+}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/PageActionDescriptorChangeProvider.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/PageActionDescriptorChangeProvider.cs
new file mode 100644
index 0000000000..b8224d7c97
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/PageActionDescriptorChangeProvider.cs
@@ -0,0 +1,98 @@
+// 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.Diagnostics;
+using System.Linq;
+using Microsoft.AspNetCore.Mvc.Infrastructure;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.Extensions.Options;
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class PageActionDescriptorChangeProvider : IActionDescriptorChangeProvider
+ {
+ private readonly RuntimeCompilationFileProvider _fileProvider;
+ private readonly string[] _searchPatterns;
+ private readonly string[] _additionalFilesToTrack;
+
+ public PageActionDescriptorChangeProvider(
+ RazorProjectEngine projectEngine,
+ RuntimeCompilationFileProvider fileProvider,
+ IOptions razorPagesOptions)
+ {
+ if (projectEngine == null)
+ {
+ throw new ArgumentNullException(nameof(projectEngine));
+ }
+
+ if (fileProvider == null)
+ {
+ throw new ArgumentNullException(nameof(fileProvider));
+ }
+
+ if (razorPagesOptions == null)
+ {
+ throw new ArgumentNullException(nameof(razorPagesOptions));
+ }
+
+ _fileProvider = fileProvider;
+
+ var rootDirectory = razorPagesOptions.Value.RootDirectory;
+ Debug.Assert(!string.IsNullOrEmpty(rootDirectory));
+ rootDirectory = rootDirectory.TrimEnd('/');
+
+ // Search pattern that matches all cshtml files under the Pages RootDirectory
+ var pagesRootSearchPattern = rootDirectory + "/**/*.cshtml";
+
+ // Search pattern that matches all cshtml files under the Pages AreaRootDirectory
+ var areaRootSearchPattern = "/Areas/**/*.cshtml";
+
+ _searchPatterns = new[]
+ {
+ pagesRootSearchPattern,
+ areaRootSearchPattern
+ };
+
+ // pagesRootSearchPattern will miss _ViewImports outside the RootDirectory despite these influencing
+ // compilation. e.g. when RootDirectory = /Dir1/Dir2, the search pattern will ignore changes to
+ // [/_ViewImports.cshtml, /Dir1/_ViewImports.cshtml]. We need to additionally account for these.
+ var importFeatures = projectEngine.ProjectFeatures.OfType().ToArray();
+ var fileAtPagesRoot = projectEngine.FileSystem.GetItem(rootDirectory + "/Index.cshtml");
+
+ _additionalFilesToTrack = GetImports(importFeatures, fileAtPagesRoot);
+ }
+
+ public IChangeToken GetChangeToken()
+ {
+ var fileProvider = _fileProvider.FileProvider;
+
+ var changeTokens = new IChangeToken[_additionalFilesToTrack.Length + _searchPatterns.Length];
+ for (var i = 0; i < _additionalFilesToTrack.Length; i++)
+ {
+ changeTokens[i] = fileProvider.Watch(_additionalFilesToTrack[i]);
+ }
+
+ for (var i = 0; i < _searchPatterns.Length; i++)
+ {
+ var wildcardChangeToken = fileProvider.Watch(_searchPatterns[i]);
+ changeTokens[_additionalFilesToTrack.Length + i] = wildcardChangeToken;
+ }
+
+ return new CompositeChangeToken(changeTokens);
+ }
+
+ private static string[] GetImports(
+ IImportProjectFeature[] importFeatures,
+ RazorProjectItem file)
+ {
+ return importFeatures
+ .SelectMany(f => f.GetImports(file))
+ .Where(f => f.FilePath != null)
+ .Select(f => f.FilePath)
+ .ToArray();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/PageDirectiveFeature.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/PageDirectiveFeature.cs
new file mode 100644
index 0000000000..e1d5f12c30
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/PageDirectiveFeature.cs
@@ -0,0 +1,110 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Microsoft.AspNetCore.Mvc.Razor.Extensions;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.AspNetCore.Razor.Language.Intermediate;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal static class PageDirectiveFeature
+ {
+ private static readonly RazorProjectEngine PageDirectiveEngine = RazorProjectEngine.Create(RazorConfiguration.Default, new EmptyRazorProjectFileSystem(), builder =>
+ {
+ for (var i = builder.Phases.Count - 1; i >= 0; i--)
+ {
+ var phase = builder.Phases[i];
+ builder.Phases.RemoveAt(i);
+ if (phase is IRazorDocumentClassifierPhase)
+ {
+ break;
+ }
+ }
+
+ RazorExtensions.Register(builder);
+ builder.Features.Add(new PageDirectiveParserOptionsFeature());
+ });
+
+ public static bool TryGetPageDirective(ILogger logger, RazorProjectItem projectItem, out string template)
+ {
+ if (projectItem == null)
+ {
+ throw new ArgumentNullException(nameof(projectItem));
+ }
+
+ var codeDocument = PageDirectiveEngine.Process(projectItem);
+
+ var documentIRNode = codeDocument.GetDocumentIntermediateNode();
+ if (PageDirective.TryGetPageDirective(documentIRNode, out var pageDirective))
+ {
+ if (pageDirective.DirectiveNode is MalformedDirectiveIntermediateNode malformedNode)
+ {
+ logger.MalformedPageDirective(projectItem.FilePath, malformedNode.Diagnostics);
+ }
+
+ template = pageDirective.RouteTemplate;
+ return true;
+ }
+
+ template = null;
+ return false;
+ }
+
+ private class PageDirectiveParserOptionsFeature : RazorEngineFeatureBase, IConfigureRazorParserOptionsFeature
+ {
+ public int Order { get; }
+
+ public void Configure(RazorParserOptionsBuilder options)
+ {
+ options.ParseLeadingDirectives = true;
+ }
+ }
+
+ private class EmptyRazorProjectFileSystem : RazorProjectFileSystem
+ {
+ public override IEnumerable EnumerateItems(string basePath)
+ {
+ return Enumerable.Empty();
+ }
+
+ public override IEnumerable FindHierarchicalItems(string basePath, string path, string fileName)
+ {
+ return Enumerable.Empty();
+ }
+
+ public override RazorProjectItem GetItem(string path)
+ {
+ return new NotFoundProjectItem(string.Empty, path);
+ }
+
+ private class NotFoundProjectItem : RazorProjectItem
+ {
+ public NotFoundProjectItem(string basePath, string path)
+ {
+ BasePath = basePath;
+ FilePath = path;
+ }
+
+ ///
+ public override string BasePath { get; }
+
+ ///
+ public override string FilePath { get; }
+
+ ///
+ public override bool Exists => false;
+
+ ///
+ public override string PhysicalPath => throw new NotSupportedException();
+
+ ///
+ public override Stream Read() => throw new NotSupportedException();
+ }
+ }
+ }
+}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Properties/AssemblyInfo.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..472b09032a
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Properties/AssemblyInfo.cs
@@ -0,0 +1,7 @@
+// 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.Runtime.CompilerServices;
+
+[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Properties/Resources.Designer.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Properties/Resources.Designer.cs
new file mode 100644
index 0000000000..ce4fec5608
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Properties/Resources.Designer.cs
@@ -0,0 +1,100 @@
+//
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ using System.Globalization;
+ using System.Reflection;
+ using System.Resources;
+
+ internal static class Resources
+ {
+ private static readonly ResourceManager _resourceManager
+ = new ResourceManager("Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Resources", typeof(Resources).GetTypeInfo().Assembly);
+
+ ///
+ /// One or more compilation failures occurred:
+ ///
+ internal static string CompilationFailed
+ {
+ get => GetString("CompilationFailed");
+ }
+
+ ///
+ /// One or more compilation failures occurred:
+ ///
+ internal static string FormatCompilationFailed()
+ => GetString("CompilationFailed");
+
+ ///
+ /// One or more compilation references may be missing. If you're seeing this in a published application, set '{0}' to true in your project file to ensure files in the refs directory are published.
+ ///
+ internal static string Compilation_MissingReferences
+ {
+ get => GetString("Compilation_MissingReferences");
+ }
+
+ ///
+ /// One or more compilation references may be missing. If you're seeing this in a published application, set '{0}' to true in your project file to ensure files in the refs directory are published.
+ ///
+ internal static string FormatCompilation_MissingReferences(object p0)
+ => string.Format(CultureInfo.CurrentCulture, GetString("Compilation_MissingReferences"), p0);
+
+ ///
+ /// '{0}.{1}' must not be empty. At least one '{2}' is required to locate a view for rendering.
+ ///
+ internal static string FileProvidersAreRequired
+ {
+ get => GetString("FileProvidersAreRequired");
+ }
+
+ ///
+ /// '{0}.{1}' must not be empty. At least one '{2}' is required to locate a view for rendering.
+ ///
+ internal static string FormatFileProvidersAreRequired(object p0, object p1, object p2)
+ => string.Format(CultureInfo.CurrentCulture, GetString("FileProvidersAreRequired"), p0, p1, p2);
+
+ ///
+ /// Generated Code
+ ///
+ internal static string GeneratedCodeFileName
+ {
+ get => GetString("GeneratedCodeFileName");
+ }
+
+ ///
+ /// Generated Code
+ ///
+ internal static string FormatGeneratedCodeFileName()
+ => GetString("GeneratedCodeFileName");
+
+ ///
+ /// The debug type specified in the dependency context could be parsed. The debug type value '{0}' is not supported.
+ ///
+ internal static string UnsupportedDebugInformationFormat
+ {
+ get => GetString("UnsupportedDebugInformationFormat");
+ }
+
+ ///
+ /// The debug type specified in the dependency context could be parsed. The debug type value '{0}' is not supported.
+ ///
+ internal static string FormatUnsupportedDebugInformationFormat(object p0)
+ => string.Format(CultureInfo.CurrentCulture, GetString("UnsupportedDebugInformationFormat"), p0);
+
+ private static string GetString(string name, params string[] formatterNames)
+ {
+ var value = _resourceManager.GetString(name);
+
+ System.Diagnostics.Debug.Assert(value != null);
+
+ if (formatterNames != null)
+ {
+ for (var i = 0; i < formatterNames.Length; i++)
+ {
+ value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}");
+ }
+ }
+
+ return value;
+ }
+ }
+}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RazorProjectPageRouteModelProvider.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RazorProjectPageRouteModelProvider.cs
new file mode 100644
index 0000000000..a3b63ed6a8
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RazorProjectPageRouteModelProvider.cs
@@ -0,0 +1,107 @@
+// 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.ApplicationModels;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class RazorProjectPageRouteModelProvider : IPageRouteModelProvider
+ {
+ private const string AreaRootDirectory = "/Areas";
+ private readonly RazorProjectFileSystem _razorFileSystem;
+ private readonly RazorPagesOptions _pagesOptions;
+ private readonly PageRouteModelFactory _routeModelFactory;
+ private readonly ILogger _logger;
+
+ public RazorProjectPageRouteModelProvider(
+ RazorProjectFileSystem razorFileSystem,
+ IOptions pagesOptionsAccessor,
+ ILoggerFactory loggerFactory)
+ {
+ _razorFileSystem = razorFileSystem;
+ _pagesOptions = pagesOptionsAccessor.Value;
+ _logger = loggerFactory.CreateLogger();
+ _routeModelFactory = new PageRouteModelFactory(_pagesOptions, _logger);
+ }
+
+ ///
+ /// Ordered to execute after .
+ ///
+ public int Order => -1000 + 10;
+
+ public void OnProvidersExecuted(PageRouteModelProviderContext context)
+ {
+ }
+
+ public void OnProvidersExecuting(PageRouteModelProviderContext context)
+ {
+ // When RootDirectory and AreaRootDirectory overlap, e.g. RootDirectory = /, AreaRootDirectory = /Areas;
+ // we need to ensure that the page is only route-able via the area route. By adding area routes first,
+ // we'll ensure non area routes get skipped when it encounters an IsAlreadyRegistered check.
+
+ AddAreaPageModels(context);
+ AddPageModels(context);
+ }
+
+ private void AddPageModels(PageRouteModelProviderContext context)
+ {
+ foreach (var item in _razorFileSystem.EnumerateItems(_pagesOptions.RootDirectory))
+ {
+ var relativePath = item.CombinedPath;
+ if (context.RouteModels.Any(m => string.Equals(relativePath, m.RelativePath, StringComparison.OrdinalIgnoreCase)))
+ {
+ // A route for this file was already registered either by the CompiledPageRouteModel or as an area route.
+ // by this provider. Skip registering an additional entry.
+
+ // Note: We're comparing duplicates based on root-relative paths. This eliminates a page from being discovered
+ // by overlapping area and non-area routes where ViewEnginePath would be different.
+ continue;
+ }
+
+ if (!PageDirectiveFeature.TryGetPageDirective(_logger, item, out var routeTemplate))
+ {
+ // .cshtml pages without @page are not RazorPages.
+ continue;
+ }
+
+ var routeModel = _routeModelFactory.CreateRouteModel(relativePath, routeTemplate);
+ if (routeModel != null)
+ {
+ context.RouteModels.Add(routeModel);
+ }
+ }
+ }
+
+ private void AddAreaPageModels(PageRouteModelProviderContext context)
+ {
+ foreach (var item in _razorFileSystem.EnumerateItems(AreaRootDirectory))
+ {
+ var relativePath = item.CombinedPath;
+ if (context.RouteModels.Any(m => string.Equals(relativePath, m.RelativePath, StringComparison.OrdinalIgnoreCase)))
+ {
+ // A route for this file was already registered either by the CompiledPageRouteModel.
+ // Skip registering an additional entry.
+ continue;
+ }
+
+ if (!PageDirectiveFeature.TryGetPageDirective(_logger, item, out var routeTemplate))
+ {
+ // .cshtml pages without @page are not RazorPages.
+ continue;
+ }
+
+ var routeModel = _routeModelFactory.CreateAreaRouteModel(relativePath, routeTemplate);
+ if (routeModel != null)
+ {
+ context.RouteModels.Add(routeModel);
+ }
+ }
+ }
+ }
+}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RazorReferenceManager.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RazorReferenceManager.cs
new file mode 100644
index 0000000000..ce0094a911
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RazorReferenceManager.cs
@@ -0,0 +1,79 @@
+// 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.IO;
+using System.Linq;
+using System.Reflection.PortableExecutable;
+using System.Threading;
+using Microsoft.AspNetCore.Mvc.ApplicationParts;
+using Microsoft.CodeAnalysis;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class RazorReferenceManager
+ {
+ private readonly ApplicationPartManager _partManager;
+ private readonly MvcRazorRuntimeCompilationOptions _options;
+ private object _compilationReferencesLock = new object();
+ private bool _compilationReferencesInitialized;
+ private IReadOnlyList _compilationReferences;
+
+ public RazorReferenceManager(
+ ApplicationPartManager partManager,
+ IOptions options)
+ {
+ _partManager = partManager;
+ _options = options.Value;
+ }
+
+ public virtual IReadOnlyList CompilationReferences
+ {
+ get
+ {
+ return LazyInitializer.EnsureInitialized(
+ ref _compilationReferences,
+ ref _compilationReferencesInitialized,
+ ref _compilationReferencesLock,
+ GetCompilationReferences);
+ }
+ }
+
+ private IReadOnlyList GetCompilationReferences()
+ {
+ var referencePaths = GetReferencePaths();
+
+ return referencePaths
+ .Select(CreateMetadataReference)
+ .ToList();
+ }
+
+ // For unit testing
+ internal IEnumerable GetReferencePaths()
+ {
+ var referencesFromApplicationParts = _partManager
+ .ApplicationParts
+ .OfType()
+ .SelectMany(part => part.GetReferencePaths());
+
+ var referencePaths = referencesFromApplicationParts
+ .Concat(_options.AdditionalReferencePaths)
+ .Distinct(StringComparer.OrdinalIgnoreCase);
+
+ return referencePaths;
+ }
+
+ private static MetadataReference CreateMetadataReference(string path)
+ {
+ using (var stream = File.OpenRead(path))
+ {
+ var moduleMetadata = ModuleMetadata.CreateFromStream(stream, PEStreamOptions.PrefetchMetadata);
+ var assemblyMetadata = AssemblyMetadata.Create(moduleMetadata);
+
+ return assemblyMetadata.GetReference(filePath: path);
+ }
+ }
+ }
+}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RazorRuntimeCompilationLoggerExtensions.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RazorRuntimeCompilationLoggerExtensions.cs
new file mode 100644
index 0000000000..51ae2dc03d
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RazorRuntimeCompilationLoggerExtensions.cs
@@ -0,0 +1,179 @@
+// 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 Microsoft.AspNetCore.Razor.Language;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal static class MvcRazorLoggerExtensions
+ {
+ private static readonly double TimestampToTicks = TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency;
+
+ private static readonly Action _generatedCodeToAssemblyCompilationStart;
+ private static readonly Action _generatedCodeToAssemblyCompilationEnd;
+ private static readonly Action _malformedPageDirective;
+ private static readonly Action _viewCompilerLocatedCompiledView;
+ private static readonly Action _viewCompilerNoCompiledViewsFound;
+ private static readonly Action _viewCompilerLocatedCompiledViewForPath;
+ private static readonly Action _viewCompilerRecompilingCompiledView;
+ private static readonly Action _viewCompilerCouldNotFindFileToCompileForPath;
+ private static readonly Action _viewCompilerFoundFileToCompileForPath;
+ private static readonly Action _viewCompilerInvalidatingCompiledFile;
+
+ private static readonly Action _viewLookupCacheMiss;
+ private static readonly Action _viewLookupCacheHit;
+ private static readonly Action _precompiledViewFound;
+
+ static MvcRazorLoggerExtensions()
+ {
+ _viewCompilerLocatedCompiledView = LoggerMessage.Define(
+ LogLevel.Debug,
+ 3,
+ "Initializing Razor view compiler with compiled view: '{ViewName}'.");
+
+ _viewCompilerNoCompiledViewsFound = LoggerMessage.Define(
+ LogLevel.Debug,
+ 4,
+ "Initializing Razor view compiler with no compiled views.");
+
+ _viewCompilerLocatedCompiledViewForPath = LoggerMessage.Define(
+ LogLevel.Trace,
+ 5,
+ "Located compiled view for view at path '{Path}'.");
+
+ _viewCompilerLocatedCompiledViewForPath = LoggerMessage.Define(
+ LogLevel.Trace,
+ 5,
+ "Located compiled view for view at path '{Path}'.");
+
+ _viewCompilerRecompilingCompiledView = LoggerMessage.Define(
+ LogLevel.Trace,
+ 6,
+ "Invalidating compiled view for view at path '{Path}'.");
+
+ _viewCompilerCouldNotFindFileToCompileForPath = LoggerMessage.Define(
+ LogLevel.Trace,
+ 7,
+ "Could not find a file for view at path '{Path}'.");
+
+ _viewCompilerFoundFileToCompileForPath = LoggerMessage.Define(
+ LogLevel.Trace,
+ 8,
+ "Found file at path '{Path}'.");
+
+ _viewCompilerInvalidatingCompiledFile = LoggerMessage.Define(
+ LogLevel.Trace,
+ 9,
+ "Invalidating compiled view at path '{Path}' with a file since the checksum did not match.");
+
+ _viewLookupCacheMiss = LoggerMessage.Define(
+ LogLevel.Debug,
+ 1,
+ "View lookup cache miss for view '{ViewName}' in controller '{ControllerName}'.");
+
+ _viewLookupCacheHit = LoggerMessage.Define(
+ LogLevel.Debug,
+ 2,
+ "View lookup cache hit for view '{ViewName}' in controller '{ControllerName}'.");
+
+ _precompiledViewFound = LoggerMessage.Define(
+ LogLevel.Debug,
+ 3,
+ "Using precompiled view for '{RelativePath}'.");
+
+ _generatedCodeToAssemblyCompilationStart = LoggerMessage.Define(
+ LogLevel.Debug,
+ 1,
+ "Compilation of the generated code for the Razor file at '{FilePath}' started.");
+
+ _generatedCodeToAssemblyCompilationEnd = LoggerMessage.Define(
+ LogLevel.Debug,
+ 2,
+ "Compilation of the generated code for the Razor file at '{FilePath}' completed in {ElapsedMilliseconds}ms.");
+
+ _malformedPageDirective = LoggerMessage.Define(
+ LogLevel.Warning,
+ new EventId(104, "MalformedPageDirective"),
+ "The page directive at '{FilePath}' is malformed. Please fix the following issues: {Diagnostics}");
+ }
+
+ public static void ViewCompilerLocatedCompiledView(this ILogger logger, string view)
+ {
+ _viewCompilerLocatedCompiledView(logger, view, null);
+ }
+
+ public static void ViewCompilerNoCompiledViewsFound(this ILogger logger)
+ {
+ _viewCompilerNoCompiledViewsFound(logger, null);
+ }
+
+ public static void ViewCompilerLocatedCompiledViewForPath(this ILogger logger, string path)
+ {
+ _viewCompilerLocatedCompiledViewForPath(logger, path, null);
+ }
+
+ public static void ViewCompilerCouldNotFindFileAtPath(this ILogger logger, string path)
+ {
+ _viewCompilerCouldNotFindFileToCompileForPath(logger, path, null);
+ }
+
+ public static void ViewCompilerFoundFileToCompile(this ILogger logger, string path)
+ {
+ _viewCompilerFoundFileToCompileForPath(logger, path, null);
+ }
+
+ public static void ViewCompilerInvalidingCompiledFile(this ILogger logger, string path)
+ {
+ _viewCompilerInvalidatingCompiledFile(logger, path, null);
+ }
+
+ public static void ViewLookupCacheMiss(this ILogger logger, string viewName, string controllerName)
+ {
+ _viewLookupCacheMiss(logger, viewName, controllerName, null);
+ }
+
+ public static void ViewLookupCacheHit(this ILogger logger, string viewName, string controllerName)
+ {
+ _viewLookupCacheHit(logger, viewName, controllerName, null);
+ }
+
+ public static void PrecompiledViewFound(this ILogger logger, string relativePath)
+ {
+ _precompiledViewFound(logger, relativePath, null);
+ }
+
+ public static void GeneratedCodeToAssemblyCompilationStart(this ILogger logger, string filePath)
+ {
+ _generatedCodeToAssemblyCompilationStart(logger, filePath, null);
+ }
+
+ public static void GeneratedCodeToAssemblyCompilationEnd(this ILogger logger, string filePath, long startTimestamp)
+ {
+ // Don't log if logging wasn't enabled at start of request as time will be wildly wrong.
+ if (startTimestamp != 0)
+ {
+ var currentTimestamp = Stopwatch.GetTimestamp();
+ var elapsed = new TimeSpan((long)(TimestampToTicks * (currentTimestamp - startTimestamp)));
+ _generatedCodeToAssemblyCompilationEnd(logger, filePath, elapsed.TotalMilliseconds, null);
+ }
+ }
+
+ public static void MalformedPageDirective(this ILogger logger, string filePath, IList diagnostics)
+ {
+ if (logger.IsEnabled(LogLevel.Warning))
+ {
+ var messages = new string[diagnostics.Count];
+ for (var i = 0; i < diagnostics.Count; i++)
+ {
+ messages[i] = diagnostics[i].GetMessage();
+ }
+
+ _malformedPageDirective(logger, filePath, messages, null);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Resources.resx b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Resources.resx
new file mode 100644
index 0000000000..48eb29a54d
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/Resources.resx
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ One or more compilation failures occurred:
+
+
+ One or more compilation references may be missing. If you're seeing this in a published application, set '{0}' to true in your project file to ensure files in the refs directory are published.
+
+
+ '{0}.{1}' must not be empty. At least one '{2}' is required to locate a view for rendering.
+
+
+ Generated Code
+
+
+ The debug type specified in the dependency context could be parsed. The debug type value '{0}' is not supported.
+
+
\ No newline at end of file
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RuntimeCompilationFileProvider.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RuntimeCompilationFileProvider.cs
new file mode 100644
index 0000000000..ea7372bd1a
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RuntimeCompilationFileProvider.cs
@@ -0,0 +1,57 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.Extensions.FileProviders;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class RuntimeCompilationFileProvider
+ {
+ private readonly MvcRazorRuntimeCompilationOptions _options;
+ private IFileProvider _compositeFileProvider;
+
+ public RuntimeCompilationFileProvider(IOptions options)
+ {
+ if (options == null)
+ {
+ throw new ArgumentNullException(nameof(options));
+ }
+
+ _options = options.Value;
+ }
+
+ public IFileProvider FileProvider
+ {
+ get
+ {
+ if (_compositeFileProvider == null)
+ {
+ _compositeFileProvider = GetCompositeFileProvider(_options);
+ }
+
+ return _compositeFileProvider;
+ }
+ }
+
+ private static IFileProvider GetCompositeFileProvider(MvcRazorRuntimeCompilationOptions options)
+ {
+ var fileProviders = options.FileProviders;
+ if (fileProviders.Count == 0)
+ {
+ var message = Resources.FormatFileProvidersAreRequired(
+ typeof(MvcRazorRuntimeCompilationOptions).FullName,
+ nameof(MvcRazorRuntimeCompilationOptions.FileProviders),
+ typeof(IFileProvider).FullName);
+ throw new InvalidOperationException(message);
+ }
+ else if (fileProviders.Count == 1)
+ {
+ return fileProviders[0];
+ }
+
+ return new CompositeFileProvider(fileProviders);
+ }
+ }
+}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RuntimeViewCompiler.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RuntimeViewCompiler.cs
new file mode 100644
index 0000000000..4f417df6eb
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RuntimeViewCompiler.cs
@@ -0,0 +1,434 @@
+// 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.Concurrent;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc.Razor.Compilation;
+using Microsoft.AspNetCore.Razor.Hosting;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.Emit;
+using Microsoft.CodeAnalysis.Text;
+using Microsoft.Extensions.Caching.Memory;
+using Microsoft.Extensions.FileProviders;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class RuntimeViewCompiler : IViewCompiler
+ {
+ private readonly object _cacheLock = new object();
+ private readonly Dictionary _precompiledViews;
+ private readonly ConcurrentDictionary _normalizedPathCache;
+ private readonly IFileProvider _fileProvider;
+ private readonly RazorProjectEngine _projectEngine;
+ private readonly IMemoryCache _cache;
+ private readonly ILogger _logger;
+ private readonly CSharpCompiler _csharpCompiler;
+
+ public RuntimeViewCompiler(
+ IFileProvider fileProvider,
+ RazorProjectEngine projectEngine,
+ CSharpCompiler csharpCompiler,
+ IList precompiledViews,
+ ILogger logger)
+ {
+ if (fileProvider == null)
+ {
+ throw new ArgumentNullException(nameof(fileProvider));
+ }
+
+ if (projectEngine == null)
+ {
+ throw new ArgumentNullException(nameof(projectEngine));
+ }
+
+ if (csharpCompiler == null)
+ {
+ throw new ArgumentNullException(nameof(csharpCompiler));
+ }
+
+ if (precompiledViews == null)
+ {
+ throw new ArgumentNullException(nameof(precompiledViews));
+ }
+
+ if (logger == null)
+ {
+ throw new ArgumentNullException(nameof(logger));
+ }
+
+ _fileProvider = fileProvider;
+ _projectEngine = projectEngine;
+ _csharpCompiler = csharpCompiler;
+ _logger = logger;
+
+
+ _normalizedPathCache = new ConcurrentDictionary(StringComparer.Ordinal);
+
+ // This is our L0 cache, and is a durable store. Views migrate into the cache as they are requested
+ // from either the set of known precompiled views, or by being compiled.
+ _cache = new MemoryCache(new MemoryCacheOptions());
+
+ // We need to validate that the all of the precompiled views are unique by path (case-insensitive).
+ // We do this because there's no good way to canonicalize paths on windows, and it will create
+ // problems when deploying to linux. Rather than deal with these issues, we just don't support
+ // views that differ only by case.
+ _precompiledViews = new Dictionary(
+ precompiledViews.Count,
+ StringComparer.OrdinalIgnoreCase);
+
+ foreach (var precompiledView in precompiledViews)
+ {
+ logger.ViewCompilerLocatedCompiledView(precompiledView.RelativePath);
+
+ if (!_precompiledViews.ContainsKey(precompiledView.RelativePath))
+ {
+ // View ordering has precedence semantics, a view with a higher precedence was
+ // already added to the list.
+ _precompiledViews.Add(precompiledView.RelativePath, precompiledView);
+ }
+ }
+
+ if (_precompiledViews.Count == 0)
+ {
+ logger.ViewCompilerNoCompiledViewsFound();
+ }
+ }
+
+ public Task CompileAsync(string relativePath)
+ {
+ if (relativePath == null)
+ {
+ throw new ArgumentNullException(nameof(relativePath));
+ }
+
+ // Attempt to lookup the cache entry using the passed in path. This will succeed if the path is already
+ // normalized and a cache entry exists.
+ if (_cache.TryGetValue(relativePath, out Task cachedResult))
+ {
+ return cachedResult;
+ }
+
+ var normalizedPath = GetNormalizedPath(relativePath);
+ if (_cache.TryGetValue(normalizedPath, out cachedResult))
+ {
+ return cachedResult;
+ }
+
+ // Entry does not exist. Attempt to create one.
+ cachedResult = OnCacheMiss(normalizedPath);
+ return cachedResult;
+ }
+
+ private Task OnCacheMiss(string normalizedPath)
+ {
+ ViewCompilerWorkItem item;
+ TaskCompletionSource taskSource;
+ MemoryCacheEntryOptions cacheEntryOptions;
+
+ // Safe races cannot be allowed when compiling Razor pages. To ensure only one compilation request succeeds
+ // per file, we'll lock the creation of a cache entry. Creating the cache entry should be very quick. The
+ // actual work for compiling files happens outside the critical section.
+ lock (_cacheLock)
+ {
+ // Double-checked locking to handle a possible race.
+ if (_cache.TryGetValue(normalizedPath, out Task result))
+ {
+ return result;
+ }
+
+ if (_precompiledViews.TryGetValue(normalizedPath, out var precompiledView))
+ {
+ _logger.ViewCompilerLocatedCompiledViewForPath(normalizedPath);
+ item = CreatePrecompiledWorkItem(normalizedPath, precompiledView);
+ }
+ else
+ {
+ item = CreateRuntimeCompilationWorkItem(normalizedPath);
+ }
+
+ // At this point, we've decided what to do - but we should create the cache entry and
+ // release the lock first.
+ cacheEntryOptions = new MemoryCacheEntryOptions();
+
+ Debug.Assert(item.ExpirationTokens != null);
+ for (var i = 0; i < item.ExpirationTokens.Count; i++)
+ {
+ cacheEntryOptions.ExpirationTokens.Add(item.ExpirationTokens[i]);
+ }
+
+ taskSource = new TaskCompletionSource(creationOptions: TaskCreationOptions.RunContinuationsAsynchronously);
+ if (item.SupportsCompilation)
+ {
+ // We'll compile in just a sec, be patient.
+ }
+ else
+ {
+ // If we can't compile, we should have already created the descriptor
+ Debug.Assert(item.Descriptor != null);
+ taskSource.SetResult(item.Descriptor);
+ }
+
+ _cache.Set(normalizedPath, taskSource.Task, cacheEntryOptions);
+ }
+
+ // Now the lock has been released so we can do more expensive processing.
+ if (item.SupportsCompilation)
+ {
+ Debug.Assert(taskSource != null);
+
+ if (item.Descriptor?.Item != null &&
+ ChecksumValidator.IsItemValid(_projectEngine.FileSystem, item.Descriptor.Item))
+ {
+ // If the item has checksums to validate, we should also have a precompiled view.
+ Debug.Assert(item.Descriptor != null);
+
+ taskSource.SetResult(item.Descriptor);
+ return taskSource.Task;
+ }
+
+ _logger.ViewCompilerInvalidingCompiledFile(item.NormalizedPath);
+ try
+ {
+ var descriptor = CompileAndEmit(normalizedPath);
+ descriptor.ExpirationTokens = cacheEntryOptions.ExpirationTokens;
+ taskSource.SetResult(descriptor);
+ }
+ catch (Exception ex)
+ {
+ taskSource.SetException(ex);
+ }
+ }
+
+ return taskSource.Task;
+ }
+
+ private ViewCompilerWorkItem CreatePrecompiledWorkItem(string normalizedPath, CompiledViewDescriptor precompiledView)
+ {
+ // We have a precompiled view - but we're not sure that we can use it yet.
+ //
+ // We need to determine first if we have enough information to 'recompile' this view. If that's the case
+ // we'll create change tokens for all of the files.
+ //
+ // Then we'll attempt to validate if any of those files have different content than the original sources
+ // based on checksums.
+ if (precompiledView.Item == null || !ChecksumValidator.IsRecompilationSupported(precompiledView.Item))
+ {
+ return new ViewCompilerWorkItem()
+ {
+ // If we don't have a checksum for the primary source file we can't recompile.
+ SupportsCompilation = false,
+
+ ExpirationTokens = Array.Empty(), // Never expire because we can't recompile.
+ Descriptor = precompiledView, // This will be used as-is.
+ };
+ }
+
+ var item = new ViewCompilerWorkItem()
+ {
+ SupportsCompilation = true,
+
+ Descriptor = precompiledView, // This might be used, if the checksums match.
+
+ // Used to validate and recompile
+ NormalizedPath = normalizedPath,
+
+ ExpirationTokens = GetExpirationTokens(precompiledView),
+ };
+
+ // We also need to create a new descriptor, because the original one doesn't have expiration tokens on
+ // it. These will be used by the view location cache, which is like an L1 cache for views (this class is
+ // the L2 cache).
+ item.Descriptor = new CompiledViewDescriptor()
+ {
+ ExpirationTokens = item.ExpirationTokens,
+ Item = precompiledView.Item,
+ RelativePath = precompiledView.RelativePath,
+ };
+
+ return item;
+ }
+
+ private ViewCompilerWorkItem CreateRuntimeCompilationWorkItem(string normalizedPath)
+ {
+ IList expirationTokens = new List
+ {
+ _fileProvider.Watch(normalizedPath),
+ };
+
+ var projectItem = _projectEngine.FileSystem.GetItem(normalizedPath);
+ if (!projectItem.Exists)
+ {
+ _logger.ViewCompilerCouldNotFindFileAtPath(normalizedPath);
+
+ // If the file doesn't exist, we can't do compilation right now - we still want to cache
+ // the fact that we tried. This will allow us to re-trigger compilation if the view file
+ // is added.
+ return new ViewCompilerWorkItem()
+ {
+ // We don't have enough information to compile
+ SupportsCompilation = false,
+
+ Descriptor = new CompiledViewDescriptor()
+ {
+ RelativePath = normalizedPath,
+ ExpirationTokens = expirationTokens,
+ },
+
+ // We can try again if the file gets created.
+ ExpirationTokens = expirationTokens,
+ };
+ }
+
+ _logger.ViewCompilerFoundFileToCompile(normalizedPath);
+
+ GetChangeTokensFromImports(expirationTokens, projectItem);
+
+ return new ViewCompilerWorkItem()
+ {
+ SupportsCompilation = true,
+
+ NormalizedPath = normalizedPath,
+ ExpirationTokens = expirationTokens,
+ };
+ }
+
+ private IList GetExpirationTokens(CompiledViewDescriptor precompiledView)
+ {
+ var checksums = precompiledView.Item.GetChecksumMetadata();
+ var expirationTokens = new List(checksums.Count);
+
+ for (var i = 0; i < checksums.Count; i++)
+ {
+ // We rely on Razor to provide the right set of checksums. Trust the compiler, it has to do a good job,
+ // so it probably will.
+ expirationTokens.Add(_fileProvider.Watch(checksums[i].Identifier));
+ }
+
+ return expirationTokens;
+ }
+
+ private void GetChangeTokensFromImports(IList expirationTokens, RazorProjectItem projectItem)
+ {
+ // OK this means we can do compilation. For now let's just identify the other files we need to watch
+ // so we can create the cache entry. Compilation will happen after we release the lock.
+ var importFeature = _projectEngine.ProjectFeatures.OfType().ToArray();
+ foreach (var feature in importFeature)
+ {
+ foreach (var file in feature.GetImports(projectItem))
+ {
+ if (file.FilePath != null)
+ {
+ expirationTokens.Add(_fileProvider.Watch(file.FilePath));
+ }
+ }
+ }
+ }
+
+ protected virtual CompiledViewDescriptor CompileAndEmit(string relativePath)
+ {
+ var projectItem = _projectEngine.FileSystem.GetItem(relativePath);
+ var codeDocument = _projectEngine.Process(projectItem);
+ var cSharpDocument = codeDocument.GetCSharpDocument();
+
+ if (cSharpDocument.Diagnostics.Count > 0)
+ {
+ throw CompilationFailedExceptionFactory.Create(
+ codeDocument,
+ cSharpDocument.Diagnostics);
+ }
+
+ var assembly = CompileAndEmit(codeDocument, cSharpDocument.GeneratedCode);
+
+ // Anything we compile from source will use Razor 2.1 and so should have the new metadata.
+ var loader = new RazorCompiledItemLoader();
+ var item = loader.LoadItems(assembly).SingleOrDefault();
+ return new CompiledViewDescriptor(item);
+ }
+
+ internal Assembly CompileAndEmit(RazorCodeDocument codeDocument, string generatedCode)
+ {
+ _logger.GeneratedCodeToAssemblyCompilationStart(codeDocument.Source.FilePath);
+
+ var startTimestamp = _logger.IsEnabled(LogLevel.Debug) ? Stopwatch.GetTimestamp() : 0;
+
+ var assemblyName = Path.GetRandomFileName();
+ var compilation = CreateCompilation(generatedCode, assemblyName);
+
+ var emitOptions = _csharpCompiler.EmitOptions;
+ var emitPdbFile = _csharpCompiler.EmitPdb && emitOptions.DebugInformationFormat != DebugInformationFormat.Embedded;
+
+ using (var assemblyStream = new MemoryStream())
+ using (var pdbStream = emitPdbFile ? new MemoryStream() : null)
+ {
+ var result = compilation.Emit(
+ assemblyStream,
+ pdbStream,
+ options: emitOptions);
+
+ if (!result.Success)
+ {
+ throw CompilationFailedExceptionFactory.Create(
+ codeDocument,
+ generatedCode,
+ assemblyName,
+ result.Diagnostics);
+ }
+
+ assemblyStream.Seek(0, SeekOrigin.Begin);
+ pdbStream?.Seek(0, SeekOrigin.Begin);
+
+ var assembly = Assembly.Load(assemblyStream.ToArray(), pdbStream?.ToArray());
+ _logger.GeneratedCodeToAssemblyCompilationEnd(codeDocument.Source.FilePath, startTimestamp);
+
+ return assembly;
+ }
+ }
+
+ private CSharpCompilation CreateCompilation(string compilationContent, string assemblyName)
+ {
+ var sourceText = SourceText.From(compilationContent, Encoding.UTF8);
+ var syntaxTree = _csharpCompiler.CreateSyntaxTree(sourceText).WithFilePath(assemblyName);
+ return _csharpCompiler
+ .CreateCompilation(assemblyName)
+ .AddSyntaxTrees(syntaxTree);
+ }
+
+ private string GetNormalizedPath(string relativePath)
+ {
+ Debug.Assert(relativePath != null);
+ if (relativePath.Length == 0)
+ {
+ return relativePath;
+ }
+
+ if (!_normalizedPathCache.TryGetValue(relativePath, out var normalizedPath))
+ {
+ normalizedPath = ViewPath.NormalizePath(relativePath);
+ _normalizedPathCache[relativePath] = normalizedPath;
+ }
+
+ return normalizedPath;
+ }
+
+ private class ViewCompilerWorkItem
+ {
+ public bool SupportsCompilation { get; set; }
+
+ public string NormalizedPath { get; set; }
+
+ public IList ExpirationTokens { get; set; }
+
+ public CompiledViewDescriptor Descriptor { get; set; }
+ }
+ }
+}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RuntimeViewCompilerProvider.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RuntimeViewCompilerProvider.cs
new file mode 100644
index 0000000000..4202da6bd7
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation/RuntimeViewCompilerProvider.cs
@@ -0,0 +1,64 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Threading;
+using Microsoft.AspNetCore.Mvc.ApplicationParts;
+using Microsoft.AspNetCore.Mvc.Razor.Compilation;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class RuntimeViewCompilerProvider : IViewCompilerProvider
+ {
+ private readonly RazorProjectEngine _razorProjectEngine;
+ private readonly ApplicationPartManager _applicationPartManager;
+ private readonly CSharpCompiler _csharpCompiler;
+ private readonly RuntimeCompilationFileProvider _fileProvider;
+ private readonly ILogger _logger;
+ private readonly Func _createCompiler;
+
+ private object _initializeLock = new object();
+ private bool _initialized;
+ private IViewCompiler _compiler;
+
+ public RuntimeViewCompilerProvider(
+ ApplicationPartManager applicationPartManager,
+ RazorProjectEngine razorProjectEngine,
+ RuntimeCompilationFileProvider fileProvider,
+ CSharpCompiler csharpCompiler,
+ ILoggerFactory loggerFactory)
+ {
+ _applicationPartManager = applicationPartManager;
+ _razorProjectEngine = razorProjectEngine;
+ _csharpCompiler = csharpCompiler;
+ _fileProvider = fileProvider;
+
+ _logger = loggerFactory.CreateLogger();
+ _createCompiler = CreateCompiler;
+ }
+
+ public IViewCompiler GetCompiler()
+ {
+ return LazyInitializer.EnsureInitialized(
+ ref _compiler,
+ ref _initialized,
+ ref _initializeLock,
+ _createCompiler);
+ }
+
+ private IViewCompiler CreateCompiler()
+ {
+ var feature = new ViewsFeature();
+ _applicationPartManager.PopulateFeature(feature);
+
+ return new RuntimeViewCompiler(
+ _fileProvider.FileProvider,
+ _razorProjectEngine,
+ _csharpCompiler,
+ feature.ViewDescriptors,
+ _logger);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/RazorViewCompiler.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/DefaultViewCompiler.cs
similarity index 97%
rename from src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/RazorViewCompiler.cs
rename to src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/DefaultViewCompiler.cs
index 7afc53edab..1819015a16 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/RazorViewCompiler.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/DefaultViewCompiler.cs
@@ -14,13 +14,13 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Compilation
///
/// Caches the result of runtime compilation of Razor files for the duration of the application lifetime.
///
- internal class RazorViewCompiler : IViewCompiler
+ internal class DefaultViewCompiler : IViewCompiler
{
private readonly Dictionary> _compiledViews;
private readonly ConcurrentDictionary _normalizedPathCache;
private readonly ILogger _logger;
- public RazorViewCompiler(
+ public DefaultViewCompiler(
IList compiledViews,
ILogger logger)
{
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/RazorViewCompilerProvider.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/DefaultViewCompilerProvider.cs
similarity index 67%
rename from src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/RazorViewCompilerProvider.cs
rename to src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/DefaultViewCompilerProvider.cs
index 64965e6f72..b92077ad69 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/RazorViewCompilerProvider.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Compilation/DefaultViewCompilerProvider.cs
@@ -6,18 +6,18 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Mvc.Razor.Compilation
{
- internal class RazorViewCompilerProvider : IViewCompilerProvider
+ internal class DefaultViewCompilerProvider : IViewCompilerProvider
{
- private readonly RazorViewCompiler _compiler;
+ private readonly DefaultViewCompiler _compiler;
- public RazorViewCompilerProvider(
+ public DefaultViewCompilerProvider(
ApplicationPartManager applicationPartManager,
ILoggerFactory loggerFactory)
{
var feature = new ViewsFeature();
applicationPartManager.PopulateFeature(feature);
- _compiler = new RazorViewCompiler(feature.ViewDescriptors, loggerFactory.CreateLogger());
+ _compiler = new DefaultViewCompiler(feature.ViewDescriptors, loggerFactory.CreateLogger());
}
public IViewCompiler GetCompiler() => _compiler;
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs
index 46139a28a0..7b3ee93a3a 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/DependencyInjection/MvcRazorMvcCoreBuilderExtensions.cs
@@ -141,7 +141,7 @@ namespace Microsoft.Extensions.DependencyInjection
ServiceDescriptor.Transient, RazorViewEngineOptionsSetup>());
services.TryAddSingleton();
- services.TryAddSingleton();
+ services.TryAddSingleton();
// In the default scenario the following services are singleton by virtue of being initialized as part of
// creating the singleton RazorViewEngine instance.
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Properties/AssemblyInfo.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Properties/AssemblyInfo.cs
index 5bd88d4693..db40b79a34 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Properties/AssemblyInfo.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Properties/AssemblyInfo.cs
@@ -8,6 +8,7 @@ using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.RazorPages.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.TagHelpers.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageBase.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageBase.cs
index 8f2a98defa..f8277dca22 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageBase.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/RazorPageBase.cs
@@ -762,7 +762,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor
public bool Suppressed { get; set; }
}
- private struct TagHelperScopeInfo
+ private readonly struct TagHelperScopeInfo
{
public TagHelperScopeInfo(ViewBuffer buffer, HtmlEncoder encoder, TextWriter writer)
{
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/ApplicationModels/PageRouteMetadata.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/ApplicationModels/PageRouteMetadata.cs
index 0ababdcddc..46d86127cc 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/ApplicationModels/PageRouteMetadata.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/ApplicationModels/PageRouteMetadata.cs
@@ -3,16 +3,31 @@
namespace Microsoft.AspNetCore.Mvc.ApplicationModels
{
- // This is used to store the uncombined parts of the final page route
- internal class PageRouteMetadata
+ ///
+ /// Metadata used to construct an endpoint route to the page.
+ ///
+ // Note: This type name is referenced by name in AuthorizationMiddleware, do not change this without addressing https://github.com/aspnet/AspNetCore/issues/7011
+ public sealed class PageRouteMetadata
{
+ ///
+ /// Initializes a new instance of .
+ ///
+ /// The page route.
+ /// The route template specified by the page.
public PageRouteMetadata(string pageRoute, string routeTemplate)
{
PageRoute = pageRoute;
RouteTemplate = routeTemplate;
}
+ ///
+ /// Gets the page route.
+ ///
public string PageRoute { get; }
+
+ ///
+ /// Gets the route template specified by the page.
+ ///
public string RouteTemplate { get; }
}
}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/ApplicationModels/PageRouteModelFactory.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/ApplicationModels/PageRouteModelFactory.cs
index b2650063b7..1838d0ad9c 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/ApplicationModels/PageRouteModelFactory.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/ApplicationModels/PageRouteModelFactory.cs
@@ -7,18 +7,27 @@ using System.IO;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels
{
internal class PageRouteModelFactory
{
+ private static readonly Action _unsupportedAreaPath;
+
private static readonly string IndexFileName = "Index" + RazorViewEngine.ViewExtension;
private readonly RazorPagesOptions _options;
private readonly ILogger _logger;
private readonly string _normalizedRootDirectory;
private readonly string _normalizedAreaRootDirectory;
+ static PageRouteModelFactory()
+ {
+ _unsupportedAreaPath = LoggerMessage.Define(
+ LogLevel.Warning,
+ new EventId(1, "UnsupportedAreaPath"),
+ "The page at '{FilePath}' is located under the area root directory '/Areas/' but does not follow the path format '/Areas/AreaName/Pages/Directory/FileName.cshtml");
+ }
+
public PageRouteModelFactory(
RazorPagesOptions options,
ILogger logger)
@@ -96,7 +105,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
areaRootEndIndex >= relativePath.Length - 1 || // There's at least one token after the area root.
!relativePath.StartsWith(_normalizedAreaRootDirectory, StringComparison.OrdinalIgnoreCase)) // The path must start with area root.
{
- _logger.UnsupportedAreaPath(relativePath);
+ _unsupportedAreaPath(_logger, relativePath, null);
return false;
}
@@ -104,7 +113,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
var areaEndIndex = relativePath.IndexOf('/', startIndex: areaRootEndIndex + 1);
if (areaEndIndex == -1 || areaEndIndex == relativePath.Length)
{
- _logger.UnsupportedAreaPath(relativePath);
+ _unsupportedAreaPath(_logger, relativePath, null);
return false;
}
@@ -112,7 +121,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
// Ensure the next token is the "Pages" directory
if (string.Compare(relativePath, areaEndIndex, AreaPagesRoot, 0, AreaPagesRoot.Length, StringComparison.OrdinalIgnoreCase) != 0)
{
- _logger.UnsupportedAreaPath(relativePath);
+ _unsupportedAreaPath(_logger, relativePath, null);
return false;
}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/Infrastructure/PageActionDescriptorProvider.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/Infrastructure/PageActionDescriptorProvider.cs
index 23a449e731..61ab2a7a07 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/Infrastructure/PageActionDescriptorProvider.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/Infrastructure/PageActionDescriptorProvider.cs
@@ -8,7 +8,6 @@ using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.Routing;
-using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/PageLoggerExtensions.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/PageLoggerExtensions.cs
index 825dc0c190..9c965f3244 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/PageLoggerExtensions.cs
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/PageLoggerExtensions.cs
@@ -18,8 +18,6 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages
private static readonly Action _handlerMethodExecuted;
private static readonly Action _implicitHandlerMethodExecuted;
private static readonly Action _pageFilterShortCircuit;
- private static readonly Action _malformedPageDirective;
- private static readonly Action _unsupportedAreaPath;
private static readonly Action _notMostEffectiveFilter;
private static readonly Action _beforeExecutingMethodOnFilter;
private static readonly Action _afterExecutingMethodOnFilter;
@@ -53,11 +51,6 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages
new EventId(3, "PageFilterShortCircuited"),
"Request was short circuited at page filter '{PageFilter}'.");
- _malformedPageDirective = LoggerMessage.Define(
- LogLevel.Warning,
- new EventId(104, "MalformedPageDirective"),
- "The page directive at '{FilePath}' is malformed. Please fix the following issues: {Diagnostics}");
-
_notMostEffectiveFilter = LoggerMessage.Define(
LogLevel.Debug,
new EventId(1, "NotMostEffectiveFilter"),
@@ -72,11 +65,6 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages
LogLevel.Trace,
new EventId(2, "AfterExecutingMethodOnFilter"),
"{FilterType}: After executing {Method} on filter {Filter}.");
-
- _unsupportedAreaPath = LoggerMessage.Define(
- LogLevel.Warning,
- new EventId(1, "UnsupportedAreaPath"),
- "The page at '{FilePath}' is located under the area root directory '/Areas/' but does not follow the path format '/Areas/AreaName/Pages/Directory/FileName.cshtml");
}
public static void ExecutingHandlerMethod(this ILogger logger, PageContext context, HandlerMethodDescriptor handler, object[] arguments)
@@ -153,13 +141,5 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages
{
_notMostEffectiveFilter(logger, policyType, null);
}
-
- public static void UnsupportedAreaPath(this ILogger logger, string filePath)
- {
- if (logger.IsEnabled(LogLevel.Warning))
- {
- _unsupportedAreaPath(logger, filePath, null);
- }
- }
}
}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Testing/Microsoft.AspNetCore.Mvc.Testing.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Testing/Microsoft.AspNetCore.Mvc.Testing.csproj
index 36f14c1bc8..25a1229f2f 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Testing/Microsoft.AspNetCore.Mvc.Testing.csproj
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Testing/Microsoft.AspNetCore.Mvc.Testing.csproj
@@ -6,7 +6,7 @@
$(NoWarn);CS1591
true
aspnetcore;aspnetcoremvc;aspnetcoremvctesting
- true
+ true
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.ViewFeatures/HtmlHelperComponentExtensions.cs b/src/Mvc/src/Microsoft.AspNetCore.Mvc.ViewFeatures/HtmlHelperComponentExtensions.cs
new file mode 100644
index 0000000000..dd45a46688
--- /dev/null
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.ViewFeatures/HtmlHelperComponentExtensions.cs
@@ -0,0 +1,83 @@
+// 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.IO;
+using System.Text.Encodings.Web;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Components.Rendering;
+using Microsoft.AspNetCore.Html;
+using Microsoft.AspNetCore.Mvc.Rendering;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Microsoft.AspNetCore.Mvc.ViewFeatures
+{
+ ///
+ /// Extensions for rendering components.
+ ///
+ public static class HtmlHelperComponentExtensions
+ {
+ ///
+ /// Renders the .
+ ///
+ /// The .
+ /// The HTML produced by the rendered .
+ public static Task RenderComponentAsync(this IHtmlHelper htmlHelper) where TComponent : IComponent
+ {
+ if (htmlHelper == null)
+ {
+ throw new System.ArgumentNullException(nameof(htmlHelper));
+ }
+
+ return htmlHelper.RenderComponentAsync(null);
+ }
+
+ ///
+ /// Renders the .
+ ///
+ /// The .
+ /// An containing the parameters to pass
+ /// to the component.
+ /// The HTML produced by the rendered .
+ public static async Task RenderComponentAsync(
+ this IHtmlHelper htmlHelper,
+ object parameters) where TComponent : IComponent
+ {
+ if (htmlHelper == null)
+ {
+ throw new System.ArgumentNullException(nameof(htmlHelper));
+ }
+
+ var serviceProvider = htmlHelper.ViewContext.HttpContext.RequestServices;
+ var encoder = serviceProvider.GetRequiredService();
+ using (var htmlRenderer = new HtmlRenderer(serviceProvider, encoder.Encode))
+ {
+ var result = await htmlRenderer.RenderComponentAsync(
+ parameters == null ?
+ ParameterCollection.Empty :
+ ParameterCollection.FromDictionary(HtmlHelper.ObjectToDictionary(parameters)));
+
+ return new ComponentHtmlContent(result);
+ }
+ }
+
+ private class ComponentHtmlContent : IHtmlContent
+ {
+ private readonly IEnumerable _componentResult;
+
+ public ComponentHtmlContent(IEnumerable componentResult)
+ {
+ _componentResult = componentResult;
+ }
+
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
+ {
+ foreach (var element in _componentResult)
+ {
+ writer.Write(element);
+ }
+ }
+ }
+ }
+}
diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj
index 2bbb0d2944..5dbf2094c3 100644
--- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj
+++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj
@@ -21,6 +21,7 @@ Microsoft.AspNetCore.Mvc.ViewComponent
+
diff --git a/src/Mvc/src/Microsoft.Extensions.ApiDescription.Design/Microsoft.Extensions.ApiDescription.Design.csproj b/src/Mvc/src/Microsoft.Extensions.ApiDescription.Design/Microsoft.Extensions.ApiDescription.Design.csproj
index 486fc9d28e..d0976a5eaa 100644
--- a/src/Mvc/src/Microsoft.Extensions.ApiDescription.Design/Microsoft.Extensions.ApiDescription.Design.csproj
+++ b/src/Mvc/src/Microsoft.Extensions.ApiDescription.Design/Microsoft.Extensions.ApiDescription.Design.csproj
@@ -15,7 +15,7 @@
$(MSBuildProjectName).nuspec
$(MSBuildProjectName)
Build Tasks;MSBuild;Swagger;Open API;code generation; Web API client
- true
+ true
$(ExperimentalPackageVersion)
$(AssemblyName)
netstandard2.0;net461
@@ -25,48 +25,8 @@
-
-
-
-
-
-
- $(AssemblySigningCertName)
- tasks/$(TargetFramework)/$(TargetFileName)
- $(AssemblySigningStrongName)
-
-
-
-
-
-
- $(AssemblySigningCertName)
- tools/dotnet-getdocument.dll
- $(AssemblySigningStrongName)
-
-
- $(AssemblySigningCertName)
- tools/net461/GetDocument.Insider.exe
- $(AssemblySigningStrongName)
-
-
- $(AssemblySigningCertName)
- tools/net461-x86/GetDocument.Insider.exe
- $(AssemblySigningStrongName)
-
-
- $(AssemblySigningCertName)
- tools/netcoreapp2.0/GetDocument.Insider.exe
- $(AssemblySigningStrongName)
-
-
-
- tools/Newtonsoft.Json.dll"
- $(AssemblySigning3rdPartyCertName)
-
+
+
diff --git a/src/Mvc/startvs.cmd b/src/Mvc/startvs.cmd
new file mode 100644
index 0000000000..83db3aaa8a
--- /dev/null
+++ b/src/Mvc/startvs.cmd
@@ -0,0 +1,3 @@
+@ECHO OFF
+
+%~dp0..\..\startvs.cmd %~dp0Mvc.sln
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelMetadataTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelMetadataTest.cs
index b637350e3f..e72dea57e4 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelMetadataTest.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Abstractions.Test/ModelBinding/ModelMetadataTest.cs
@@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
public class ModelMetadataTest
{
// IsComplexType
- private struct IsComplexTypeModel
+ private readonly struct IsComplexTypeModel
{
}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ApplicationModels/AttributeRouteModelTests.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ApplicationModels/AttributeRouteModelTests.cs
index dc312a50bd..c6646c110a 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ApplicationModels/AttributeRouteModelTests.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ApplicationModels/AttributeRouteModelTests.cs
@@ -590,6 +590,83 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
},
"Home/Index/{id}"
};
+
+ yield return new object[]
+ {
+ "[controller]/[[[action]]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Home/[Index]/{id}"
+ };
+
+ yield return new object[]
+ {
+ "[controller]/[[[[[action]]]]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Home/[[Index]]/{id}"
+ };
+
+ yield return new object[]
+ {
+ "[controller]/[[[[[[[action]]]]]]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Home/[[[Index]]]/{id}"
+ };
+
+ yield return new object[]
+ {
+ "[controller]/[[[[[action]]]]]]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Home/[[Index]]]/{id}"
+ };
+
+ yield return new object[]
+ {
+ "[controller]/[[[[[[[action]]]]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Home/[[[Index]]/{id}"
+ };
+
+ yield return new object[]
+ {
+ "[controller]/[[[action]]]]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Home/[Index]]/{id}"
+ };
+
+ yield return new object[]
+ {
+ "[controller]/[[[[[[[action]]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Home/[[[Index]/{id}"
+ };
}
}
@@ -655,6 +732,61 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels
new Dictionary(StringComparer.OrdinalIgnoreCase),
"An empty replacement token ('[]') is not allowed.",
};
+
+ yield return new object[]
+ {
+ "[controller]/[[[action]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Token delimiters ('[', ']') are imbalanced.",
+ };
+
+ yield return new object[]
+ {
+ "[controller]/[[[action]]]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Token delimiters ('[', ']') are imbalanced.",
+ };
+
+ yield return new object[]
+ {
+ "[controller]/[[action]]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Token delimiters ('[', ']') are imbalanced.",
+ };
+
+ yield return new object[]
+ {
+ "[controller]/[[[[[[[action]]]]]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Token delimiters ('[', ']') are imbalanced.",
+ };
+
+ yield return new object[]
+ {
+ "[controller]/[[[[[[action]]]]]]]/{id}",
+ new Dictionary(StringComparer.OrdinalIgnoreCase)
+ {
+ { "controller", "Home" },
+ { "action", "Index" }
+ },
+ "Token delimiters ('[', ']') are imbalanced.",
+ };
}
}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/Binders/ComplexTypeModelBinderTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/Binders/ComplexTypeModelBinderTest.cs
index 8488a08dc2..8774ba896f 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/Binders/ComplexTypeModelBinderTest.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/Binders/ComplexTypeModelBinderTest.cs
@@ -1277,13 +1277,14 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders
public PointStruct Point { get; set; }
}
- private struct PointStruct
+ private readonly struct PointStruct
{
public PointStruct(double x, double y)
{
X = x;
Y = y;
}
+
public double X { get; }
public double Y { get; }
}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/DefaultModelBindingContextTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/DefaultModelBindingContextTest.cs
index 642082eb67..98b2825970 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/DefaultModelBindingContextTest.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/ModelBinding/DefaultModelBindingContextTest.cs
@@ -195,7 +195,6 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
{
throw new ArgumentNullException(nameof(bindingContext));
}
- Debug.Assert(bindingContext.Result == null);
throw new NotImplementedException();
}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperBaseTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperBaseTest.cs
index 1e0f48bf34..a57daa314d 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperBaseTest.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperBaseTest.cs
@@ -8,7 +8,6 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.ObjectPool;
using Xunit;
namespace Microsoft.AspNetCore.Mvc.Routing
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperExtensionsTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperExtensionsTest.cs
index b63c66e0fe..2f170b1c56 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperExtensionsTest.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperExtensionsTest.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Routing;
@@ -601,6 +602,257 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test.Routing
});
}
+ [Fact]
+ public void ActionLink_WithActionName_Works()
+ {
+ // Arrange
+ var expectedAction = "TestAction";
+ var expectedProtocol = "testprotocol://";
+ var expectedHost = "www.example.com";
+ UrlActionContext actual = null;
+
+ var httpContext = new DefaultHttpContext
+ {
+ Request =
+ {
+ Protocol = expectedProtocol,
+ Host = new HostString(expectedHost),
+ }
+ };
+ var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
+ var urlHelper = CreateMockUrlHelper(actionContext);
+ urlHelper.Setup(h => h.Action(It.IsAny()))
+ .Callback((UrlActionContext context) => actual = context);
+
+ // Act
+ urlHelper.Object.ActionLink(expectedAction);
+
+ // Assert
+ urlHelper.Verify();
+ Assert.NotNull(actual);
+ Assert.Equal(expectedAction, actual.Action);
+ Assert.Null(actual.Controller);
+ Assert.Null(actual.Values);
+
+ Assert.Equal(expectedProtocol, actual.Protocol);
+ Assert.Equal(expectedHost, actual.Host);
+ }
+
+ [Fact]
+ public void ActionLink_UsesSpecifiedProtocol()
+ {
+ // Arrange
+ var expectedProtocol = "testprotocol://";
+ var expectedHost = "www.example.com";
+ UrlActionContext actual = null;
+
+ var httpContext = new DefaultHttpContext
+ {
+ Request =
+ {
+ Protocol = "http://",
+ Host = new HostString(expectedHost),
+ }
+ };
+ var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
+ var urlHelper = CreateMockUrlHelper(actionContext);
+ urlHelper.Setup(h => h.Action(It.IsAny()))
+ .Callback((UrlActionContext context) => actual = context);
+
+ // Act
+ urlHelper.Object.ActionLink(protocol: expectedProtocol);
+
+ // Assert
+ urlHelper.Verify();
+ Assert.NotNull(actual);
+ Assert.Null(actual.Action);
+ Assert.Null(actual.Controller);
+ Assert.Null(actual.Values);
+
+ Assert.Equal(expectedProtocol, actual.Protocol);
+ Assert.Equal(expectedHost, actual.Host);
+ }
+
+ [Fact]
+ public void ActionLink_UsesSpecifiedHost()
+ {
+ // Arrange
+ var expectedProtocol = "testprotocol://";
+ var expectedHost = "www.example.com";
+ UrlActionContext actual = null;
+
+ var httpContext = new DefaultHttpContext
+ {
+ Request =
+ {
+ Protocol = expectedProtocol,
+ Host = new HostString("www.asp.net"),
+ }
+ };
+ var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
+ var urlHelper = CreateMockUrlHelper(actionContext);
+ urlHelper.Setup(h => h.Action(It.IsAny()))
+ .Callback((UrlActionContext context) => actual = context);
+
+ // Act
+ urlHelper.Object.ActionLink(host: expectedHost);
+
+ // Assert
+ urlHelper.Verify();
+ Assert.NotNull(actual);
+ Assert.Null(actual.Action);
+ Assert.Null(actual.Controller);
+ Assert.Null(actual.Values);
+
+ Assert.Equal(expectedProtocol, actual.Protocol);
+ Assert.Equal(expectedHost, actual.Host);
+ }
+
+ [Fact]
+ public void PageLink_WithPageName_Works()
+ {
+ // Arrange
+ var expectedPage = "/TestPage";
+ var expectedProtocol = "testprotocol://";
+ var expectedHost = "www.example.com";
+ UrlRouteContext actual = null;
+
+ var actionContext = new ActionContext
+ {
+ HttpContext = new DefaultHttpContext
+ {
+ Request =
+ {
+ Protocol = expectedProtocol,
+ Host = new HostString(expectedHost),
+ }
+ },
+ RouteData = new RouteData
+ {
+ Values =
+ {
+ { "page", "ambient-page" },
+ }
+ },
+ };
+ var urlHelper = CreateMockUrlHelper(actionContext);
+ urlHelper.Setup(h => h.RouteUrl(It.IsAny()))
+ .Callback((UrlRouteContext context) => actual = context);
+
+ // Act
+ urlHelper.Object.PageLink(expectedPage);
+
+ // Assert
+ urlHelper.Verify();
+ Assert.NotNull(actual);
+ Assert.Collection(Assert.IsType(actual.Values),
+ value =>
+ {
+ Assert.Equal("page", value.Key);
+ Assert.Equal(expectedPage, value.Value);
+ });
+ Assert.Null(actual.RouteName);
+
+ Assert.Equal(expectedProtocol, actual.Protocol);
+ Assert.Equal(expectedHost, actual.Host);
+ }
+
+ [Fact]
+ public void PageLink_UsesSpecifiedProtocol()
+ {
+ // Arrange
+ var expectedProtocol = "testprotocol://";
+ var expectedHost = "www.example.com";
+ UrlRouteContext actual = null;
+
+ var actionContext = new ActionContext
+ {
+ HttpContext = new DefaultHttpContext
+ {
+ Request =
+ {
+ Protocol = "http://",
+ Host = new HostString(expectedHost),
+ }
+ },
+ RouteData = new RouteData
+ {
+ Values =
+ {
+ { "page", "ambient-page" },
+ }
+ },
+ };
+ var urlHelper = CreateMockUrlHelper(actionContext);
+ urlHelper.Setup(h => h.RouteUrl(It.IsAny()))
+ .Callback((UrlRouteContext context) => actual = context);
+
+ // Act
+ urlHelper.Object.PageLink(protocol: expectedProtocol);
+
+ // Assert
+ urlHelper.Verify();
+ Assert.NotNull(actual);
+ Assert.Collection(Assert.IsType(actual.Values),
+ value =>
+ {
+ Assert.Equal("page", value.Key);
+ Assert.Equal("ambient-page", value.Value);
+ });
+ Assert.Null(actual.RouteName);
+
+ Assert.Equal(expectedProtocol, actual.Protocol);
+ Assert.Equal(expectedHost, actual.Host);
+ }
+
+ [Fact]
+ public void PageLink_UsesSpecifiedHost()
+ {
+ // Arrange
+ var expectedProtocol = "testprotocol://";
+ var expectedHost = "www.example.com";
+ UrlRouteContext actual = null;
+
+ var actionContext = new ActionContext
+ {
+ HttpContext = new DefaultHttpContext
+ {
+ Request =
+ {
+ Protocol = expectedProtocol,
+ Host = new HostString("www.asp.net"),
+ }
+ },
+ RouteData = new RouteData
+ {
+ Values =
+ {
+ { "page", "ambient-page" },
+ }
+ },
+ };
+ var urlHelper = CreateMockUrlHelper(actionContext);
+ urlHelper.Setup(h => h.RouteUrl(It.IsAny()))
+ .Callback((UrlRouteContext context) => actual = context);
+
+ // Act
+ urlHelper.Object.PageLink(host: expectedHost);
+
+ // Assert
+ urlHelper.Verify();
+ Assert.NotNull(actual);
+ Assert.Collection(Assert.IsType(actual.Values),
+ value =>
+ {
+ Assert.Equal("page", value.Key);
+ Assert.Equal("ambient-page", value.Value);
+ });
+ Assert.Null(actual.RouteName);
+
+ Assert.Equal(expectedProtocol, actual.Protocol);
+ Assert.Equal(expectedHost, actual.Host);
+ }
+
private static Mock CreateMockUrlHelper(ActionContext context = null)
{
if (context == null)
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperTestBase.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperTestBase.cs
index dd57e88248..b1e21e515c 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperTestBase.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Core.Test/Routing/UrlHelperTestBase.cs
@@ -9,7 +9,6 @@ using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.ObjectPool;
using Moq;
using Xunit;
@@ -952,6 +951,19 @@ namespace Microsoft.AspNetCore.Mvc.Routing
Assert.Equal("/b/Store/Checkout", url);
}
+ [Fact]
+ public void ActionLink_ReturnsAbsoluteUrlToAction()
+ {
+ // Arrange
+ var urlHelper = CreateUrlHelperWithDefaultRoutes();
+
+ // Act
+ var url = urlHelper.ActionLink("contact", "home");
+
+ // Assert
+ Assert.Equal("http://localhost/app/home/contact", url);
+ }
+
protected abstract IServiceProvider CreateServices();
protected abstract IUrlHelper CreateUrlHelper(ActionContext actionContext);
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicApiTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicApiTest.cs
deleted file mode 100644
index 42d2a5a5ce..0000000000
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicApiTest.cs
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System.Net;
-using System.Net.Http;
-using System.Text;
-using System.Threading.Tasks;
-using Microsoft.Net.Http.Headers;
-using Xunit;
-
-namespace Microsoft.AspNetCore.Mvc.FunctionalTests
-{
- public class BasicApiTest : IClassFixture
- {
- private static readonly byte[] PetBytes = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)
- .GetBytes(@"{
- ""category"" : {
- ""name"" : ""Cats""
- },
- ""images"": [
- {
- ""url"": ""http://example.com/images/fluffy1.png""
- },
- {
- ""url"": ""http://example.com/images/fluffy2.png""
- },
- ],
- ""tags"": [
- {
- ""name"": ""orange""
- },
- {
- ""name"": ""kitty""
- }
- ],
- ""age"": 2,
- ""hasVaccinations"": ""true"",
- ""name"" : ""fluffy"",
- ""status"" : ""available""
-}");
-
- public BasicApiTest(BasicApiFixture fixture)
- {
- Client = fixture.CreateClient();
- }
-
- public HttpClient Client { get; }
-
- [Fact]
- public async Task Token_WithUnknownUser_ReturnsForbidden()
- {
- // Arrange & Act
- var response = await Client.GetAsync("/token?username=fallguy@example.com");
-
- // Assert
- Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode);
- }
-
- [Fact]
- public async Task Token_WithKnownUser_ReturnsOkAndToken()
- {
- // Arrange & Act
- var response = await Client.GetAsync("/token?username=reader@example.com");
-
- // Assert
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.Equal("text/plain", response.Content.Headers.ContentType.MediaType);
-
- var token = await response.Content.ReadAsStringAsync();
- Assert.NotNull(token);
- Assert.NotEmpty(token);
- }
-
- [Fact]
- public async Task FindByStatus_WithNoToken_ReturnsUnauthorized()
- {
- // Arrange & Act
- var response = await Client.GetAsync("/pet/findByStatus?status=available");
-
- // Assert
- Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
- }
-
- [Theory]
- [InlineData("reader@example.com")]
- [InlineData("writer@example.com")]
- public async Task FindByStatus_WithToken_ReturnsOkAndPet(string username)
- {
- // Arrange & Act 1
- var token = await Client.GetStringAsync($"/token?username={username}");
-
- // Assert 1 (guard)
- Assert.NotEmpty(token);
-
- // Arrange 2
- var request = new HttpRequestMessage(HttpMethod.Get, "/pet/findByStatus?status=available");
- request.Headers.Add(HeaderNames.Authorization, $"Bearer {token}");
-
- // Act 2
- var response = await Client.SendAsync(request);
-
- // Assert 2
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.Equal("application/json", response.Content.Headers.ContentType.MediaType);
-
- var json = await response.Content.ReadAsStringAsync();
- Assert.NotNull(json);
- Assert.NotEmpty(json);
- }
-
- [Fact]
- public async Task FindById_WithInvalidPetId_ReturnsNotFound()
- {
- // Arrange & Act 1
- var token = await Client.GetStringAsync("/token?username=reader@example.com");
-
- // Assert 1 (guard)
- Assert.NotEmpty(token);
-
- // Arrange 2
- var request = new HttpRequestMessage(HttpMethod.Get, "/pet/100");
- request.Headers.Add(HeaderNames.Authorization, $"Bearer {token}");
-
- // Act 2
- var response = await Client.SendAsync(request);
-
- // Assert 2
- Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
- }
-
- [Fact]
- public async Task FindById_WithValidPetId_ReturnsOkAndPet()
- {
- // Arrange & Act 1
- var token = await Client.GetStringAsync("/token?username=reader@example.com");
-
- // Assert 1 (guard)
- Assert.NotEmpty(token);
-
- // Arrange 2
- var request = new HttpRequestMessage(HttpMethod.Get, "/pet/-1");
- request.Headers.Add(HeaderNames.Authorization, $"Bearer {token}");
-
- // Act 2
- var response = await Client.SendAsync(request);
-
- // Assert 2
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.Equal("application/json", response.Content.Headers.ContentType.MediaType);
-
- var json = await response.Content.ReadAsStringAsync();
- Assert.NotNull(json);
- Assert.NotEmpty(json);
- }
-
- [Fact]
- public async Task AddPet_WithInsufficientClaims_ReturnsForbidden()
- {
- // Arrange & Act 1
- var token = await Client.GetStringAsync("/token?username=reader@example.com");
-
- // Assert 1 (guard)
- Assert.NotEmpty(token);
-
- // Arrange 2
- var request = new HttpRequestMessage(HttpMethod.Post, "/pet")
- {
- Content = new ByteArrayContent(PetBytes)
- {
- Headers =
- {
- { "Content-Type", "application/json" },
- },
- },
- Headers =
- {
- { HeaderNames.Authorization, $"Bearer {token}" },
- },
- };
-
- // Act 2
- var response = await Client.SendAsync(request);
-
- // Assert 2
- Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode);
- }
-
- [Fact]
- public async Task AddPet_WithValidClaims_ReturnsCreated()
- {
- // Arrange & Act 1
- var token = await Client.GetStringAsync("/token?username=writer@example.com");
-
- // Assert 1 (guard)
- Assert.NotEmpty(token);
-
- // Arrange 2
- var request = new HttpRequestMessage(HttpMethod.Post, "/pet")
- {
- Content = new ByteArrayContent(PetBytes)
- {
- Headers =
- {
- { HeaderNames.ContentType, "application/json" },
- },
- },
- Headers =
- {
- { HeaderNames.Authorization, $"Bearer {token}" },
- },
- };
-
- // Act 2
- var response = await Client.SendAsync(request);
-
- // Assert 2
- Assert.Equal(HttpStatusCode.Created, response.StatusCode);
- var location = response.Headers.Location.ToString();
- Assert.NotNull(location);
- Assert.EndsWith("/1", location);
- }
- }
-}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicViewsTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicViewsTest.cs
deleted file mode 100644
index 5f9b0bbcd8..0000000000
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/BasicViewsTest.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Collections.Generic;
-using System.Net;
-using System.Net.Http;
-using System.Threading.Tasks;
-using Xunit;
-
-namespace Microsoft.AspNetCore.Mvc.FunctionalTests
-{
- public class BasicViewsTest : IClassFixture
- {
- public BasicViewsTest(BasicViewsFixture fixture)
- {
- Client = fixture.CreateClient();
- }
-
- public HttpClient Client { get; }
-
- [Theory]
- [InlineData("/")]
- [InlineData("/Home/HtmlHelpers")]
- public async Task Get_ReturnsOkAndAntiforgeryToken(string path)
- {
- // Arrange & Act
- var response = await Client.GetAsync(path);
-
- // Assert
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.Equal("text/html", response.Content.Headers.ContentType.MediaType);
-
- var html = await response.Content.ReadAsStringAsync();
- Assert.NotNull(html);
- Assert.NotEmpty(html);
-
- var token = AntiforgeryTestHelper.RetrieveAntiforgeryToken(html, "/");
- Assert.NotNull(token);
- Assert.NotEmpty(token);
- }
-
- [Theory]
- [InlineData("/")]
- [InlineData("/Home/HtmlHelpers")]
- public async Task Post_ReturnsOkAndNewPerson(string path)
- {
- // Arrange & Act 1
- var html = await Client.GetStringAsync(path);
-
- // Assert 1 (guard)
- Assert.NotEmpty(html);
-
- // Arrange 2
- var token = AntiforgeryTestHelper.RetrieveAntiforgeryToken(html, "/");
- var name = Guid.NewGuid().ToString();
- name = name.Substring(startIndex: 0, length: name.LastIndexOf('-'));
- var form = new Dictionary
- {
- { "__RequestVerificationToken", token },
- { "Age", "12" },
- { "BirthDate", "2006-03-01T09:51:43.041-07:00" },
- { "Name", name },
- };
-
- var content = new FormUrlEncodedContent(form);
- var request = new HttpRequestMessage(HttpMethod.Post, path)
- {
- Content = content,
- };
-
- // Act 2
- var response = await Client.SendAsync(request);
-
- // Assert 2
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
-
- var body = await response.Content.ReadAsStringAsync();
- Assert.NotNull(body);
- Assert.Contains($@"value=""{name}""", body);
- }
- }
-}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/ComponentRenderingFunctionalTests.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/ComponentRenderingFunctionalTests.cs
new file mode 100644
index 0000000000..d6f95edc2e
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/ComponentRenderingFunctionalTests.cs
@@ -0,0 +1,139 @@
+// 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.Net;
+using System.Net.Http;
+using System.Threading.Tasks;
+using AngleSharp.Parser.Html;
+using BasicWebSite.Services;
+using Microsoft.Extensions.DependencyInjection;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Mvc.FunctionalTests
+{
+ public class ComponentRenderingFunctionalTests : IClassFixture>
+ {
+ public ComponentRenderingFunctionalTests(MvcTestFixture fixture)
+ {
+ Client = Client ?? CreateClient(fixture);
+ }
+
+ public HttpClient Client { get; }
+
+ [Fact]
+ public async Task Renders_BasicComponent()
+ {
+ // Arrange & Act
+ var response = await Client.GetAsync("http://localhost/components");
+
+ // Assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ var content = await response.Content.ReadAsStringAsync();
+
+ AssertComponent("\n Hello world!
\n", "Greetings", content);
+ }
+
+ [Fact]
+ public async Task Renders_AsyncComponent()
+ {
+ // Arrange & Act
+ var expectedHtml = @"
+ Weather forecast
+
+This component demonstrates fetching data from the server.
+
+ Weather data for 01/15/2019
+
+
+
+ Date
+ Temp. (C)
+ Temp. (F)
+ Summary
+
+
+
+
+ 06/05/2018
+ 1
+ 33
+ Freezing
+
+
+ 07/05/2018
+ 14
+ 57
+ Bracing
+
+
+ 08/05/2018
+ -13
+ 9
+ Freezing
+
+
+ 09/05/2018
+ -16
+ 4
+ Balmy
+
+
+ 10/05/2018
+ 2
+ 29
+ Chilly
+
+
+
+
+";
+
+ var response = await Client.GetAsync("http://localhost/components");
+
+ // Assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ var content = await response.Content.ReadAsStringAsync();
+
+ AssertComponent(expectedHtml, "FetchData", content);
+ }
+
+ private void AssertComponent(string expectedConent, string divId, string responseContent)
+ {
+ var parser = new HtmlParser();
+ var htmlDocument = parser.Parse(responseContent);
+ var div = htmlDocument.Body.QuerySelector($"#{divId}");
+ Assert.Equal(
+ expectedConent.Replace("\r\n","\n"),
+ div.InnerHtml.Replace("\r\n","\n"));
+ }
+
+ // A simple delegating handler used in setting up test services so that we can configure
+ // services that talk back to the TestServer using HttpClient.
+ private class LoopHttpHandler : DelegatingHandler
+ {
+ }
+
+ private HttpClient CreateClient(MvcTestFixture fixture)
+ {
+ var loopHandler = new LoopHttpHandler();
+
+ var client = fixture
+ .WithWebHostBuilder(builder => builder.ConfigureServices(ConfigureTestWeatherForecastService))
+ .CreateClient();
+
+ // We configure the inner handler with a handler to this TestServer instance so that calls to the
+ // server can get routed properly.
+ loopHandler.InnerHandler = fixture.Server.CreateHandler();
+
+ void ConfigureTestWeatherForecastService(IServiceCollection services) =>
+ // We configure the test service here with an HttpClient that uses this loopback handler to talk
+ // to this TestServer instance.
+ services.AddSingleton(new WeatherForecastService(new HttpClient(loopHandler)
+ {
+ BaseAddress = fixture.ClientOptions.BaseAddress
+ }));
+
+ return client;
+ }
+ }
+}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Infrastructure/BasicApiFixture.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Infrastructure/BasicApiFixture.cs
deleted file mode 100644
index 56294311a7..0000000000
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Infrastructure/BasicApiFixture.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using BasicApi;
-
-namespace Microsoft.AspNetCore.Mvc.FunctionalTests
-{
- public class BasicApiFixture : MvcTestFixture
- {
- // Do not leave .db file behind. Also, ensure added pet gets expected id (1) in subsequent runs.
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Startup.DropDatabase(Server.Host.Services);
- }
-
- base.Dispose(disposing);
- }
- }
-}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Infrastructure/BasicViewsFixture.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Infrastructure/BasicViewsFixture.cs
deleted file mode 100644
index 3ea0c60835..0000000000
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Infrastructure/BasicViewsFixture.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using BasicViews;
-
-namespace Microsoft.AspNetCore.Mvc.FunctionalTests
-{
- public class BasicViewsFixture : MvcTestFixture
- {
- // Do not leave .db file behind.
- protected override void Dispose(bool disposing)
- {
- if (disposing)
- {
- Startup.DropDatabase(Server.Host.Services);
- }
-
- base.Dispose(disposing);
- }
- }
-}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Microsoft.AspNetCore.Mvc.FunctionalTests.csproj b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Microsoft.AspNetCore.Mvc.FunctionalTests.csproj
index b4e4e33ab0..34afae6bb9 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Microsoft.AspNetCore.Mvc.FunctionalTests.csproj
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/Microsoft.AspNetCore.Mvc.FunctionalTests.csproj
@@ -6,6 +6,8 @@
$(DefineConstants);GENERATE_BASELINES
$(DefineConstants);__RemoveThisBitTo__GENERATE_BASELINES
+
+ false
@@ -24,8 +26,6 @@
-
-
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RazorBuildTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RazorBuildTest.cs
index e90c761c83..ba90b35947 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RazorBuildTest.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RazorBuildTest.cs
@@ -1,6 +1,8 @@
// 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.Net;
using System.Net.Http;
using System.Threading.Tasks;
@@ -17,7 +19,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
public HttpClient Client { get; }
- [Fact(Skip = "https://github.com/aspnet/Mvc/issues/8753")]
+ [Fact]
public async Task Rzc_LocalPageWithDifferentContent_IsUsed()
{
// Act
@@ -29,7 +31,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
Assert.Equal("Hello from runtime-compiled rzc page!", responseBody.Trim());
}
- [Fact(Skip = "https://github.com/aspnet/Mvc/issues/8753")]
+ [Fact]
public async Task Rzc_LocalViewWithDifferentContent_IsUsed()
{
// Act
@@ -53,5 +55,89 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.Equal("Hello from buildtime-compiled rzc view!", responseBody.Trim());
}
+
+ [Fact]
+ public async Task RazorViews_AreUpdatedOnChange()
+ {
+ // Arrange
+ var expected1 = "Original content";
+ var path = "/Views/UpdateableViews/Index.cshtml";
+
+ // Act - 1
+ var body = await Client.GetStringAsync("/UpdateableViews");
+
+ // Assert - 1
+ Assert.Equal(expected1, body.Trim(), ignoreLineEndingDifferences: true);
+
+ // Act - 2
+ await UpdateFile(path, "@GetType().Assembly");
+ body = await Client.GetStringAsync("/UpdateableViews");
+
+ // Assert - 2
+ var actual2 = body.Trim();
+ Assert.NotEqual(expected1, actual2);
+
+ // Act - 3
+ // With all things being the same, expect a cached compilation
+ body = await Client.GetStringAsync("/UpdateableViews");
+
+ // Assert - 3
+ Assert.Equal(actual2, body.Trim(), ignoreLineEndingDifferences: true);
+
+ // Act - 4
+ // Trigger a change in ViewImports
+ await UpdateFile("/Views/UpdateableViews/_ViewImports.cshtml", "new content");
+ body = await Client.GetStringAsync("/UpdateableViews");
+
+ // Assert - 4
+ Assert.NotEqual(actual2, body.Trim());
+ }
+
+ [Fact]
+ public async Task RazorPages_AreUpdatedOnChange()
+ {
+ // Arrange
+ var expected1 = "Original content";
+
+ // Act - 1
+ var body = await Client.GetStringAsync("/UpdateablePage");
+
+ // Assert - 1
+ Assert.Equal(expected1, body.Trim(), ignoreLineEndingDifferences: true);
+
+ // Act - 2
+ await UpdateRazorPages();
+ await UpdateFile("/Pages/UpdateablePage.cshtml", "@page" + Environment.NewLine + "@GetType().Assembly");
+ body = await Client.GetStringAsync("/UpdateablePage");
+
+ // Assert - 2
+ var actual2 = body.Trim();
+ Assert.NotEqual(expected1, actual2);
+
+ // Act - 3
+ // With all things being unchanged, we should get the cached page.
+ body = await Client.GetStringAsync("/UpdateablePage");
+
+ // Assert - 3
+ Assert.Equal(actual2, body.Trim(), ignoreLineEndingDifferences: true);
+ }
+
+ private async Task UpdateFile(string path, string content)
+ {
+ var updateContent = new FormUrlEncodedContent(new Dictionary
+ {
+ { "path", path },
+ { "content", content },
+ });
+
+ var response = await Client.PostAsync($"/UpdateableViews/Update", updateContent);
+ response.EnsureSuccessStatusCode();
+ }
+
+ private async Task UpdateRazorPages()
+ {
+ var response = await Client.PostAsync($"/UpdateableViews/UpdateRazorPages", new StringContent(string.Empty));
+ response.EnsureSuccessStatusCode();
+ }
}
}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RazorPagesTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RazorPagesTest.cs
index b36fe5af37..56e8785254 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RazorPagesTest.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RazorPagesTest.cs
@@ -1190,11 +1190,11 @@ Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary`1[AspNetCore.InjectedPa
public async Task AuthFiltersAppliedToPageModel_AreExecuted()
{
// Act
- var response = await Client.GetAsync("/ModelWithAuthFilter");
+ var response = await Client.GetAsync("/Pages/ModelWithAuthFilter");
// Assert
Assert.Equal(HttpStatusCode.Redirect, response.StatusCode);
- Assert.Equal("/Login?ReturnUrl=%2FModelWithAuthFilter", response.Headers.Location.PathAndQuery);
+ Assert.Equal("/Login?ReturnUrl=%2FPages%2FModelWithAuthFilter", response.Headers.Location.PathAndQuery);
}
[Fact]
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RazorPagesWithEndpointRoutingTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RazorPagesWithEndpointRoutingTest.cs
new file mode 100644
index 0000000000..6e7be902ff
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RazorPagesWithEndpointRoutingTest.cs
@@ -0,0 +1,66 @@
+// 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.Net;
+using System.Net.Http;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Mvc.FunctionalTests
+{
+ public class RazorPagesWithEndpointRoutingTest : IClassFixture>
+ {
+ public RazorPagesWithEndpointRoutingTest(MvcTestFixture fixture)
+ {
+ Client = fixture.CreateDefaultClient();
+ }
+
+ public HttpClient Client { get; }
+
+ [Fact]
+ public async Task Authorize_AppliedUsingConvention_Works()
+ {
+ // Act
+ var response = await Client.GetAsync("/Conventions/AuthFolder");
+
+ // Assert
+ await response.AssertStatusCodeAsync(HttpStatusCode.Redirect);
+ Assert.Equal("/Login?ReturnUrl=%2FConventions%2FAuthFolder", response.Headers.Location.PathAndQuery);
+ }
+
+ [Fact]
+ public async Task Authorize_AppliedUsingConvention_CanByOverridenByAllowAnonymousAppliedToModel()
+ {
+ // Act
+ var response = await Client.GetAsync("/Conventions/AuthFolder/AnonymousViaModel");
+
+ // Assert
+ await response.AssertStatusCodeAsync(HttpStatusCode.OK);
+
+ var content = await response.Content.ReadAsStringAsync();
+ Assert.Equal("Hello from Anonymous", content.Trim());
+ }
+
+ [Fact]
+ public async Task Authorize_AppliedUsingAttributeOnModel_Works()
+ {
+ // Act
+ var response = await Client.GetAsync("/ModelWithAuthFilter");
+
+ // Assert
+ await response.AssertStatusCodeAsync(HttpStatusCode.Redirect);
+ Assert.Equal("/Login?ReturnUrl=%2FModelWithAuthFilter", response.Headers.Location.PathAndQuery);
+ }
+
+ [Fact]
+ public async Task Authorize_WithEndpointRouting_WorksForControllers()
+ {
+ // Act
+ var response = await Client.GetAsync("/AuthorizedAction/Index");
+
+ // Assert
+ await response.AssertStatusCodeAsync(HttpStatusCode.Redirect);
+ Assert.Equal("/Login?ReturnUrl=%2FAuthorizedAction%2FIndex", response.Headers.Location.PathAndQuery);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RoutingTestsBase.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RoutingTestsBase.cs
index ca40dc6ea8..d7d51e19c3 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RoutingTestsBase.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/RoutingTestsBase.cs
@@ -48,6 +48,32 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests
Assert.Equal(expectedUrl, Assert.Single(result.ExpectedUrls));
}
+ [Fact]
+ public async Task ConventionalRoutedAction_RouteHasNonParameterConstraint_RouteConstraintRun_Allowed()
+ {
+ // Arrange & Act
+ var response = await Client.GetAsync("http://localhost/NonParameterConstraintRoute/NonParameterConstraint/Index?allowed=true");
+
+ // Assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+
+ var body = await response.Content.ReadAsStringAsync();
+ var result = JsonConvert.DeserializeObject(body);
+
+ Assert.Equal("NonParameterConstraint", result.Controller);
+ Assert.Equal("Index", result.Action);
+ }
+
+ [Fact]
+ public async Task ConventionalRoutedAction_RouteHasNonParameterConstraint_RouteConstraintRun_Denied()
+ {
+ // Arrange & Act
+ var response = await Client.GetAsync("http://localhost/NonParameterConstraintRoute/NonParameterConstraint/Index?allowed=false");
+
+ // Assert
+ Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
+ }
+
[Fact]
public async Task ConventionalRoutedAction_RouteContainsPage_RouteNotMatched()
{
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/ViewEngineTests.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/ViewEngineTests.cs
index 84283fe77a..e2c9f20430 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/ViewEngineTests.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.FunctionalTests/ViewEngineTests.cs
@@ -252,30 +252,6 @@ ViewWithNestedLayout-Content
Assert.Equal(expected, body.Trim(), ignoreLineEndingDifferences: true);
}
- [Fact(Skip = "https://github.com/aspnet/Mvc/issues/8754")]
- public Task RazorViewEngine_RendersViewsFromEmbeddedFileProvider_WhenLookedupByName()
- => RazorViewEngine_RendersIndexViewsFromEmbeddedFileProvider("/EmbeddedViews/LookupByName");
-
- [Fact(Skip = "https://github.com/aspnet/Mvc/issues/8754")]
- public Task RazorViewEngine_RendersViewsFromEmbeddedFileProvider_WhenLookedupByPath()
- => RazorViewEngine_RendersIndexViewsFromEmbeddedFileProvider("/EmbeddedViews/LookupByPath");
-
- private async Task RazorViewEngine_RendersIndexViewsFromEmbeddedFileProvider(string requestPath)
- {
- // Arrange
- var expected =
-@"Hello from EmbeddedShared/_Partial
-Hello from Shared/_EmbeddedPartial
-Tag Helper Link
- ";
-
- // Act
- var body = await Client.GetStringAsync(requestPath);
-
- // Assert
- Assert.Equal(expected, body.Trim(), ignoreLineEndingDifferences: true);
- }
-
[Fact]
public async Task LayoutValueIsPassedBetweenNestedViewStarts()
{
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/CSharpCompilerTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/CSharpCompilerTest.cs
new file mode 100644
index 0000000000..3f87554209
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/CSharpCompilerTest.cs
@@ -0,0 +1,319 @@
+// 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.Linq;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.Emit;
+using Microsoft.CodeAnalysis.Text;
+using Moq;
+using Xunit;
+using DependencyContextCompilationOptions = Microsoft.Extensions.DependencyModel.CompilationOptions;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ public class CSharpCompilerTest
+ {
+ private readonly RazorReferenceManager ReferenceManager = new TestRazorReferenceManager();
+
+ [Theory]
+ [InlineData(null)]
+ [InlineData("")]
+ public void GetCompilationOptions_ReturnsDefaultOptionsIfApplicationNameIsNullOrEmpty(string name)
+ {
+ // Arrange
+ var hostingEnvironment = Mock.Of(e => e.ApplicationName == name);
+ var compiler = new CSharpCompiler(ReferenceManager, hostingEnvironment);
+
+ // Act
+ var options = compiler.GetDependencyContextCompilationOptions();
+
+ // Assert
+ Assert.Same(DependencyContextCompilationOptions.Default, options);
+ }
+
+ [Fact]
+ public void GetCompilationOptions_ReturnsDefaultOptionsIfApplicationDoesNotHaveDependencyContext()
+ {
+ // Arrange
+ var hostingEnvironment = Mock.Of();
+ var compiler = new CSharpCompiler(ReferenceManager, hostingEnvironment);
+
+ // Act
+ var options = compiler.GetDependencyContextCompilationOptions();
+
+ // Assert
+ Assert.Same(DependencyContextCompilationOptions.Default, options);
+ }
+
+ [Theory]
+ [InlineData("Development", OptimizationLevel.Debug)]
+ [InlineData("Staging", OptimizationLevel.Release)]
+ [InlineData("Production", OptimizationLevel.Release)]
+ public void Constructor_SetsOptimizationLevelBasedOnEnvironment(
+ string environment,
+ OptimizationLevel expected)
+ {
+ // Arrange
+ var options = new RazorViewEngineOptions();
+ var hostingEnvironment = new Mock();
+ hostingEnvironment.SetupGet(e => e.EnvironmentName)
+ .Returns(environment);
+ var compiler = new CSharpCompiler(ReferenceManager, hostingEnvironment.Object);
+
+ // Act & Assert
+ var compilationOptions = compiler.CSharpCompilationOptions;
+ Assert.Equal(expected, compilationOptions.OptimizationLevel);
+ }
+
+ [Theory]
+ [InlineData("Development", "DEBUG")]
+ [InlineData("Staging", "RELEASE")]
+ [InlineData("Production", "RELEASE")]
+ public void EnsureOptions_SetsPreprocessorSymbols(string environment, string expectedConfiguration)
+ {
+ // Arrange
+ var options = new RazorViewEngineOptions();
+ var hostingEnvironment = new Mock();
+ hostingEnvironment.SetupGet(e => e.EnvironmentName)
+ .Returns(environment);
+ var compiler = new CSharpCompiler(ReferenceManager, hostingEnvironment.Object);
+
+ // Act & Assert
+ var parseOptions = compiler.ParseOptions;
+ Assert.Equal(new[] { expectedConfiguration }, parseOptions.PreprocessorSymbolNames);
+ }
+
+ [Fact]
+ public void EnsureOptions_ConfiguresDefaultCompilationOptions()
+ {
+ // Arrange
+ var hostingEnvironment = Mock.Of(h => h.EnvironmentName == "Development");
+ var compiler = new CSharpCompiler(ReferenceManager, hostingEnvironment);
+
+ // Act & Assert
+ var compilationOptions = compiler.CSharpCompilationOptions;
+ Assert.False(compilationOptions.AllowUnsafe);
+ Assert.Equal(ReportDiagnostic.Default, compilationOptions.GeneralDiagnosticOption);
+ Assert.Equal(OptimizationLevel.Debug, compilationOptions.OptimizationLevel);
+ Assert.Collection(compilationOptions.SpecificDiagnosticOptions.OrderBy(d => d.Key),
+ item =>
+ {
+ Assert.Equal("CS1701", item.Key);
+ Assert.Equal(ReportDiagnostic.Suppress, item.Value);
+ },
+ item =>
+ {
+ Assert.Equal("CS1702", item.Key);
+ Assert.Equal(ReportDiagnostic.Suppress, item.Value);
+ },
+ item =>
+ {
+ Assert.Equal("CS1705", item.Key);
+ Assert.Equal(ReportDiagnostic.Suppress, item.Value);
+ });
+ }
+
+ [Fact]
+ public void EnsureOptions_ConfiguresDefaultParseOptions()
+ {
+ // Arrange
+ var hostingEnvironment = Mock.Of(h => h.EnvironmentName == "Development");
+ var compiler = new CSharpCompiler(ReferenceManager, hostingEnvironment);
+
+ // Act & Assert
+ var parseOptions = compiler.ParseOptions;
+ Assert.Equal(LanguageVersion.CSharp7, parseOptions.LanguageVersion);
+ Assert.Equal(new[] { "DEBUG" }, parseOptions.PreprocessorSymbolNames);
+ }
+
+ [Fact]
+ public void Constructor_ConfiguresPreprocessorSymbolNames()
+ {
+ // Arrange
+ var hostingEnvironment = Mock.Of();
+ var dependencyContextOptions = GetDependencyContextCompilationOptions("SOME_TEST_DEFINE");
+
+ var compiler = new TestCSharpCompiler(ReferenceManager, hostingEnvironment, dependencyContextOptions);
+
+ // Act & Assert
+ var parseOptions = compiler.ParseOptions;
+ Assert.Contains("SOME_TEST_DEFINE", parseOptions.PreprocessorSymbolNames);
+ }
+
+ [Fact]
+ public void Constructor_ConfiguresLanguageVersion()
+ {
+ // Arrange
+ var dependencyContextOptions = GetDependencyContextCompilationOptions(languageVersion: "7.1");
+ var hostingEnvironment = Mock.Of();
+
+ var compiler = new TestCSharpCompiler(ReferenceManager, hostingEnvironment, dependencyContextOptions);
+
+ // Act & Assert
+ var compilationOptions = compiler.ParseOptions;
+ Assert.Equal(LanguageVersion.CSharp7_1, compilationOptions.LanguageVersion);
+ }
+
+
+ [Fact]
+ public void EmitOptions_ReadsDebugTypeFromDependencyContext()
+ {
+ // Arrange
+ var dependencyContextOptions = GetDependencyContextCompilationOptions(debugType: "portable");
+ var hostingEnvironment = Mock.Of();
+
+ var compiler = new TestCSharpCompiler(ReferenceManager, hostingEnvironment, dependencyContextOptions);
+
+ // Act & Assert
+ var emitOptions = compiler.EmitOptions;
+ Assert.Equal(DebugInformationFormat.PortablePdb, emitOptions.DebugInformationFormat);
+ Assert.True(compiler.EmitPdb);
+ }
+
+ [Fact]
+ public void EmitOptions_SetsDebugInformationFormatToPortable_WhenDebugTypeIsEmbedded()
+ {
+ // Arrange
+ var dependencyContextOptions = GetDependencyContextCompilationOptions(debugType: "embedded");
+ var hostingEnvironment = Mock.Of();
+
+ var compiler = new TestCSharpCompiler(ReferenceManager, hostingEnvironment, dependencyContextOptions);
+
+ // Act & Assert
+ var emitOptions = compiler.EmitOptions;
+ Assert.Equal(DebugInformationFormat.PortablePdb, emitOptions.DebugInformationFormat);
+ Assert.True(compiler.EmitPdb);
+ }
+
+ [Fact]
+ public void EmitOptions_DoesNotSetEmitPdb_IfDebugTypeIsNone()
+ {
+ // Arrange
+ var dependencyContextOptions = GetDependencyContextCompilationOptions(debugType: "none");
+ var hostingEnvironment = Mock.Of();
+
+ var compiler = new TestCSharpCompiler(ReferenceManager, hostingEnvironment, dependencyContextOptions);
+
+ // Act & Assert
+ Assert.False(compiler.EmitPdb);
+ }
+
+ [Fact]
+ public void Constructor_ConfiguresAllowUnsafe()
+ {
+ // Arrange
+ var dependencyContextOptions = GetDependencyContextCompilationOptions(allowUnsafe: true);
+ var hostingEnvironment = Mock.Of();
+
+ var compiler = new TestCSharpCompiler(ReferenceManager, hostingEnvironment, dependencyContextOptions);
+
+ // Act & Assert
+ var compilationOptions = compiler.CSharpCompilationOptions;
+ Assert.True(compilationOptions.AllowUnsafe);
+ }
+
+ [Fact]
+ public void Constructor_SetsDiagnosticOption()
+ {
+ // Arrange
+ var dependencyContextOptions = GetDependencyContextCompilationOptions(warningsAsErrors: true);
+ var hostingEnvironment = Mock.Of();
+
+ var compiler = new TestCSharpCompiler(ReferenceManager, hostingEnvironment, dependencyContextOptions);
+
+ // Act & Assert
+ var compilationOptions = compiler.CSharpCompilationOptions;
+ Assert.Equal(ReportDiagnostic.Error, compilationOptions.GeneralDiagnosticOption);
+ }
+
+ [Fact]
+ public void Constructor_SetsOptimizationLevel()
+ {
+ // Arrange
+ var dependencyContextOptions = GetDependencyContextCompilationOptions(optimize: true);
+ var hostingEnvironment = Mock.Of();
+
+ var compiler = new TestCSharpCompiler(ReferenceManager, hostingEnvironment, dependencyContextOptions);
+
+ // Act & Assert
+ var compilationOptions = compiler.CSharpCompilationOptions;
+ Assert.Equal(OptimizationLevel.Release, compilationOptions.OptimizationLevel);
+ }
+
+ [Fact]
+ public void Constructor_SetsDefines()
+ {
+ // Arrange
+ var dependencyContextOptions = GetDependencyContextCompilationOptions("MyDefine");
+ var hostingEnvironment = Mock.Of();
+ var compiler = new TestCSharpCompiler(ReferenceManager, hostingEnvironment, dependencyContextOptions);
+
+ // Act & Assert
+ var parseOptions = compiler.ParseOptions;
+ Assert.Equal(new[] { "MyDefine", "RELEASE" }, parseOptions.PreprocessorSymbolNames);
+ }
+
+ [Fact]
+ public void Compile_UsesApplicationsCompilationSettings_ForParsingAndCompilation()
+ {
+ // Arrange
+ var content = "public class Test {}";
+ var define = "MY_CUSTOM_DEFINE";
+ var dependencyContextOptions = GetDependencyContextCompilationOptions(define);
+ var hostingEnvironment = Mock.Of();
+ var compiler = new TestCSharpCompiler(ReferenceManager, hostingEnvironment, dependencyContextOptions);
+
+ // Act
+ var syntaxTree = compiler.CreateSyntaxTree(SourceText.From(content));
+
+ // Assert
+ Assert.Contains(define, syntaxTree.Options.PreprocessorSymbolNames);
+ }
+
+ private static DependencyContextCompilationOptions GetDependencyContextCompilationOptions(
+ string define = null,
+ string languageVersion = null,
+ string platform = null,
+ bool? allowUnsafe = null,
+ bool? warningsAsErrors = null,
+ bool? optimize = null,
+ string keyFile = null,
+ bool? delaySign = null,
+ bool? publicSign = null,
+ string debugType = null)
+ {
+ return new DependencyContextCompilationOptions(
+ new[] { define },
+ languageVersion,
+ platform,
+ allowUnsafe,
+ warningsAsErrors,
+ optimize,
+ keyFile,
+ delaySign,
+ publicSign,
+ debugType,
+ emitEntryPoint: null,
+ generateXmlDocumentation: null);
+ }
+
+ private class TestCSharpCompiler : CSharpCompiler
+ {
+ private readonly DependencyContextCompilationOptions _options;
+
+ public TestCSharpCompiler(
+ RazorReferenceManager referenceManager,
+ IHostingEnvironment hostingEnvironment,
+ DependencyContextCompilationOptions options)
+ : base(referenceManager, hostingEnvironment)
+ {
+ _options = options;
+ }
+
+ protected internal override DependencyContextCompilationOptions GetDependencyContextCompilationOptions()
+ => _options;
+ }
+ }
+}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/ChecksumValidatorTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/ChecksumValidatorTest.cs
new file mode 100644
index 0000000000..4a37fee2bf
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/ChecksumValidatorTest.cs
@@ -0,0 +1,190 @@
+// 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.Razor.Hosting;
+using Microsoft.AspNetCore.Razor.Language;
+using Xunit;
+using static Microsoft.AspNetCore.Razor.Hosting.TestRazorCompiledItem;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ public class ChecksumValidatorTest
+ {
+ private VirtualRazorProjectFileSystem ProjectFileSystem { get; } = new VirtualRazorProjectFileSystem();
+
+ [Fact]
+ public void IsRecompilationSupported_NoChecksumAttributes_ReturnsFalse()
+ {
+ // Arrange
+ var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[] { });
+
+ // Act
+ var result = ChecksumValidator.IsRecompilationSupported(item);
+
+ // Assert
+ Assert.False(result);
+ }
+
+ [Fact]
+ public void IsRecompilationSupported_NoPrimaryChecksumAttribute_ReturnsFalse()
+ {
+ // Arrange
+ var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
+ });
+
+ // Act
+ var result = ChecksumValidator.IsRecompilationSupported(item);
+
+ // Assert
+ Assert.False(result);
+ }
+
+ [Fact]
+ public void IsRecompilationSupported_HasPrimaryChecksumAttribute_ReturnsTrue()
+ {
+ // Arrange
+ var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Views/Home/Index.cstml"),
+ });
+
+ // Act
+ var result = ChecksumValidator.IsRecompilationSupported(item);
+
+ // Assert
+ Assert.True(result);
+ }
+
+ [Fact]
+ public void IsItemValid_NoChecksumAttributes_ReturnsTrue()
+ {
+ // Arrange
+ var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[] { });
+
+ // Act
+ var result = ChecksumValidator.IsItemValid(ProjectFileSystem, item);
+
+ // Assert
+ Assert.True(result);
+ }
+
+ [Fact]
+ public void IsItemValid_NoPrimaryChecksumAttribute_ReturnsTrue()
+ {
+ // Arrange
+ var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Views/Home/About.cstml"),
+ });
+
+ // Act
+ var result = ChecksumValidator.IsItemValid(ProjectFileSystem, item);
+
+ // Assert
+ Assert.True(result);
+ }
+
+ [Fact]
+ public void IsItemValid_PrimaryFileDoesNotExist_ReturnsTrue()
+ {
+ // Arrange
+ var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Views/Home/Index.cstml"),
+ });
+
+ ProjectFileSystem.Add(new TestRazorProjectItem("/Views/Home/_ViewImports.cstml", "dkdkfkdf")); // This will be ignored
+
+ // Act
+ var result = ChecksumValidator.IsItemValid(ProjectFileSystem, item);
+
+ // Assert
+ Assert.True(result);
+ }
+
+ [Fact]
+ public void IsItemValid_PrimaryFileExistsButDoesNotMatch_ReturnsFalse()
+ {
+ // Arrange
+ var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Views/Home/Index.cstml"),
+ });
+
+ ProjectFileSystem.Add(new TestRazorProjectItem("/Views/Home/Index.cstml", "other content"));
+
+ // Act
+ var result = ChecksumValidator.IsItemValid(ProjectFileSystem, item);
+
+ // Assert
+ Assert.False(result);
+ }
+
+ [Fact]
+ public void IsItemValid_ImportFileDoesNotExist_ReturnsFalse()
+ {
+ // Arrange
+ var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Views/Home/Index.cstml"),
+ });
+
+ ProjectFileSystem.Add(new TestRazorProjectItem("/Views/Home/Index.cstml", "some content"));
+
+ // Act
+ var result = ChecksumValidator.IsItemValid(ProjectFileSystem, item);
+
+ // Assert
+ Assert.False(result);
+ }
+
+ [Fact]
+ public void IsItemValid_ImportFileExistsButDoesNotMatch_ReturnsFalse()
+ {
+ // Arrange
+ var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Views/Home/Index.cstml"),
+ });
+
+ ProjectFileSystem.Add(new TestRazorProjectItem("/Views/Home/Index.cstml", "some content"));
+ ProjectFileSystem.Add(new TestRazorProjectItem("/Views/Home/_ViewImports.cstml", "some other import"));
+
+ // Act
+ var result = ChecksumValidator.IsItemValid(ProjectFileSystem, item);
+
+ // Assert
+ Assert.False(result);
+ }
+
+ [Fact]
+ public void IsItemValid_AllFilesMatch_ReturnsTrue()
+ {
+ // Arrange
+ var item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", "/Views/Home/Index.cstml", new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some other import"), "/Views/_ViewImports.cstml"),
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), "/Views/Home/_ViewImports.cstml"),
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), "/Views/Home/Index.cstml"),
+ });
+
+ ProjectFileSystem.Add(new TestRazorProjectItem("/Views/Home/Index.cstml", "some content"));
+ ProjectFileSystem.Add(new TestRazorProjectItem("/Views/Home/_ViewImports.cstml", "some import"));
+ ProjectFileSystem.Add(new TestRazorProjectItem("/Views/_ViewImports.cstml", "some other import"));
+
+ // Act
+ var result = ChecksumValidator.IsItemValid(ProjectFileSystem, item);
+
+ // Assert
+ Assert.True(result);
+ }
+ }
+}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/CompilerFailedExceptionFactoryTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/CompilerFailedExceptionFactoryTest.cs
new file mode 100644
index 0000000000..6bba1c26e1
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/CompilerFailedExceptionFactoryTest.cs
@@ -0,0 +1,355 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.IO;
+using System.Linq;
+using System.Text;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.Text;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ public class CompilerFailedExceptionFactoryTest
+ {
+ [Fact]
+ public void GetCompilationFailedResult_ReadsRazorErrorsFromPage()
+ {
+ // Arrange
+ var viewPath = "/Views/Home/Index.cshtml";
+
+ var fileSystem = new VirtualRazorProjectFileSystem();
+ var projectItem = new TestRazorProjectItem(viewPath, "");
+
+ var razorEngine = RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem).Engine;
+ var codeDocument = GetCodeDocument(projectItem);
+
+ // Act
+ razorEngine.Process(codeDocument);
+ var csharpDocument = codeDocument.GetCSharpDocument();
+ var compilationResult = CompilationFailedExceptionFactory.Create(codeDocument, csharpDocument.Diagnostics);
+
+ // Assert
+ var failure = Assert.Single(compilationResult.CompilationFailures);
+ Assert.Equal(viewPath, failure.SourceFilePath);
+ Assert.Collection(failure.Messages,
+ message => Assert.StartsWith(
+ @"Unterminated string literal.",
+ message.Message),
+ message => Assert.StartsWith(
+ @"The explicit expression block is missing a closing "")"" character.",
+ message.Message));
+ }
+
+ [Fact]
+ public void GetCompilationFailedResult_WithMissingReferences()
+ {
+ // Arrange
+ var expected = "One or more compilation references may be missing. If you're seeing this in a published application, set 'CopyRefAssembliesToPublishDirectory' to true in your project file to ensure files in the refs directory are published.";
+ var compilation = CSharpCompilation.Create("Test", options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
+ var syntaxTree = CSharpSyntaxTree.ParseText("@class Test { public string Test { get; set; } }");
+ compilation = compilation.AddSyntaxTrees(syntaxTree);
+ var emitResult = compilation.Emit(new MemoryStream());
+
+ // Act
+ var exception = CompilationFailedExceptionFactory.Create(
+ RazorCodeDocument.Create(RazorSourceDocument.Create("Test", "Index.cshtml"), Enumerable.Empty()),
+ syntaxTree.ToString(),
+ "Test",
+ emitResult.Diagnostics);
+
+ // Assert
+ Assert.Collection(
+ exception.CompilationFailures,
+ failure => Assert.Equal(expected, failure.FailureSummary));
+ }
+
+ [Fact]
+ public void GetCompilationFailedResult_UsesPhysicalPath()
+ {
+ // Arrange
+ var viewPath = "/Views/Home/Index.cshtml";
+ var physicalPath = @"x:\myapp\views\home\index.cshtml";
+
+ var projectItem = new TestRazorProjectItem(viewPath, "", physicalPath: physicalPath);
+
+ var codeDocument = GetCodeDocument(projectItem);
+ var csharpDocument = codeDocument.GetCSharpDocument();
+
+ // Act
+ var compilationResult = CompilationFailedExceptionFactory.Create(codeDocument, csharpDocument.Diagnostics);
+
+ // Assert
+ var failure = Assert.Single(compilationResult.CompilationFailures);
+ Assert.Equal(physicalPath, failure.SourceFilePath);
+ }
+
+ [Fact]
+ public void GetCompilationFailedResult_ReadsContentFromSourceDocuments()
+ {
+ // Arrange
+ var viewPath = "/Views/Home/Index.cshtml";
+ var fileContent =
+@"
+@if (User.IsAdmin)
+{
+
+}
+ ";
+
+ var projectItem = new TestRazorProjectItem(viewPath, fileContent);
+ var codeDocument = GetCodeDocument(projectItem);
+ var csharpDocument = codeDocument.GetCSharpDocument();
+
+ // Act
+ var compilationResult = CompilationFailedExceptionFactory.Create(codeDocument, csharpDocument.Diagnostics);
+
+ // Assert
+ var failure = Assert.Single(compilationResult.CompilationFailures);
+ Assert.Equal(fileContent, failure.SourceFileContent);
+ }
+
+ [Fact]
+ public void GetCompilationFailedResult_ReadsContentFromImports()
+ {
+ // Arrange
+ var viewPath = "/Views/Home/Index.cshtml";
+ var importsPath = "/Views/_MyImports.cshtml";
+ var fileContent = "@ ";
+ var importsContent = "@(abc";
+
+ var projectItem = new TestRazorProjectItem(viewPath, fileContent);
+ var importsItem = new TestRazorProjectItem(importsPath, importsContent);
+ var codeDocument = GetCodeDocument(projectItem, importsItem);
+ var csharpDocument = codeDocument.GetCSharpDocument();
+
+ // Act
+ var compilationResult = CompilationFailedExceptionFactory.Create(codeDocument, csharpDocument.Diagnostics);
+
+ // Assert
+ Assert.Collection(
+ compilationResult.CompilationFailures,
+ failure =>
+ {
+ Assert.Equal(viewPath, failure.SourceFilePath);
+ Assert.Collection(failure.Messages,
+ message =>
+ {
+ Assert.Equal(@"A space or line break was encountered after the ""@"" character. Only valid identifiers, keywords, comments, ""("" and ""{"" are valid at the start of a code block and they must occur immediately following ""@"" with no space in between.",
+ message.Message);
+ });
+ },
+ failure =>
+ {
+ Assert.Equal(importsPath, failure.SourceFilePath);
+ Assert.Collection(failure.Messages,
+ message =>
+ {
+ Assert.Equal(@"The explicit expression block is missing a closing "")"" character. Make sure you have a matching "")"" character for all the ""("" characters within this block, and that none of the "")"" characters are being interpreted as markup.",
+ message.Message);
+ });
+ });
+ }
+
+ [Fact]
+ public void GetCompilationFailedResult_GroupsMessages()
+ {
+ // Arrange
+ var viewPath = "views/index.razor";
+ var viewImportsPath = "views/global.import.cshtml";
+ var codeDocument = RazorCodeDocument.Create(
+ Create(viewPath, "View Content"),
+ new[] { Create(viewImportsPath, "Global Import Content") });
+ var diagnostics = new[]
+ {
+ GetRazorDiagnostic("message-1", new SourceLocation(1, 2, 17), length: 1),
+ GetRazorDiagnostic("message-2", new SourceLocation(viewPath, 1, 4, 6), length: 7),
+ GetRazorDiagnostic("message-3", SourceLocation.Undefined, length: -1),
+ GetRazorDiagnostic("message-4", new SourceLocation(viewImportsPath, 1, 3, 8), length: 4),
+ };
+
+ // Act
+ var result = CompilationFailedExceptionFactory.Create(codeDocument, diagnostics);
+
+ // Assert
+ Assert.Collection(result.CompilationFailures,
+ failure =>
+ {
+ Assert.Equal(viewPath, failure.SourceFilePath);
+ Assert.Equal("View Content", failure.SourceFileContent);
+ Assert.Collection(failure.Messages,
+ message =>
+ {
+ Assert.Equal(diagnostics[0].GetMessage(), message.Message);
+ Assert.Equal(viewPath, message.SourceFilePath);
+ Assert.Equal(3, message.StartLine);
+ Assert.Equal(17, message.StartColumn);
+ Assert.Equal(3, message.EndLine);
+ Assert.Equal(18, message.EndColumn);
+ },
+ message =>
+ {
+ Assert.Equal(diagnostics[1].GetMessage(), message.Message);
+ Assert.Equal(viewPath, message.SourceFilePath);
+ Assert.Equal(5, message.StartLine);
+ Assert.Equal(6, message.StartColumn);
+ Assert.Equal(5, message.EndLine);
+ Assert.Equal(13, message.EndColumn);
+ },
+ message =>
+ {
+ Assert.Equal(diagnostics[2].GetMessage(), message.Message);
+ Assert.Equal(viewPath, message.SourceFilePath);
+ Assert.Equal(0, message.StartLine);
+ Assert.Equal(-1, message.StartColumn);
+ Assert.Equal(0, message.EndLine);
+ Assert.Equal(-2, message.EndColumn);
+ });
+ },
+ failure =>
+ {
+ Assert.Equal(viewImportsPath, failure.SourceFilePath);
+ Assert.Equal("Global Import Content", failure.SourceFileContent);
+ Assert.Collection(failure.Messages,
+ message =>
+ {
+ Assert.Equal(diagnostics[3].GetMessage(), message.Message);
+ Assert.Equal(viewImportsPath, message.SourceFilePath);
+ Assert.Equal(4, message.StartLine);
+ Assert.Equal(8, message.StartColumn);
+ Assert.Equal(4, message.EndLine);
+ Assert.Equal(12, message.EndColumn);
+ });
+ });
+ }
+
+ [Fact]
+ public void GetCompilationFailedResult_ReturnsCompilationResult_WithGroupedMessages()
+ {
+ // Arrange
+ var viewPath = "Views/Home/Index";
+ var generatedCodeFileName = "Generated Code";
+ var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("view-content", viewPath));
+ var assemblyName = "random-assembly-name";
+
+ var diagnostics = new[]
+ {
+ Diagnostic.Create(
+ GetRoslynDiagnostic("message-1"),
+ Location.Create(
+ viewPath,
+ new TextSpan(10, 5),
+ new LinePositionSpan(new LinePosition(10, 1), new LinePosition(10, 2)))),
+ Diagnostic.Create(
+ GetRoslynDiagnostic("message-2"),
+ Location.Create(
+ assemblyName,
+ new TextSpan(1, 6),
+ new LinePositionSpan(new LinePosition(1, 2), new LinePosition(3, 4)))),
+ Diagnostic.Create(
+ GetRoslynDiagnostic("message-3"),
+ Location.Create(
+ viewPath,
+ new TextSpan(40, 50),
+ new LinePositionSpan(new LinePosition(30, 5), new LinePosition(40, 12)))),
+ };
+
+ // Act
+ var compilationResult = CompilationFailedExceptionFactory.Create(
+ codeDocument,
+ "compilation-content",
+ assemblyName,
+ diagnostics);
+
+ // Assert
+ Assert.Collection(compilationResult.CompilationFailures,
+ failure =>
+ {
+ Assert.Equal(viewPath, failure.SourceFilePath);
+ Assert.Equal("view-content", failure.SourceFileContent);
+ Assert.Collection(failure.Messages,
+ message =>
+ {
+ Assert.Equal("message-1", message.Message);
+ Assert.Equal(viewPath, message.SourceFilePath);
+ Assert.Equal(11, message.StartLine);
+ Assert.Equal(2, message.StartColumn);
+ Assert.Equal(11, message.EndLine);
+ Assert.Equal(3, message.EndColumn);
+ },
+ message =>
+ {
+ Assert.Equal("message-3", message.Message);
+ Assert.Equal(viewPath, message.SourceFilePath);
+ Assert.Equal(31, message.StartLine);
+ Assert.Equal(6, message.StartColumn);
+ Assert.Equal(41, message.EndLine);
+ Assert.Equal(13, message.EndColumn);
+ });
+ },
+ failure =>
+ {
+ Assert.Equal(generatedCodeFileName, failure.SourceFilePath);
+ Assert.Equal("compilation-content", failure.SourceFileContent);
+ Assert.Collection(failure.Messages,
+ message =>
+ {
+ Assert.Equal("message-2", message.Message);
+ Assert.Equal(assemblyName, message.SourceFilePath);
+ Assert.Equal(2, message.StartLine);
+ Assert.Equal(3, message.StartColumn);
+ Assert.Equal(4, message.EndLine);
+ Assert.Equal(5, message.EndColumn);
+ });
+ });
+ }
+
+ private static RazorSourceDocument Create(string path, string template)
+ {
+ var stream = new MemoryStream(Encoding.UTF8.GetBytes(template));
+ return RazorSourceDocument.ReadFrom(stream, path);
+ }
+
+ private static RazorDiagnostic GetRazorDiagnostic(string message, SourceLocation sourceLocation, int length)
+ {
+ var diagnosticDescriptor = new RazorDiagnosticDescriptor("test-id", () => message, RazorDiagnosticSeverity.Error);
+ var sourceSpan = new SourceSpan(sourceLocation, length);
+
+ return RazorDiagnostic.Create(diagnosticDescriptor, sourceSpan);
+ }
+
+ private static DiagnosticDescriptor GetRoslynDiagnostic(string messageFormat)
+ {
+ return new DiagnosticDescriptor(
+ id: "someid",
+ title: "sometitle",
+ messageFormat: messageFormat,
+ category: "some-category",
+ defaultSeverity: DiagnosticSeverity.Error,
+ isEnabledByDefault: true);
+ }
+
+ private static RazorCodeDocument GetCodeDocument(TestRazorProjectItem projectItem, TestRazorProjectItem imports = null)
+ {
+ var sourceDocument = RazorSourceDocument.ReadFrom(projectItem);
+ var fileSystem = new VirtualRazorProjectFileSystem();
+ fileSystem.Add(projectItem);
+
+ var codeDocument = RazorCodeDocument.Create(sourceDocument);
+
+ if (imports != null)
+ {
+ fileSystem.Add(imports);
+ codeDocument = RazorCodeDocument.Create(sourceDocument, new[] { RazorSourceDocument.ReadFrom(imports) });
+ }
+
+ var razorEngine = RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem).Engine;
+
+ razorEngine.Process(codeDocument);
+ return codeDocument;
+ }
+
+ }
+}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/DependencyInjection/RazorRuntimeCompilationMvcCoreBuilderExtensionsTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/DependencyInjection/RazorRuntimeCompilationMvcCoreBuilderExtensionsTest.cs
new file mode 100644
index 0000000000..f74cfb8bf0
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/DependencyInjection/RazorRuntimeCompilationMvcCoreBuilderExtensionsTest.cs
@@ -0,0 +1,27 @@
+// 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.Razor.Compilation;
+using Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
+using Xunit;
+
+namespace Microsoft.Extensions.DependencyInjection
+{
+ public class RazorRuntimeCompilationMvcCoreBuilderExtensionsTest
+ {
+ [Fact]
+ public void AddServices_ReplacesRazorViewCompiler()
+ {
+ // Arrange
+ var services = new ServiceCollection()
+ .AddSingleton();
+
+ // Act
+ RazorRuntimeCompilationMvcCoreBuilderExtensions.AddServices(services);
+
+ // Assert
+ var serviceDescriptor = Assert.Single(services, service => service.ServiceType == typeof(IViewCompilerProvider));
+ Assert.Equal(typeof(RuntimeViewCompilerProvider), serviceDescriptor.ImplementationType);
+ }
+ }
+}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/FileProviderRazorProjectFileSystemTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/FileProviderRazorProjectFileSystemTest.cs
new file mode 100644
index 0000000000..94abf8068a
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/FileProviderRazorProjectFileSystemTest.cs
@@ -0,0 +1,260 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.IO;
+using System.Linq;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.FileProviders;
+using Microsoft.Extensions.Options;
+using Moq;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ public class FileProviderRazorProjectFileSystemTest
+ {
+ [Fact]
+ public void EnumerateFiles_ReturnsEmptySequenceIfNoCshtmlFilesArePresent()
+ {
+ // Arrange
+ var fileProvider = new TestFileProvider("BasePath");
+ var file1 = fileProvider.AddFile("/File1.txt", "content");
+ var file2 = fileProvider.AddFile("/File2.js", "content");
+ fileProvider.AddDirectoryContent("/", new IFileInfo[] { file1, file2 });
+
+ var fileSystem = GetRazorProjectFileSystem(fileProvider);
+
+ // Act
+ var razorFiles = fileSystem.EnumerateItems("/");
+
+ // Assert
+ Assert.Empty(razorFiles);
+ }
+
+ [Fact]
+ public void EnumerateFiles_ReturnsCshtmlFiles()
+ {
+ // Arrange
+ var fileProvider = new TestFileProvider("BasePath");
+ var file1 = fileProvider.AddFile("/File1.cshtml", "content");
+ var file2 = fileProvider.AddFile("/File2.js", "content");
+ var file3 = fileProvider.AddFile("/File3.cshtml", "content");
+ fileProvider.AddDirectoryContent("/", new IFileInfo[] { file1, file2, file3 });
+
+ var fileSystem = GetRazorProjectFileSystem(fileProvider);
+
+ // Act
+ var razorFiles = fileSystem.EnumerateItems("/");
+
+ // Assert
+ Assert.Collection(
+ razorFiles.OrderBy(f => f.FilePath),
+ file =>
+ {
+ Assert.Equal("/File1.cshtml", file.FilePath);
+ Assert.Equal("/", file.BasePath);
+ Assert.Equal(Path.Combine("BasePath", "File1.cshtml"), file.PhysicalPath);
+ Assert.Equal("File1.cshtml", file.RelativePhysicalPath);
+ },
+ file =>
+ {
+ Assert.Equal("/File3.cshtml", file.FilePath);
+ Assert.Equal("/", file.BasePath);
+ Assert.Equal(Path.Combine("BasePath", "File3.cshtml"), file.PhysicalPath);
+ Assert.Equal("File3.cshtml", file.RelativePhysicalPath);
+ });
+ }
+
+ [Fact]
+ public void EnumerateFiles_IteratesOverAllCshtmlUnderRoot()
+ {
+ // Arrange
+ var fileProvider = new TestFileProvider("BasePath");
+ var directory1 = new TestDirectoryFileInfo
+ {
+ Name = "Level1-Dir1",
+ };
+ var file1 = fileProvider.AddFile("File1.cshtml", "content");
+ var directory2 = new TestDirectoryFileInfo
+ {
+ Name = "Level1-Dir2",
+ };
+ fileProvider.AddDirectoryContent("/", new IFileInfo[] { directory1, file1, directory2 });
+
+ var file2 = fileProvider.AddFile("/Level1-Dir1/File2.cshtml", "content");
+ var file3 = fileProvider.AddFile("/Level1-Dir1/File3.cshtml", "content");
+ var file4 = fileProvider.AddFile("/Level1-Dir1/File4.txt", "content");
+ var directory3 = new TestDirectoryFileInfo
+ {
+ Name = "Level2-Dir1"
+ };
+ fileProvider.AddDirectoryContent("/Level1-Dir1", new IFileInfo[] { file2, directory3, file3, file4 });
+ var file5 = fileProvider.AddFile(Path.Combine("Level1-Dir2", "File5.cshtml"), "content");
+ fileProvider.AddDirectoryContent("/Level1-Dir2", new IFileInfo[] { file5 });
+ fileProvider.AddDirectoryContent("/Level1/Level2", new IFileInfo[0]);
+
+ var fileSystem = GetRazorProjectFileSystem(fileProvider);
+
+ // Act
+ var razorFiles = fileSystem.EnumerateItems("/");
+
+ // Assert
+ Assert.Collection(razorFiles.OrderBy(f => f.FilePath),
+ file =>
+ {
+ Assert.Equal("/File1.cshtml", file.FilePath);
+ Assert.Equal("/", file.BasePath);
+ Assert.Equal(Path.Combine("BasePath", "File1.cshtml"), file.PhysicalPath);
+ Assert.Equal("File1.cshtml", file.RelativePhysicalPath);
+ },
+ file =>
+ {
+ Assert.Equal("/Level1-Dir1/File2.cshtml", file.FilePath);
+ Assert.Equal("/", file.BasePath);
+ Assert.Equal(Path.Combine("BasePath", "Level1-Dir1", "File2.cshtml"), file.PhysicalPath);
+ Assert.Equal(Path.Combine("Level1-Dir1", "File2.cshtml"), file.RelativePhysicalPath);
+ },
+ file =>
+ {
+ Assert.Equal("/Level1-Dir1/File3.cshtml", file.FilePath);
+ Assert.Equal("/", file.BasePath);
+ Assert.Equal(Path.Combine("BasePath", "Level1-Dir1", "File3.cshtml"), file.PhysicalPath);
+ Assert.Equal(Path.Combine("Level1-Dir1", "File3.cshtml"), file.RelativePhysicalPath);
+ },
+ file =>
+ {
+ Assert.Equal("/Level1-Dir2/File5.cshtml", file.FilePath);
+ Assert.Equal("/", file.BasePath);
+ Assert.Equal(Path.Combine("BasePath", "Level1-Dir2", "File5.cshtml"), file.PhysicalPath);
+ Assert.Equal(Path.Combine("Level1-Dir2", "File5.cshtml"), file.RelativePhysicalPath);
+ });
+ }
+
+ [Fact]
+ public void EnumerateFiles_IteratesOverAllCshtmlUnderPath()
+ {
+ // Arrange
+ var fileProvider = new TestFileProvider("BasePath");
+ var directory1 = new TestDirectoryFileInfo
+ {
+ Name = "Level1-Dir1",
+ };
+ var file1 = fileProvider.AddFile("/File1.cshtml", "content");
+ var directory2 = new TestDirectoryFileInfo
+ {
+ Name = "Level1-Dir2",
+ };
+ fileProvider.AddDirectoryContent("/", new IFileInfo[] { directory1, file1, directory2 });
+
+ var file2 = fileProvider.AddFile("/Level1-Dir1/File2.cshtml", "content");
+ var file3 = fileProvider.AddFile("/Level1-Dir1/File3.cshtml", "content");
+ var file4 = fileProvider.AddFile("/Level1-Dir1/File4.txt", "content");
+ var directory3 = new TestDirectoryFileInfo
+ {
+ Name = "Level2-Dir1"
+ };
+ fileProvider.AddDirectoryContent("/Level1-Dir1", new IFileInfo[] { file2, directory3, file3, file4 });
+ var file5 = fileProvider.AddFile(Path.Combine("Level1-Dir2", "File5.cshtml"), "content");
+ fileProvider.AddDirectoryContent("/Level1-Dir2", new IFileInfo[] { file5 });
+ fileProvider.AddDirectoryContent("/Level1/Level2", new IFileInfo[0]);
+
+ var fileSystem = GetRazorProjectFileSystem(fileProvider);
+
+ // Act
+ var razorFiles = fileSystem.EnumerateItems("/Level1-Dir1");
+
+ // Assert
+ Assert.Collection(razorFiles.OrderBy(f => f.FilePath),
+ file =>
+ {
+ Assert.Equal("/File2.cshtml", file.FilePath);
+ Assert.Equal("/Level1-Dir1", file.BasePath);
+ Assert.Equal(Path.Combine("BasePath", "Level1-Dir1", "File2.cshtml"), file.PhysicalPath);
+ Assert.Equal(Path.Combine("Level1-Dir1", "File2.cshtml"), file.RelativePhysicalPath);
+ },
+ file =>
+ {
+ Assert.Equal("/File3.cshtml", file.FilePath);
+ Assert.Equal("/Level1-Dir1", file.BasePath);
+ Assert.Equal(Path.Combine("BasePath", "Level1-Dir1", "File3.cshtml"), file.PhysicalPath);
+ Assert.Equal(Path.Combine("Level1-Dir1", "File3.cshtml"), file.RelativePhysicalPath);
+ });
+ }
+
+ [Fact]
+ public void GetItem_ReturnsFileFromDisk()
+ {
+ var fileProvider = new TestFileProvider("BasePath");
+ var file1 = fileProvider.AddFile("/File1.cshtml", "content");
+ var file2 = fileProvider.AddFile("/File2.js", "content");
+ var file3 = fileProvider.AddFile("/File3.cshtml", "content");
+ fileProvider.AddDirectoryContent("/", new IFileInfo[] { file1, file2, file3 });
+
+ var fileSystem = GetRazorProjectFileSystem(fileProvider);
+
+ // Act
+ var item = fileSystem.GetItem("/File3.cshtml");
+
+ // Assert
+ Assert.True(item.Exists);
+ Assert.Equal("/File3.cshtml", item.FilePath);
+ Assert.Equal(string.Empty, item.BasePath);
+ Assert.Equal(Path.Combine("BasePath", "File3.cshtml"), item.PhysicalPath);
+ Assert.Equal("File3.cshtml", item.RelativePhysicalPath);
+ }
+
+ [Fact]
+ public void GetItem_PhysicalPathDoesNotStartWithContentRoot_ReturnsNull()
+ {
+ var fileProvider = new TestFileProvider("BasePath2");
+ var file1 = fileProvider.AddFile("/File1.cshtml", "content");
+ var file2 = fileProvider.AddFile("/File2.js", "content");
+ var file3 = fileProvider.AddFile("/File3.cshtml", "content");
+ fileProvider.AddDirectoryContent("/", new IFileInfo[] { file1, file2, file3 });
+
+ var fileSystem = GetRazorProjectFileSystem(fileProvider);
+
+ // Act
+ var item = fileSystem.GetItem("/File3.cshtml");
+
+ // Assert
+ Assert.True(item.Exists);
+ Assert.Equal("/File3.cshtml", item.FilePath);
+ Assert.Equal(string.Empty, item.BasePath);
+ Assert.Equal(Path.Combine("BasePath2", "File3.cshtml"), item.PhysicalPath);
+ Assert.Null(item.RelativePhysicalPath);
+ }
+
+ [Fact]
+ public void GetItem_ReturnsNotFoundResult()
+ {
+ // Arrange
+ var fileProvider = new TestFileProvider("BasePath");
+ var file = fileProvider.AddFile("/SomeFile.cshtml", "content");
+ fileProvider.AddDirectoryContent("/", new IFileInfo[] { file });
+
+ var fileSystem = GetRazorProjectFileSystem(fileProvider);
+
+ // Act
+ var item = fileSystem.GetItem("/NotFound.cshtml");
+
+ // Assert
+ Assert.False(item.Exists);
+ }
+
+ private static FileProviderRazorProjectFileSystem GetRazorProjectFileSystem(
+ TestFileProvider fileProvider,
+ string contentRootPath = "BasePath")
+ {
+ var options = Options.Create(new MvcRazorRuntimeCompilationOptions
+ {
+ FileProviders = { fileProvider }
+ });
+ var compilationFileProvider = new RuntimeCompilationFileProvider(options);
+ var fileSystem = new FileProviderRazorProjectFileSystem(
+ compilationFileProvider,
+ Mock.Of(e => e.ContentRootPath == contentRootPath));
+ return fileSystem;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test.csproj b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test.csproj
new file mode 100644
index 0000000000..70b0187a85
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test.csproj
@@ -0,0 +1,13 @@
+
+
+
+ netcoreapp3.0
+ true
+
+
+
+
+
+
+
+
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/RazorReferenceManagerTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/RazorReferenceManagerTest.cs
new file mode 100644
index 0000000000..e28e974162
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/RazorReferenceManagerTest.cs
@@ -0,0 +1,52 @@
+// 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.Linq;
+using Microsoft.AspNetCore.Mvc.ApplicationParts;
+using Microsoft.Extensions.Options;
+using Moq;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ public class RazorReferenceManagerTest
+ {
+ private static readonly string ApplicationPartReferencePath = "some-path";
+
+ [Fact]
+ public void GetCompilationReferences_CombinesApplicationPartAndOptionMetadataReferences()
+ {
+ // Arrange
+ var options = new MvcRazorRuntimeCompilationOptions();
+ var additionalReferencePath = "additional-path";
+ options.AdditionalReferencePaths.Add(additionalReferencePath);
+
+ var applicationPartManager = GetApplicationPartManager();
+ var referenceManager = new RazorReferenceManager(
+ applicationPartManager,
+ Options.Create(options));
+
+ var expected = new[] { ApplicationPartReferencePath, additionalReferencePath };
+
+ // Act
+ var references = referenceManager.GetReferencePaths();
+
+ // Assert
+ Assert.Equal(expected, references);
+ }
+
+ private static ApplicationPartManager GetApplicationPartManager()
+ {
+ var applicationPartManager = new ApplicationPartManager();
+ var part = new Mock();
+
+ part.As()
+ .Setup(p => p.GetReferencePaths())
+ .Returns(new[] { ApplicationPartReferencePath });
+
+ applicationPartManager.ApplicationParts.Add(part.Object);
+
+ return applicationPartManager;
+ }
+ }
+}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/RuntimeCompilationFileProviderTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/RuntimeCompilationFileProviderTest.cs
new file mode 100644
index 0000000000..61b9b22290
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/RuntimeCompilationFileProviderTest.cs
@@ -0,0 +1,31 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using Microsoft.Extensions.FileProviders;
+using Microsoft.Extensions.Options;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ public class RuntimeCompilationFileProviderTest
+ {
+ [Fact]
+ public void GetFileProvider_ThrowsIfNoConfiguredFileProviders()
+ {
+ // Arrange
+ var expected =
+ $"'{typeof(MvcRazorRuntimeCompilationOptions).FullName}.{nameof(MvcRazorRuntimeCompilationOptions.FileProviders)}' must " +
+ $"not be empty. At least one '{typeof(IFileProvider).FullName}' is required to locate a view for " +
+ "rendering.";
+ var options = Options.Create(new MvcRazorRuntimeCompilationOptions());
+
+ var fileProvider = new RuntimeCompilationFileProvider(options);
+
+ // Act & Assert
+ var exception = Assert.Throws(
+ () => fileProvider.FileProvider);
+ Assert.Equal(expected, exception.Message);
+ }
+ }
+}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/RuntimeViewCompilerTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/RuntimeViewCompilerTest.cs
new file mode 100644
index 0000000000..5ac9e61bed
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/RuntimeViewCompilerTest.cs
@@ -0,0 +1,908 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Mvc.ApplicationParts;
+using Microsoft.AspNetCore.Mvc.Razor.Compilation;
+using Microsoft.AspNetCore.Mvc.Razor.Extensions;
+using Microsoft.AspNetCore.Razor.Hosting;
+using Microsoft.AspNetCore.Razor.Language;
+using Microsoft.CodeAnalysis.Emit;
+using Microsoft.Extensions.FileProviders;
+using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Options;
+using Moq;
+using Xunit;
+using static Microsoft.AspNetCore.Razor.Hosting.TestRazorCompiledItem;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ public class RuntimeViewCompilerTest
+ {
+ [Fact]
+ public async Task CompileAsync_ReturnsResultWithNullAttribute_IfFileIsNotFoundInFileSystem()
+ {
+ // Arrange
+ var path = "/file/does-not-exist";
+ var fileProvider = new TestFileProvider();
+ var viewCompiler = GetViewCompiler(fileProvider);
+
+ // Act
+ var result1 = await viewCompiler.CompileAsync(path);
+ var result2 = await viewCompiler.CompileAsync(path);
+
+ // Assert
+ Assert.Same(result1, result2);
+ Assert.Null(result1.Item);
+ var token = Assert.Single(result1.ExpirationTokens);
+ Assert.Same(fileProvider.GetChangeToken(path), token);
+ }
+
+ [Fact]
+ public async Task CompileAsync_ReturnsResultWithExpirationToken()
+ {
+ // Arrange
+ var path = "/file/does-not-exist";
+ var fileProvider = new TestFileProvider();
+ var viewCompiler = GetViewCompiler(fileProvider);
+
+ // Act
+ var result1 = await viewCompiler.CompileAsync(path);
+ var result2 = await viewCompiler.CompileAsync(path);
+
+ // Assert
+ Assert.Same(result1, result2);
+ Assert.Null(result1.Item);
+ Assert.Collection(
+ result1.ExpirationTokens,
+ token => Assert.Equal(fileProvider.GetChangeToken(path), token));
+ }
+
+ [Fact]
+ public async Task CompileAsync_AddsChangeTokensForViewStartsIfFileExists()
+ {
+ // Arrange
+ var path = "/file/exists/FilePath.cshtml";
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+ var viewCompiler = GetViewCompiler(fileProvider);
+
+ // Act
+ var result = await viewCompiler.CompileAsync(path);
+
+ // Assert
+ Assert.NotNull(result.Item);
+ Assert.Collection(
+ result.ExpirationTokens,
+ token => Assert.Same(fileProvider.GetChangeToken(path), token),
+ token => Assert.Same(fileProvider.GetChangeToken("/_ViewImports.cshtml"), token),
+ token => Assert.Same(fileProvider.GetChangeToken("/file/_ViewImports.cshtml"), token),
+ token => Assert.Same(fileProvider.GetChangeToken("/file/exists/_ViewImports.cshtml"), token));
+ }
+
+ [Theory]
+ [InlineData("/Areas/Finances/Views/Home/Index.cshtml")]
+ [InlineData(@"Areas\Finances\Views\Home\Index.cshtml")]
+ [InlineData(@"\Areas\Finances\Views\Home\Index.cshtml")]
+ [InlineData(@"\Areas\Finances\Views/Home\Index.cshtml")]
+ public async Task CompileAsync_NormalizesPathSeparatorForPaths(string relativePath)
+ {
+ // Arrange
+ var viewPath = "/Areas/Finances/Views/Home/Index.cshtml";
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(viewPath, "some content");
+ var viewCompiler = GetViewCompiler(fileProvider);
+
+ // Act - 1
+ var result1 = await viewCompiler.CompileAsync(@"Areas\Finances\Views\Home\Index.cshtml");
+
+ // Act - 2
+ viewCompiler.Compile = _ => throw new Exception("Can't call me");
+ var result2 = await viewCompiler.CompileAsync(relativePath);
+
+ // Assert - 2
+ Assert.Same(result1, result2);
+ }
+
+ [Fact]
+ public async Task CompileAsync_InvalidatesCache_IfChangeTokenExpires()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+ var fileProvider = new TestFileProvider();
+ var fileNode = fileProvider.AddFile(path, "some content");
+ var viewCompiler = GetViewCompiler(fileProvider);
+
+ // Act 1
+ var result1 = await viewCompiler.CompileAsync(path);
+
+ // Assert 1
+ Assert.NotNull(result1.Item);
+
+ // Act 2
+ // Simulate deleting the file
+ fileProvider.GetChangeToken(path).HasChanged = true;
+ fileProvider.DeleteFile(path);
+
+ viewCompiler.Compile = _ => throw new Exception("Can't call me");
+ var result2 = await viewCompiler.CompileAsync(path);
+
+ // Assert 2
+ Assert.NotSame(result1, result2);
+ Assert.Null(result2.Item);
+ }
+
+ [Fact]
+ public async Task CompileAsync_ReturnsNewResultIfFileWasModified()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+ var viewCompiler = GetViewCompiler(fileProvider);
+ var expected2 = new CompiledViewDescriptor();
+
+ // Act 1
+ var result1 = await viewCompiler.CompileAsync(path);
+
+ // Assert 1
+ Assert.NotNull(result1.Item);
+
+ // Act 2
+ fileProvider.GetChangeToken(path).HasChanged = true;
+ viewCompiler.Compile = _ => expected2;
+ var result2 = await viewCompiler.CompileAsync(path);
+
+ // Assert 2
+ Assert.NotSame(result1, result2);
+ Assert.Same(expected2, result2);
+ }
+
+ [Fact]
+ public async Task CompileAsync_ReturnsNewResult_IfAncestorViewImportsWereModified()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+ var viewCompiler = GetViewCompiler(fileProvider);
+ var expected2 = new CompiledViewDescriptor();
+
+ // Act 1
+ var result1 = await viewCompiler.CompileAsync(path);
+
+ // Assert 1
+ Assert.NotNull(result1.Item);
+
+ // Act 2
+ fileProvider.GetChangeToken("/Views/_ViewImports.cshtml").HasChanged = true;
+ viewCompiler.Compile = _ => expected2;
+ var result2 = await viewCompiler.CompileAsync(path);
+
+ // Assert 2
+ Assert.NotSame(result1, result2);
+ Assert.Same(expected2, result2);
+ }
+
+ [Fact]
+ public async Task CompileAsync_ReturnsPrecompiledViews()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ };
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+
+ // Act
+ var result = await viewCompiler.CompileAsync(path);
+
+ // Assert
+ Assert.Same(precompiledView, result);
+
+ // This view doesn't have checksums so it can't be recompiled.
+ Assert.Null(precompiledView.ExpirationTokens);
+ }
+
+ [Theory]
+ [InlineData("/views/home/index.cshtml")]
+ [InlineData("/VIEWS/HOME/INDEX.CSHTML")]
+ [InlineData("/viEws/HoME/inDex.cshtml")]
+ public async Task CompileAsync_PerformsCaseInsensitiveLookupsForPrecompiledViews(string lookupPath)
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ };
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+
+ // Act
+ var result = await viewCompiler.CompileAsync(lookupPath);
+
+ // Assert
+ Assert.Same(precompiledView, result);
+ }
+
+ [Fact]
+ public async Task CompileAsync_PerformsCaseInsensitiveLookupsForPrecompiledViews_WithNonNormalizedPaths()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ };
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+
+ // Act
+ var result = await viewCompiler.CompileAsync("Views\\Home\\Index.cshtml");
+
+ // Assert
+ Assert.Same(precompiledView, result);
+ }
+
+ [Fact]
+ public async Task CompileAsync_PrecompiledViewWithoutChecksumForMainSource_DoesNotSupportRecompilation()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ Item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", path, new object[]
+ {
+ new RazorSourceChecksumAttribute("sha1", GetChecksum("some content"), "/Views/Some-Other-View"),
+ }),
+ };
+
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+
+ // Act - 1
+ var result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 1
+ Assert.Same(precompiledView.Item, result.Item);
+
+ // Act - 2
+ fileProvider.Watch(path);
+ fileProvider.GetChangeToken(path).HasChanged = true;
+ result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 2
+ Assert.Same(precompiledView.Item, result.Item);
+
+ // This view doesn't have checksums so it can't be recompiled.
+ Assert.Null(result.ExpirationTokens);
+ }
+
+ [Fact]
+ public async Task CompileAsync_PrecompiledViewWithoutAnyChecksum_DoesNotSupportRecompilation()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ Item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", path, new object[] { }),
+ };
+
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+
+ // Act - 1
+ var result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 1
+ Assert.Same(precompiledView, result);
+
+ // Act - 2
+ fileProvider.Watch(path);
+ fileProvider.GetChangeToken(path).HasChanged = true;
+ result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 2
+ Assert.Same(precompiledView, result);
+
+ // This view doesn't have checksums so it can't be recompiled.
+ Assert.Null(result.ExpirationTokens);
+ }
+
+ [Fact]
+ public async Task CompileAsync_PrecompiledViewWithChecksum_UsesPrecompiledViewWhenChecksumIsMatch()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ Item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", path, new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), path),
+ }),
+ };
+
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+
+ // Act
+ var result = await viewCompiler.CompileAsync(path);
+
+ // Assert
+ Assert.Same(precompiledView.Item, result.Item);
+
+ // This view has checksums so it should also have tokens
+ Assert.Collection(
+ result.ExpirationTokens,
+ token => Assert.Same(fileProvider.GetChangeToken(path), token));
+ }
+
+ [Fact]
+ public async Task CompileAsync_PrecompiledViewWithChecksum_CanRejectWhenChecksumFails()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+
+ var expected = new CompiledViewDescriptor();
+
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ Item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", path, new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some other content"), path),
+ }),
+ };
+
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+ viewCompiler.Compile = _ => expected;
+
+ // Act
+ var result = await viewCompiler.CompileAsync(path);
+
+ // Assert
+ Assert.Same(expected, result);
+ }
+
+ [Fact]
+ public async Task CompileAsync_PrecompiledViewWithChecksum_AddsExpirationTokensForFilesInChecksumAttributes()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ Item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", path, new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), path),
+ }),
+ };
+
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+
+ // Act
+ var result = await viewCompiler.CompileAsync(path);
+
+ // Assert
+ Assert.Same(precompiledView.Item, result.Item);
+ var token = Assert.Single(result.ExpirationTokens);
+ Assert.Same(fileProvider.GetChangeToken(path), token);
+ }
+
+ [Fact]
+ public async Task CompileAsync_PrecompiledViewWithChecksum_CanRecompile()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+
+ var fileProvider = new TestFileProvider();
+ var file = fileProvider.AddFile(path, "some content");
+ var expected2 = new CompiledViewDescriptor();
+
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ Item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", path, new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), path),
+ }),
+ };
+
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+
+ // Act - 1
+ var result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 1
+ Assert.Same(precompiledView.Item, result.Item);
+ Assert.NotEmpty(result.ExpirationTokens);
+
+ // Act - 2
+ file.Content = "different";
+ fileProvider.GetChangeToken(path).HasChanged = true;
+ viewCompiler.Compile = _ => expected2;
+ result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 2
+ Assert.Same(expected2, result);
+ }
+
+ [Fact]
+ public async Task CompileAsync_PrecompiledViewWithChecksum_DoesNotRecompiledWithoutContentChange()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ Item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", path, new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), path),
+ }),
+ };
+
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+
+ // Act - 1
+ var result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 1
+ Assert.Same(precompiledView.Item, result.Item);
+
+ // Act - 2
+ fileProvider.GetChangeToken(path).HasChanged = true;
+ result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 2
+ Assert.Same(precompiledView.Item, result.Item);
+ }
+
+ [Fact]
+ public async Task CompileAsync_PrecompiledViewWithChecksum_CanReusePrecompiledViewIfContentChangesToMatch()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+
+ var fileProvider = new TestFileProvider();
+ var file = fileProvider.AddFile(path, "different content");
+
+ var expected1 = new CompiledViewDescriptor();
+
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ Item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", path, new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), path),
+ }),
+ };
+
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+ viewCompiler.Compile = _ => expected1;
+
+ // Act - 1
+ var result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 1
+ Assert.Same(expected1, result);
+
+ // Act - 2
+ file.Content = "some content";
+ fileProvider.GetChangeToken(path).HasChanged = true;
+ result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 2
+ Assert.Same(precompiledView.Item, result.Item);
+ }
+
+ [Fact]
+ public async Task CompileAsync_PrecompiledViewWithChecksum_CanRecompileWhenViewImportChanges()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+ var importPath = "/Views/_ViewImports.cshtml";
+
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+ var importFile = fileProvider.AddFile(importPath, "some import");
+
+ var expected2 = new CompiledViewDescriptor();
+
+ var precompiledView = new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ Item = new TestRazorCompiledItem(typeof(string), "mvc.1.0.view", path, new object[]
+ {
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some content"), path),
+ new RazorSourceChecksumAttribute("SHA1", GetChecksum("some import"), importPath),
+ }),
+ };
+
+ var viewCompiler = GetViewCompiler(fileProvider, precompiledViews: new[] { precompiledView });
+
+ // Act - 1
+ var result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 1
+ Assert.Same(precompiledView.Item, result.Item);
+
+ // Act - 2
+ importFile.Content = "different content";
+ fileProvider.GetChangeToken(importPath).HasChanged = true;
+ viewCompiler.Compile = _ => expected2;
+ result = await viewCompiler.CompileAsync(path);
+
+ // Assert - 2
+ Assert.Same(expected2, result);
+ }
+
+ [Fact]
+ public async Task GetOrAdd_AllowsConcurrentCompilationOfMultipleRazorPages()
+ {
+ // Arrange
+ var path1 = "/Views/Home/Index.cshtml";
+ var path2 = "/Views/Home/About.cshtml";
+ var waitDuration = TimeSpan.FromSeconds(20);
+
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path1, "some content");
+ fileProvider.AddFile(path2, "some content");
+
+ var resetEvent1 = new AutoResetEvent(initialState: false);
+ var resetEvent2 = new ManualResetEvent(initialState: false);
+
+ var compilingOne = false;
+ var compilingTwo = false;
+
+ var result1 = new CompiledViewDescriptor();
+ var result2 = new CompiledViewDescriptor();
+
+ var compiler = GetViewCompiler(fileProvider);
+
+ compiler.Compile = path =>
+ {
+ if (path == path1)
+ {
+ compilingOne = true;
+
+ // Event 2
+ Assert.True(resetEvent1.WaitOne(waitDuration));
+
+ // Event 3
+ Assert.True(resetEvent2.Set());
+
+ // Event 6
+ Assert.True(resetEvent1.WaitOne(waitDuration));
+
+ Assert.True(compilingTwo);
+
+ return result1;
+ }
+ else if (path == path2)
+ {
+ compilingTwo = true;
+
+ // Event 4
+ Assert.True(resetEvent2.WaitOne(waitDuration));
+
+ // Event 5
+ Assert.True(resetEvent1.Set());
+
+ Assert.True(compilingOne);
+
+ return result2;
+ }
+ else
+ {
+ throw new Exception();
+ }
+ };
+
+ // Act
+ var task1 = Task.Run(() => compiler.CompileAsync(path1));
+ var task2 = Task.Run(() => compiler.CompileAsync(path2));
+
+ // Event 1
+ resetEvent1.Set();
+
+ await Task.WhenAll(task1, task2);
+
+ // Assert
+ Assert.True(compilingOne);
+ Assert.True(compilingTwo);
+ Assert.Same(result1, task1.Result);
+ Assert.Same(result2, task2.Result);
+ }
+
+ [Fact]
+ public async Task CompileAsync_DoesNotCreateMultipleCompilationResults_ForConcurrentInvocations()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+ var waitDuration = TimeSpan.FromSeconds(20);
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+ var resetEvent1 = new ManualResetEvent(initialState: false);
+ var resetEvent2 = new ManualResetEvent(initialState: false);
+ var compiler = GetViewCompiler(fileProvider);
+
+ compiler.Compile = _ =>
+ {
+ // Event 2
+ resetEvent1.WaitOne(waitDuration);
+
+ // Event 3
+ resetEvent2.Set();
+ return new CompiledViewDescriptor();
+ };
+
+ // Act
+ var task1 = Task.Run(() => compiler.CompileAsync(path));
+ var task2 = Task.Run(() =>
+ {
+ // Event 4
+ Assert.True(resetEvent2.WaitOne(waitDuration));
+ return compiler.CompileAsync(path);
+ });
+
+ // Event 1
+ resetEvent1.Set();
+ await Task.WhenAll(task1, task2);
+
+ // Assert
+ var result1 = task1.Result;
+ var result2 = task2.Result;
+ Assert.Same(result1, result2);
+ }
+
+ [Fact]
+ public async Task GetOrAdd_CachesCompilationExceptions()
+ {
+ // Arrange
+ var path = "/Views/Home/Index.cshtml";
+ var fileProvider = new TestFileProvider();
+ fileProvider.AddFile(path, "some content");
+ var exception = new InvalidTimeZoneException();
+ var compiler = GetViewCompiler(fileProvider);
+ compiler.Compile = _ => throw exception;
+
+ // Act and Assert - 1
+ var actual = await Assert.ThrowsAsync(
+ () => compiler.CompileAsync(path));
+ Assert.Same(exception, actual);
+
+ // Act and Assert - 2
+ compiler.Compile = _ => throw new Exception("Shouldn't be called");
+
+ actual = await Assert.ThrowsAsync(
+ () => compiler.CompileAsync(path));
+ Assert.Same(exception, actual);
+ }
+
+ [Fact]
+ public void Compile_SucceedsForCSharp7()
+ {
+ // Arrange
+ var content = @"
+public class MyTestType
+{
+ private string _name;
+
+ public string Name
+ {
+ get => _name;
+ set => _name = value ?? throw new System.ArgumentNullException(nameof(value));
+ }
+}";
+ var compiler = GetViewCompiler(new TestFileProvider());
+ var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("razor-content", "filename"));
+
+ // Act
+ var result = compiler.CompileAndEmit(codeDocument, content);
+
+ // Assert
+ var exportedType = Assert.Single(result.ExportedTypes);
+ Assert.Equal("MyTestType", exportedType.Name);
+ }
+
+ [Fact]
+ public void Compile_ReturnsCompilationFailureWithPathsFromLinePragmas()
+ {
+ // Arrange
+ var viewPath = "some-relative-path";
+ var fileContent = "test file content";
+ var content = $@"
+#line 1 ""{viewPath}""
+this should fail";
+
+ var compiler = GetViewCompiler(new TestFileProvider());
+ var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create(fileContent, viewPath));
+
+ // Act & Assert
+ var ex = Assert.Throws(() => compiler.CompileAndEmit(codeDocument, content));
+
+ var compilationFailure = Assert.Single(ex.CompilationFailures);
+ Assert.Equal(viewPath, compilationFailure.SourceFilePath);
+ Assert.Equal(fileContent, compilationFailure.SourceFileContent);
+ }
+
+ [Fact]
+ public void Compile_ReturnsGeneratedCodePath_IfLinePragmaIsNotAvailable()
+ {
+ // Arrange
+ var viewPath = "some-relative-path";
+ var fileContent = "file content";
+ var content = "this should fail";
+
+ var compiler = GetViewCompiler(new TestFileProvider());
+ var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create(fileContent, viewPath));
+
+ // Act & Assert
+ var ex = Assert.Throws(() => compiler.CompileAndEmit(codeDocument, content));
+
+ var compilationFailure = Assert.Single(ex.CompilationFailures);
+ Assert.Equal("Generated Code", compilationFailure.SourceFilePath);
+ Assert.Equal(content, compilationFailure.SourceFileContent);
+ }
+
+ [Fact]
+ public void CompileAndEmit_DoesNotThrowIfDebugTypeIsEmbedded()
+ {
+ // Arrange
+ var referenceManager = CreateReferenceManager();
+ var csharpCompiler = new TestCSharpCompiler(referenceManager, Mock.Of())
+ {
+ EmitOptionsSettable = new EmitOptions(debugInformationFormat: DebugInformationFormat.Embedded),
+ };
+
+ var compiler = GetViewCompiler(csharpCompiler: csharpCompiler);
+ var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("Hello world", "some-relative-path.cshtml"));
+
+ // Act
+ var result = compiler.CompileAndEmit(codeDocument, "public class Test{}");
+
+ // Assert
+ Assert.NotNull(result);
+ }
+
+ [Fact]
+ public void CompileAndEmit_WorksIfEmitPdbIsNotSet()
+ {
+ // Arrange
+ var referenceManager = CreateReferenceManager();
+ var csharpCompiler = new TestCSharpCompiler(referenceManager, Mock.Of())
+ {
+ EmitPdbSettable = false,
+ };
+
+ var compiler = GetViewCompiler(csharpCompiler: csharpCompiler);
+ var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create("Hello world", "some-relative-path.cshtml"));
+
+ // Act
+ var result = compiler.CompileAndEmit(codeDocument, "public class Test{}");
+
+ // Assert
+ Assert.NotNull(result);
+ }
+
+ private static TestRazorViewCompiler GetViewCompiler(
+ TestFileProvider fileProvider = null,
+ RazorReferenceManager referenceManager = null,
+ IList precompiledViews = null,
+ CSharpCompiler csharpCompiler = null)
+ {
+ fileProvider = fileProvider ?? new TestFileProvider();
+ var options = Options.Create(new MvcRazorRuntimeCompilationOptions
+ {
+ FileProviders = { fileProvider }
+ });
+ var compilationFileProvider = new RuntimeCompilationFileProvider(options);
+
+
+ referenceManager = referenceManager ?? CreateReferenceManager();
+ precompiledViews = precompiledViews ?? Array.Empty();
+
+ var hostingEnvironment = Mock.Of(e => e.ContentRootPath == "BasePath");
+ var fileSystem = new FileProviderRazorProjectFileSystem(compilationFileProvider, hostingEnvironment);
+ var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem, builder =>
+ {
+ RazorExtensions.Register(builder);
+ });
+
+ csharpCompiler = csharpCompiler ?? new CSharpCompiler(referenceManager, hostingEnvironment);
+
+ return new TestRazorViewCompiler(
+ fileProvider,
+ projectEngine,
+ csharpCompiler,
+ precompiledViews);
+ }
+
+ private static RazorReferenceManager CreateReferenceManager()
+ {
+ var applicationPartManager = new ApplicationPartManager();
+ var assembly = typeof(RuntimeViewCompilerTest).Assembly;
+ applicationPartManager.ApplicationParts.Add(new AssemblyPart(assembly));
+
+ return new RazorReferenceManager(applicationPartManager, Options.Create(new MvcRazorRuntimeCompilationOptions()));
+ }
+
+ private class TestRazorViewCompiler : RuntimeViewCompiler
+ {
+ public TestRazorViewCompiler(
+ TestFileProvider fileProvider,
+ RazorProjectEngine projectEngine,
+ CSharpCompiler csharpCompiler,
+ IList precompiledViews,
+ Func compile = null)
+ : base(fileProvider, projectEngine, csharpCompiler, precompiledViews, NullLogger.Instance)
+ {
+ Compile = compile;
+ if (Compile == null)
+ {
+ Compile = path => new CompiledViewDescriptor
+ {
+ RelativePath = path,
+ Item = CreateForView(path),
+ };
+ }
+ }
+
+ public Func Compile { get; set; }
+
+ protected override CompiledViewDescriptor CompileAndEmit(string relativePath)
+ {
+ return Compile(relativePath);
+ }
+ }
+
+ private class TestCSharpCompiler : CSharpCompiler
+ {
+ public TestCSharpCompiler(RazorReferenceManager manager, IHostingEnvironment hostingEnvironment)
+ : base(manager, hostingEnvironment)
+ {
+ }
+
+ public EmitOptions EmitOptionsSettable { get; set; }
+
+ public bool EmitPdbSettable { get; set; }
+
+ public override EmitOptions EmitOptions => EmitOptionsSettable;
+
+ public override bool EmitPdb => EmitPdbSettable;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/DirectoryNode.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/DirectoryNode.cs
new file mode 100644
index 0000000000..4cd98796c2
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/DirectoryNode.cs
@@ -0,0 +1,168 @@
+// 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;
+
+namespace Microsoft.AspNetCore.Razor.Language
+{
+ // Internal for testing
+ [DebuggerDisplay("{Path}")]
+ internal class DirectoryNode
+ {
+ public DirectoryNode(string path)
+ {
+ Path = path;
+ }
+
+ public string Path { get; }
+
+ public List Directories { get; } = new List();
+
+ public List Files { get; } = new List();
+
+ public void AddFile(FileNode fileNode)
+ {
+ var filePath = fileNode.Path;
+ if (!filePath.StartsWith(Path, StringComparison.OrdinalIgnoreCase))
+ {
+ throw new InvalidOperationException($"File {fileNode.Path} does not belong to {Path}.");
+ }
+
+ // Look for the first / that appears in the path after the current directory path.
+ var directoryPath = GetDirectoryPath(filePath);
+ var directory = GetOrAddDirectory(this, directoryPath, createIfNotExists: true);
+ Debug.Assert(directory != null);
+ directory.Files.Add(fileNode);
+ fileNode.Directory = directory;
+ }
+
+ public DirectoryNode GetDirectory(string path)
+ {
+ if (!path.StartsWith(Path, StringComparison.OrdinalIgnoreCase))
+ {
+ throw new InvalidOperationException($"File {path} does not belong to {Path}.");
+ }
+
+ return GetOrAddDirectory(this, path);
+ }
+
+ public IEnumerable EnumerateItems()
+ {
+ foreach (var file in Files)
+ {
+ yield return file.ProjectItem;
+ }
+
+ foreach (var directory in Directories)
+ {
+ foreach (var file in directory.EnumerateItems())
+ {
+ yield return file;
+ }
+ }
+ }
+
+ public RazorProjectItem GetItem(string path)
+ {
+ if (!path.StartsWith(Path, StringComparison.OrdinalIgnoreCase))
+ {
+ throw new InvalidOperationException($"File {path} does not belong to {Path}.");
+ }
+
+ var directoryPath = GetDirectoryPath(path);
+ var directory = GetOrAddDirectory(this, directoryPath);
+ if (directory == null)
+ {
+ return new NotFoundProjectItem("/", path);
+ }
+
+ foreach (var file in directory.Files)
+ {
+ var filePath = file.Path;
+ var directoryLength = directory.Path.Length;
+
+ // path, filePath -> /Views/Home/Index.cshtml
+ // directory.Path -> /Views/Home/
+ // We only need to match the file name portion since we've already matched the directory segment.
+ if (string.Compare(path, directoryLength, filePath, directoryLength, path.Length - directoryLength, StringComparison.OrdinalIgnoreCase) == 0)
+ {
+ return file.ProjectItem;
+ }
+ }
+
+ return new NotFoundProjectItem("/", path);
+ }
+
+ private static string GetDirectoryPath(string path)
+ {
+ // /dir1/dir2/file.cshtml -> /dir1/dir2/
+ var fileNameIndex = path.LastIndexOf('/');
+ if (fileNameIndex == -1)
+ {
+ return path;
+ }
+
+ return path.Substring(0, fileNameIndex + 1);
+ }
+
+ private static DirectoryNode GetOrAddDirectory(
+ DirectoryNode directory,
+ string path,
+ bool createIfNotExists = false)
+ {
+ Debug.Assert(!string.IsNullOrEmpty(path));
+ if (path[path.Length - 1] != '/')
+ {
+ path += '/';
+ }
+
+ int index;
+ while ((index = path.IndexOf('/', directory.Path.Length)) != -1 && index != path.Length)
+ {
+ var subDirectory = FindSubDirectory(directory, path);
+
+ if (subDirectory == null)
+ {
+ if (createIfNotExists)
+ {
+ var directoryPath = path.Substring(0, index + 1); // + 1 to include trailing slash
+ subDirectory = new DirectoryNode(directoryPath);
+ directory.Directories.Add(subDirectory);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ directory = subDirectory;
+ }
+
+ return directory;
+ }
+
+ private static DirectoryNode FindSubDirectory(DirectoryNode parentDirectory, string path)
+ {
+ for (var i = 0; i < parentDirectory.Directories.Count; i++)
+ {
+ // ParentDirectory.Path -> /Views/Home/
+ // CurrentDirectory.Path -> /Views/Home/SubDir/
+ // Path -> /Views/Home/SubDir/MorePath/File.cshtml
+ // Each invocation of FindSubDirectory returns the immediate subdirectory along the path to the file.
+
+ var currentDirectory = parentDirectory.Directories[i];
+ var directoryPath = currentDirectory.Path;
+ var startIndex = parentDirectory.Path.Length;
+
+ if (string.Compare(path, startIndex, directoryPath, startIndex, directoryPath.Length - startIndex, StringComparison.OrdinalIgnoreCase) == 0)
+ {
+ return currentDirectory;
+ }
+ }
+
+ return null;
+ }
+ }
+}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/FileNode.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/FileNode.cs
new file mode 100644
index 0000000000..583281794a
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/FileNode.cs
@@ -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.Diagnostics;
+
+namespace Microsoft.AspNetCore.Razor.Language
+{
+ // Internal for testing
+ [DebuggerDisplay("{Path}")]
+ internal class FileNode
+ {
+ public FileNode(string path, RazorProjectItem projectItem)
+ {
+ Path = path;
+ ProjectItem = projectItem;
+ }
+
+ public DirectoryNode Directory { get; set; }
+
+ public string Path { get; }
+
+ public RazorProjectItem ProjectItem { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/NotFoundProjectItem.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/NotFoundProjectItem.cs
new file mode 100644
index 0000000000..84ea7f01cf
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/NotFoundProjectItem.cs
@@ -0,0 +1,27 @@
+// 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.IO;
+
+namespace Microsoft.AspNetCore.Razor.Language
+{
+ internal class NotFoundProjectItem : RazorProjectItem
+ {
+ public NotFoundProjectItem(string basePath, string path)
+ {
+ BasePath = basePath;
+ FilePath = path;
+ }
+
+ public override string BasePath { get; }
+
+ public override string FilePath { get; }
+
+ public override bool Exists => false;
+
+ public override string PhysicalPath => throw new NotSupportedException();
+
+ public override Stream Read() => throw new NotSupportedException();
+ }
+}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/TestRazorProjectItem.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/TestRazorProjectItem.cs
new file mode 100644
index 0000000000..c30b761464
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/TestRazorProjectItem.cs
@@ -0,0 +1,44 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System.IO;
+using System.Text;
+
+namespace Microsoft.AspNetCore.Razor.Language
+{
+ public class TestRazorProjectItem : RazorProjectItem
+ {
+ public TestRazorProjectItem(
+ string filePath,
+ string content = "Default content",
+ string physicalPath = null,
+ string relativePhysicalPath = null,
+ string basePath = "/")
+ {
+ FilePath = filePath;
+ PhysicalPath = physicalPath;
+ RelativePhysicalPath = relativePhysicalPath;
+ BasePath = basePath;
+ Content = content;
+ }
+
+ public override string BasePath { get; }
+
+ public override string FilePath { get; }
+
+ public override string PhysicalPath { get; }
+
+ public override string RelativePhysicalPath { get; }
+
+ public override bool Exists => true;
+
+ public string Content { get; set; }
+
+ public override Stream Read()
+ {
+ var stream = new MemoryStream(Encoding.UTF8.GetBytes(Content));
+
+ return stream;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/TestRazorReferenceManager.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/TestRazorReferenceManager.cs
new file mode 100644
index 0000000000..91a44bcfeb
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/TestRazorReferenceManager.cs
@@ -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.Mvc.ApplicationParts;
+using Microsoft.CodeAnalysis;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
+{
+ internal class TestRazorReferenceManager : RazorReferenceManager
+ {
+ public TestRazorReferenceManager()
+ : base(
+ new ApplicationPartManager(),
+ Options.Create(new MvcRazorRuntimeCompilationOptions()))
+ {
+ CompilationReferences = Array.Empty();
+ }
+
+ public override IReadOnlyList CompilationReferences { get; }
+ }
+}
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/VirtualRazorProjectFileSystem.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/VirtualRazorProjectFileSystem.cs
new file mode 100644
index 0000000000..fe662d3b3f
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test/TestInfrastructure/VirtualRazorProjectFileSystem.cs
@@ -0,0 +1,39 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
+
+namespace Microsoft.AspNetCore.Razor.Language
+{
+ internal class VirtualRazorProjectFileSystem : RazorProjectFileSystem
+ {
+ private readonly DirectoryNode _root = new DirectoryNode("/");
+
+ public override IEnumerable EnumerateItems(string basePath)
+ {
+ basePath = NormalizeAndEnsureValidPath(basePath);
+ var directory = _root.GetDirectory(basePath);
+ return directory?.EnumerateItems() ?? Enumerable.Empty();
+ }
+
+ public override RazorProjectItem GetItem(string path)
+ {
+ path = NormalizeAndEnsureValidPath(path);
+ return _root.GetItem(path) ?? new NotFoundProjectItem(string.Empty, path);
+ }
+
+ public void Add(RazorProjectItem projectItem)
+ {
+ if (projectItem == null)
+ {
+ throw new ArgumentNullException(nameof(projectItem));
+ }
+
+ var filePath = NormalizeAndEnsureValidPath(projectItem.FilePath);
+ _root.AddFile(new FileNode(filePath, projectItem));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.Test/Compilation/RazorViewCompilerTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.Test/Compilation/DefaultViewCompilerTest.cs
similarity index 96%
rename from src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.Test/Compilation/RazorViewCompilerTest.cs
rename to src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.Test/Compilation/DefaultViewCompilerTest.cs
index 790efd95dd..003bd6ddab 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.Test/Compilation/RazorViewCompilerTest.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.Razor.Test/Compilation/DefaultViewCompilerTest.cs
@@ -9,7 +9,7 @@ using Xunit;
namespace Microsoft.AspNetCore.Mvc.Razor.Compilation
{
- public class RazorViewCompilerTest
+ public class DefaultViewCompilerTest
{
[Fact]
public async Task CompileAsync_ReturnsResultWithNullAttribute_IfFileIsNotFoundInFileSystem()
@@ -94,7 +94,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Compilation
return viewCompiler;
}
- private class TestRazorViewCompiler : RazorViewCompiler
+ private class TestRazorViewCompiler : DefaultViewCompiler
{
public TestRazorViewCompiler(IList compiledViews) :
base(compiledViews, NullLogger.Instance)
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/CacheTagHelperTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/CacheTagHelperTest.cs
index 9d43784485..78e3645a24 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/CacheTagHelperTest.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/CacheTagHelperTest.cs
@@ -17,6 +17,7 @@ using Microsoft.AspNetCore.Mvc.ViewEngines;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.AspNetCore.Routing;
+using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Internal;
using Microsoft.Extensions.Primitives;
@@ -545,9 +546,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
// Arrange
var id = "unique-id";
var childContent = "some-content";
- var resetEvent1 = new ManualResetEvent(false);
- var resetEvent2 = new ManualResetEvent(false);
- var resetEvent3 = new ManualResetEvent(false);
+ var event1 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var event2 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var event3 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var calls = 0;
var cache = new MemoryCache(new MemoryCacheOptions());
@@ -560,7 +561,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
getChildContentAsync: (useCachedResult, encoder) =>
{
calls++;
- resetEvent2.Set();
+ event2.SetResult(0);
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetHtmlContent(childContent);
@@ -570,14 +571,14 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var tagHelperOutput2 = new TagHelperOutput(
"cache",
new TagHelperAttributeList(),
- getChildContentAsync: (useCachedResult, encoder) =>
+ getChildContentAsync: async (useCachedResult, encoder) =>
{
calls++;
- resetEvent3.WaitOne(5000);
+ await event3.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetHtmlContent(childContent);
- return Task.FromResult(tagHelperContent);
+ return tagHelperContent;
});
var cacheTagHelper1 = new CacheTagHelper(new CacheTagHelperMemoryCacheFactory(cache), new HtmlTestEncoder())
@@ -596,18 +597,18 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var task1 = Task.Run(async () =>
{
- resetEvent1.WaitOne(5000);
+ await event1.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
await cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput1);
- resetEvent3.Set();
+ event3.SetResult(0);
});
var task2 = Task.Run(async () =>
{
- resetEvent2.WaitOne(5000);
+ await event2.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
await cacheTagHelper2.ProcessAsync(tagHelperContext1, tagHelperOutput2);
});
- resetEvent1.Set();
+ event1.SetResult(0);
await Task.WhenAll(task1, task2);
// Assert
@@ -630,9 +631,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
// Arrange
var id = "unique-id";
var childContent = "some-content";
- var resetEvent1 = new ManualResetEvent(false);
- var resetEvent2 = new ManualResetEvent(false);
- var resetEvent3 = new ManualResetEvent(false);
+ var event1 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var event2 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var event3 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var calls = 0;
var cache = new MemoryCache(new MemoryCacheOptions());
@@ -645,7 +646,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
getChildContentAsync: (useCachedResult, encoder) =>
{
calls++;
- resetEvent2.Set();
+ event2.SetResult(0);
throw new Exception();
});
@@ -653,14 +654,14 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var tagHelperOutput2 = new TagHelperOutput(
"cache",
new TagHelperAttributeList(),
- getChildContentAsync: (useCachedResult, encoder) =>
+ getChildContentAsync: async (useCachedResult, encoder) =>
{
calls++;
- resetEvent3.WaitOne(5000);
+ await event3.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetHtmlContent(childContent);
- return Task.FromResult(tagHelperContent);
+ return tagHelperContent;
});
var cacheTagHelper1 = new CacheTagHelper(new CacheTagHelperMemoryCacheFactory(cache), new HtmlTestEncoder())
@@ -679,18 +680,18 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var task1 = Task.Run(async () =>
{
- resetEvent1.WaitOne(5000);
+ await event1.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
await Assert.ThrowsAsync(() => cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput1));
- resetEvent3.Set();
+ event3.SetResult(0);
});
var task2 = Task.Run(async () =>
{
- resetEvent2.WaitOne(5000);
+ await event2.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
await cacheTagHelper2.ProcessAsync(tagHelperContext2, tagHelperOutput2);
});
- resetEvent1.Set();
+ event1.SetResult(0);
await Task.WhenAll(task1, task2);
// Assert
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/DistributedCacheTagHelperTest.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/DistributedCacheTagHelperTest.cs
index 19d56fb5af..410e4f149c 100644
--- a/src/Mvc/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/DistributedCacheTagHelperTest.cs
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/DistributedCacheTagHelperTest.cs
@@ -17,6 +17,7 @@ using Microsoft.AspNetCore.Mvc.ViewEngines;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.AspNetCore.Routing;
+using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Internal;
@@ -538,9 +539,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
{
// Arrange
var childContent = "some-content";
- var resetEvent1 = new ManualResetEvent(false);
- var resetEvent2 = new ManualResetEvent(false);
- var resetEvent3 = new ManualResetEvent(false);
+ var event1 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var event2 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var event3 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var calls = 0;
var formatter = GetFormatter();
var storage = GetStorage();
@@ -559,7 +560,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
getChildContentAsync: (useCachedResult, encoder) =>
{
calls++;
- resetEvent2.Set();
+ event2.SetResult(0);
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetHtmlContent(childContent);
@@ -569,14 +570,14 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var tagHelperOutput2 = new TagHelperOutput(
"distributed-cache",
new TagHelperAttributeList(),
- getChildContentAsync: (useCachedResult, encoder) =>
+ getChildContentAsync: async (useCachedResult, encoder) =>
{
calls++;
- resetEvent3.WaitOne(5000);
+ await event3.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetHtmlContent(childContent);
- return Task.FromResult(tagHelperContent);
+ return tagHelperContent;
});
var cacheTagHelper1 = new DistributedCacheTagHelper(
@@ -599,18 +600,18 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var task1 = Task.Run(async () =>
{
- resetEvent1.WaitOne(5000);
+ await event1.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
await cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput1);
- resetEvent3.Set();
+ event3.SetResult(0);
});
var task2 = Task.Run(async () =>
{
- resetEvent2.WaitOne(5000);
+ await event2.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
await cacheTagHelper2.ProcessAsync(tagHelperContext1, tagHelperOutput2);
});
- resetEvent1.Set();
+ event1.SetResult(0);
await Task.WhenAll(task1, task2);
// Assert
@@ -632,9 +633,9 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
{
// Arrange
var childContent = "some-content";
- var resetEvent1 = new ManualResetEvent(false);
- var resetEvent2 = new ManualResetEvent(false);
- var resetEvent3 = new ManualResetEvent(false);
+ var event1 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var event2 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var event3 = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var calls = 0;
var formatter = GetFormatter();
var storage = GetStorage();
@@ -653,7 +654,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
getChildContentAsync: (useCachedResult, encoder) =>
{
calls++;
- resetEvent2.Set();
+ event2.SetResult(0);
throw new Exception();
});
@@ -661,14 +662,14 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var tagHelperOutput2 = new TagHelperOutput(
"distributed-cache",
new TagHelperAttributeList(),
- getChildContentAsync: (useCachedResult, encoder) =>
+ getChildContentAsync: async (useCachedResult, encoder) =>
{
calls++;
- resetEvent3.WaitOne(5000);
+ await event3.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetHtmlContent(childContent);
- return Task.FromResult(tagHelperContent);
+ return tagHelperContent;
});
var cacheTagHelper1 = new DistributedCacheTagHelper(
@@ -691,18 +692,18 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var task1 = Task.Run(async () =>
{
- resetEvent1.WaitOne(5000);
+ await event1.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
await Assert.ThrowsAsync(() => cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput1));
- resetEvent3.Set();
+ event3.SetResult(0);
});
var task2 = Task.Run(async () =>
{
- resetEvent2.WaitOne(5000);
+ await event2.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
await cacheTagHelper2.ProcessAsync(tagHelperContext2, tagHelperOutput2);
});
- resetEvent1.Set();
+ event1.SetResult(0);
await Task.WhenAll(task1, task2);
// Assert
diff --git a/src/Mvc/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/HtmlHelperComponentExtensionsTests.cs b/src/Mvc/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/HtmlHelperComponentExtensionsTests.cs
new file mode 100644
index 0000000000..b9439dbae1
--- /dev/null
+++ b/src/Mvc/test/Microsoft.AspNetCore.Mvc.ViewFeatures.Test/HtmlHelperComponentExtensionsTests.cs
@@ -0,0 +1,309 @@
+// 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.IO;
+using System.Text.Encodings.Web;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Components.RenderTree;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.Rendering;
+using Microsoft.Extensions.DependencyInjection;
+using Moq;
+using Xunit;
+
+namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Test
+{
+ public class HtmlHelperComponentExtensionsTests
+ {
+ [Fact]
+ public async Task CanRender_ParameterlessComponent()
+ {
+ // Arrange
+ var helper = CreateHelper();
+ var writer = new StringWriter();
+
+ // Act
+ var result = await helper.RenderComponentAsync();
+ result.WriteTo(writer, HtmlEncoder.Default);
+ var content = writer.ToString();
+
+ // Assert
+ Assert.Equal("Hello world! ", content);
+ }
+
+ [Fact]
+ public async Task CanRender_ComponentWithParametersObject()
+ {
+ // Arrange
+ var helper = CreateHelper();
+ var writer = new StringWriter();
+
+ // Act
+ var result = await helper.RenderComponentAsync(new
+ {
+ Name = "Steve"
+ });
+ result.WriteTo(writer, HtmlEncoder.Default);
+ var content = writer.ToString();
+
+ // Assert
+ Assert.Equal("Hello Steve!
", content);
+ }
+
+ [Fact]
+ public async Task CanRender_AsyncComponent()
+ {
+ // Arrange
+ var helper = CreateHelper();
+ var writer = new StringWriter();
+ var expectedContent = @"
+
+
+Date
+Summary
+F
+C
+
+
+
+
+06/05/2018
+Freezing
+33
+33
+
+
+07/05/2018
+Bracing
+57
+57
+
+
+08/05/2018
+Freezing
+9
+9
+
+
+09/05/2018
+Balmy
+4
+4
+
+
+10/05/2018
+Chilly
+29
+29
+
+
+
";
+
+ // Act
+ var result = await helper.RenderComponentAsync();
+ result.WriteTo(writer, HtmlEncoder.Default);
+ var content = writer.ToString();
+
+ // Assert
+ Assert.Equal(expectedContent.Replace("\r\n","\n"), content);
+ }
+
+ private static IHtmlHelper CreateHelper(Action configureServices = null)
+ {
+ var serviceCollection = new ServiceCollection();
+ serviceCollection.AddSingleton(HtmlEncoder.Default);
+ configureServices?.Invoke(serviceCollection);
+
+ var helper = new Mock();
+ helper.Setup(h => h.ViewContext)
+ .Returns(new ViewContext()
+ {
+ HttpContext = new DefaultHttpContext()
+ {
+ RequestServices = serviceCollection.BuildServiceProvider()
+ }
+ });
+ return helper.Object;
+ }
+
+ private class TestComponent : IComponent
+ {
+ private RenderHandle _renderHandle;
+
+ public void Configure(RenderHandle renderHandle)
+ {
+ _renderHandle = renderHandle;
+ }
+
+ public Task SetParametersAsync(ParameterCollection parameters)
+ {
+ _renderHandle.Render(builder =>
+ {
+ var s = 0;
+ builder.OpenElement(s++, "h1");
+ builder.AddContent(s++, "Hello world!");
+ builder.CloseElement();
+ });
+ return Task.CompletedTask;
+ }
+ }
+
+ private class GreetingComponent : ComponentBase
+ {
+ [Parameter] public string Name { get; set; }
+
+ protected override void OnParametersSet()
+ {
+ base.OnParametersSet();
+ }
+
+ protected override void BuildRenderTree(RenderTreeBuilder builder)
+ {
+ var s = 0;
+ base.BuildRenderTree(builder);
+ builder.OpenElement(s++, "p");
+ builder.AddContent(s++, $"Hello {Name}!");
+ builder.CloseElement();
+ }
+ }
+
+ private class AsyncComponent : ComponentBase
+ {
+ private static WeatherRow[] _weatherData = new[]
+ {
+ new WeatherRow
+ {
+ DateFormatted = "06/05/2018",
+ TemperatureC = 1,
+ Summary = "Freezing",
+ TemperatureF = 33
+ },
+ new WeatherRow
+ {
+ DateFormatted = "07/05/2018",
+ TemperatureC = 14,
+ Summary = "Bracing",
+ TemperatureF = 57
+ },
+ new WeatherRow
+ {
+ DateFormatted = "08/05/2018",
+ TemperatureC = -13,
+ Summary = "Freezing",
+ TemperatureF = 9
+ },
+ new WeatherRow
+ {
+ DateFormatted = "09/05/2018",
+ TemperatureC = -16,
+ Summary = "Balmy",
+ TemperatureF = 4
+ },
+ new WeatherRow
+ {
+ DateFormatted = "10/05/2018",
+ TemperatureC = 2,
+ Summary = "Chilly",
+ TemperatureF = 29
+ }
+ };
+
+ public class WeatherRow
+ {
+ public string DateFormatted { get; set; }
+ public int TemperatureC { get; set; }
+ public string Summary { get; set; }
+ public int TemperatureF { get; set; }
+ }
+
+ public WeatherRow[] RowsToDisplay { get; set; }
+
+ protected override async Task OnParametersSetAsync()
+ {
+ // Simulate an async workflow.
+ await Task.Yield();
+ RowsToDisplay = _weatherData;
+ }
+
+ protected override void BuildRenderTree(RenderTreeBuilder builder)
+ {
+ base.BuildRenderTree(builder);
+ var s = 0;
+ builder.OpenElement(s++, "table");
+ builder.AddMarkupContent(s++, "\n");
+ builder.OpenElement(s++, "thead");
+ builder.AddMarkupContent(s++, "\n");
+ builder.OpenElement(s++, "tr");
+ builder.AddMarkupContent(s++, "\n");
+
+ builder.OpenElement(s++, "th");
+ builder.AddContent(s++, "Date");
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+
+ builder.OpenElement(s++, "th");
+ builder.AddContent(s++, "Summary");
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+
+ builder.OpenElement(s++, "th");
+ builder.AddContent(s++, "F");
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+
+ builder.OpenElement(s++, "th");
+ builder.AddContent(s++, "C");
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+ builder.OpenElement(s++, "tbody");
+ builder.AddMarkupContent(s++, "\n");
+ if (RowsToDisplay != null)
+ {
+ var s2 = s;
+ foreach (var element in RowsToDisplay)
+ {
+ s = s2;
+ builder.OpenElement(s++, "tr");
+ builder.AddMarkupContent(s++, "\n");
+
+ builder.OpenElement(s++, "td");
+ builder.AddContent(s++, element.DateFormatted);
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+
+ builder.OpenElement(s++, "td");
+ builder.AddContent(s++, element.Summary);
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+
+ builder.OpenElement(s++, "td");
+ builder.AddContent(s++, element.TemperatureF);
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+
+ builder.OpenElement(s++, "td");
+ builder.AddContent(s++, element.TemperatureF);
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+ }
+ }
+
+ builder.CloseElement();
+ builder.AddMarkupContent(s++, "\n");
+
+ builder.CloseElement();
+ }
+ }
+ }
+}
diff --git a/src/Mvc/test/WebSites/BasicWebSite/Controllers/ComponentsController.cs b/src/Mvc/test/WebSites/BasicWebSite/Controllers/ComponentsController.cs
new file mode 100644
index 0000000000..99ba2690ee
--- /dev/null
+++ b/src/Mvc/test/WebSites/BasicWebSite/Controllers/ComponentsController.cs
@@ -0,0 +1,74 @@
+// 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.Mvc;
+
+namespace BasicWebSite.Controllers
+{
+ public class ComponentsController : Controller
+ {
+ private static WeatherRow[] _weatherData = new[]
+ {
+ new WeatherRow
+ {
+ DateFormatted = "06/05/2018",
+ TemperatureC = 1,
+ Summary = "Freezing",
+ TemperatureF = 33
+ },
+ new WeatherRow
+ {
+ DateFormatted = "07/05/2018",
+ TemperatureC = 14,
+ Summary = "Bracing",
+ TemperatureF = 57
+ },
+ new WeatherRow
+ {
+ DateFormatted = "08/05/2018",
+ TemperatureC = -13,
+ Summary = "Freezing",
+ TemperatureF = 9
+ },
+ new WeatherRow
+ {
+ DateFormatted = "09/05/2018",
+ TemperatureC = -16,
+ Summary = "Balmy",
+ TemperatureF = 4
+ },
+ new WeatherRow
+ {
+ DateFormatted = "10/05/2018",
+ TemperatureC = 2,
+ Summary = "Chilly",
+ TemperatureF = 29
+ }
+ };
+
+ [HttpGet("/components")]
+ public IActionResult Index()
+ {
+ return View();
+ }
+
+ [HttpGet("/WeatherData")]
+ [Produces("application/json")]
+ public IActionResult WeatherData()
+ {
+ return Ok(_weatherData);
+ }
+
+ private class WeatherRow
+ {
+ public string DateFormatted { get; internal set; }
+ public int TemperatureC { get; internal set; }
+ public string Summary { get; internal set; }
+ public int TemperatureF { get; internal set; }
+ }
+ }
+}
diff --git a/src/Mvc/test/WebSites/BasicWebSite/Controllers/ContactApiController.cs b/src/Mvc/test/WebSites/BasicWebSite/Controllers/ContactApiController.cs
index c2d3400e1f..d333df973f 100644
--- a/src/Mvc/test/WebSites/BasicWebSite/Controllers/ContactApiController.cs
+++ b/src/Mvc/test/WebSites/BasicWebSite/Controllers/ContactApiController.cs
@@ -131,11 +131,6 @@ namespace BasicWebSite
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
- if (val == null)
- {
- return Task.CompletedTask;
- }
-
bindingContext.Result = ModelBindingResult.Success("From TestModelBinder: " + val);
return Task.CompletedTask;
}
diff --git a/src/Mvc/test/WebSites/BasicWebSite/RazorComponents/FetchData.razor b/src/Mvc/test/WebSites/BasicWebSite/RazorComponents/FetchData.razor
new file mode 100644
index 0000000000..79f6d6937c
--- /dev/null
+++ b/src/Mvc/test/WebSites/BasicWebSite/RazorComponents/FetchData.razor
@@ -0,0 +1,53 @@
+@using BasicWebSite.Services
+@inject WeatherForecastService ForecastService
+
+Weather forecast
+
+This component demonstrates fetching data from the server.
+
+@if (forecasts == null)
+{
+ Loading...
+}
+else
+{
+ Weather data for @(StartDate.ToString("MM/dd/yyyy"))
+
+
+
+ Date
+ Temp. (C)
+ Temp. (F)
+ Summary
+
+
+
+ @foreach (var forecast in forecasts)
+ {
+
+ @forecast.DateFormatted
+ @forecast.TemperatureC
+ @forecast.TemperatureF
+ @forecast.Summary
+
+ }
+
+
+}
+
+@functions {
+ [Parameter] DateTime StartDate { get; set; }
+
+ WeatherForecast[] forecasts;
+
+ protected override async Task OnParametersSetAsync()
+ {
+ // If no value was given in the URL for StartDate, apply a default
+ if (StartDate == default)
+ {
+ StartDate = DateTime.Now;
+ }
+
+ forecasts = await ForecastService.GetForecastAsync(StartDate);
+ }
+}
diff --git a/src/Mvc/test/WebSites/BasicWebSite/RazorComponents/Greetings.razor b/src/Mvc/test/WebSites/BasicWebSite/RazorComponents/Greetings.razor
new file mode 100644
index 0000000000..bd67e43af9
--- /dev/null
+++ b/src/Mvc/test/WebSites/BasicWebSite/RazorComponents/Greetings.razor
@@ -0,0 +1 @@
+Hello world!
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/BasicWebSite/Services/WeatherForecastService.cs b/src/Mvc/test/WebSites/BasicWebSite/Services/WeatherForecastService.cs
new file mode 100644
index 0000000000..5491c579ec
--- /dev/null
+++ b/src/Mvc/test/WebSites/BasicWebSite/Services/WeatherForecastService.cs
@@ -0,0 +1,45 @@
+// 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.Net.Http;
+using System.Threading.Tasks;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
+
+namespace BasicWebSite.Services
+{
+ public class WeatherForecastService
+ {
+ private readonly HttpClient _httpClient;
+
+ public WeatherForecastService(HttpClient httpClient)
+ {
+ _httpClient = httpClient;
+ }
+
+ public async Task GetForecastAsync(DateTime startDate)
+ {
+ var result = await _httpClient.GetAsync("/WeatherData");
+ result.EnsureSuccessStatusCode();
+ var dataString = await result.Content.ReadAsStringAsync();
+ var weatherData = JsonConvert.DeserializeObject(
+ dataString, new JsonSerializerSettings
+ {
+ ContractResolver = new DefaultContractResolver
+ {
+ NamingStrategy = new CamelCaseNamingStrategy()
+ }
+ });
+ return weatherData;
+ }
+ }
+
+ public class WeatherForecast
+ {
+ public string DateFormatted { get; set; }
+ public int TemperatureC { get; set; }
+ public string Summary { get; set; }
+ public int TemperatureF { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/BasicWebSite/Startup.cs b/src/Mvc/test/WebSites/BasicWebSite/Startup.cs
index 8147a6b774..978ce38fe7 100644
--- a/src/Mvc/test/WebSites/BasicWebSite/Startup.cs
+++ b/src/Mvc/test/WebSites/BasicWebSite/Startup.cs
@@ -1,13 +1,18 @@
// 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.Net.Http;
+using BasicWebSite.Services;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
namespace BasicWebSite
{
@@ -48,6 +53,22 @@ namespace BasicWebSite
services.AddTransient();
services.AddScoped();
services.AddSingleton();
+ services.TryAddSingleton(CreateWeatherForecastService);
+ }
+
+ // For manual debug only (running this test site with F5)
+ // This needs to be changed to match the site host
+ private WeatherForecastService CreateWeatherForecastService(IServiceProvider serviceProvider)
+ {
+ var contextAccessor = serviceProvider.GetRequiredService();
+ var httpContext = contextAccessor.HttpContext;
+ if (httpContext == null)
+ {
+ throw new InvalidOperationException("Needs a request context!");
+ }
+ var client = new HttpClient();
+ client.BaseAddress = new Uri($"{httpContext.Request.Scheme}://{httpContext.Request.Host}");
+ return new WeatherForecastService(client);
}
public void Configure(IApplicationBuilder app)
diff --git a/src/Mvc/test/WebSites/BasicWebSite/Views/Components/Index.cshtml b/src/Mvc/test/WebSites/BasicWebSite/Views/Components/Index.cshtml
new file mode 100644
index 0000000000..6bff9af76f
--- /dev/null
+++ b/src/Mvc/test/WebSites/BasicWebSite/Views/Components/Index.cshtml
@@ -0,0 +1,9 @@
+@using BasicWebSite.RazorComponents;
+Razor components
+
+ @(await Html.RenderComponentAsync())
+
+
+
+ @(await Html.RenderComponentAsync(new { StartDate = new DateTime(2019, 01, 15) }))
+
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorWebSite/Controllers/UpdateableFileProviderController.cs b/src/Mvc/test/WebSites/RazorBuildWebSite/Controllers/UpdateableViewsController.cs
similarity index 79%
rename from src/Mvc/test/WebSites/RazorWebSite/Controllers/UpdateableFileProviderController.cs
rename to src/Mvc/test/WebSites/RazorBuildWebSite/Controllers/UpdateableViewsController.cs
index ed5a12a6f2..609e8ab7bf 100644
--- a/src/Mvc/test/WebSites/RazorWebSite/Controllers/UpdateableFileProviderController.cs
+++ b/src/Mvc/test/WebSites/RazorBuildWebSite/Controllers/UpdateableViewsController.cs
@@ -3,11 +3,11 @@
using Microsoft.AspNetCore.Mvc;
-namespace RazorWebSite
+namespace RazorBuildWebSite
{
- public class UpdateableFileProviderController : Controller
+ public class UpdateableViewsController : Controller
{
- public IActionResult Index() => View("/Views/UpdateableIndex/Index.cshtml");
+ public IActionResult Index() => View();
[HttpPost]
public IActionResult Update([FromServices] UpdateableFileProvider fileProvider, string path, string content)
diff --git a/src/Mvc/test/WebSites/RazorBuildWebSite/RazorBuildWebSite.csproj b/src/Mvc/test/WebSites/RazorBuildWebSite/RazorBuildWebSite.csproj
index f7fcee6d8a..76177e1789 100644
--- a/src/Mvc/test/WebSites/RazorBuildWebSite/RazorBuildWebSite.csproj
+++ b/src/Mvc/test/WebSites/RazorBuildWebSite/RazorBuildWebSite.csproj
@@ -1,4 +1,4 @@
-
+
netcoreapp3.0
@@ -10,6 +10,7 @@
+
diff --git a/src/Mvc/test/WebSites/RazorBuildWebSite/Startup.cs b/src/Mvc/test/WebSites/RazorBuildWebSite/Startup.cs
index 3d4858bd55..5d5123ee9d 100644
--- a/src/Mvc/test/WebSites/RazorBuildWebSite/Startup.cs
+++ b/src/Mvc/test/WebSites/RazorBuildWebSite/Startup.cs
@@ -13,7 +13,11 @@ namespace RazorBuildWebSite
{
public void ConfigureServices(IServiceCollection services)
{
+ var fileProvider = new UpdateableFileProvider();
+ services.AddSingleton(fileProvider);
+
services.AddMvc()
+ .AddRazorRuntimeCompilation(options => options.FileProviders.Add(fileProvider))
.SetCompatibilityVersion(CompatibilityVersion.Latest);
}
diff --git a/src/Mvc/test/WebSites/RazorWebSite/Services/UpdateableFileProvider.cs b/src/Mvc/test/WebSites/RazorBuildWebSite/UpdateableFileProvider.cs
similarity index 92%
rename from src/Mvc/test/WebSites/RazorWebSite/Services/UpdateableFileProvider.cs
rename to src/Mvc/test/WebSites/RazorBuildWebSite/UpdateableFileProvider.cs
index 5613ffda9a..42968e9fa0 100644
--- a/src/Mvc/test/WebSites/RazorWebSite/Services/UpdateableFileProvider.cs
+++ b/src/Mvc/test/WebSites/RazorBuildWebSite/UpdateableFileProvider.cs
@@ -10,7 +10,7 @@ using System.Threading;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Primitives;
-namespace RazorWebSite
+namespace RazorBuildWebSite
{
public class UpdateableFileProvider : IFileProvider
{
@@ -19,15 +19,11 @@ namespace RazorWebSite
private readonly Dictionary _content = new Dictionary()
{
{
- "/Views/UpdateableIndex/_ViewImports.cshtml",
+ "/Views/UpdateableViews/_ViewImports.cshtml",
new TestFileInfo(string.Empty)
},
{
- "/Views/UpdateableIndex/Index.cshtml",
- new TestFileInfo(@"@Html.Partial(""../UpdateableShared/_Partial.cshtml"")")
- },
- {
- "/Views/UpdateableShared/_Partial.cshtml",
+ "/Views/UpdateableViews/Index.cshtml",
new TestFileInfo("Original content")
},
{
diff --git a/src/Mvc/test/WebSites/RazorBuildWebSite/readme.md b/src/Mvc/test/WebSites/RazorBuildWebSite/readme.md
index 292a669614..07d41e6944 100644
--- a/src/Mvc/test/WebSites/RazorBuildWebSite/readme.md
+++ b/src/Mvc/test/WebSites/RazorBuildWebSite/readme.md
@@ -1,4 +1,4 @@
RazorBuildWebSite
===
-This web site tests how the Razor view engine interacts with pre-built Razor assemblies.
\ No newline at end of file
+This web site tests how the Razor view engine interacts with pre-built and runtime compiled Razor assemblies.
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/Controllers/AuthorizedActionController.cs b/src/Mvc/test/WebSites/RazorPagesWebSite/Controllers/AuthorizedActionController.cs
new file mode 100644
index 0000000000..5967c595ec
--- /dev/null
+++ b/src/Mvc/test/WebSites/RazorPagesWebSite/Controllers/AuthorizedActionController.cs
@@ -0,0 +1,15 @@
+// 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.Authorization;
+using Microsoft.AspNetCore.Mvc;
+
+namespace RazorPagesWebSite.Controllers
+{
+ [Route("[controller]/[action]")]
+ [Authorize]
+ public class AuthorizedActionController : Controller
+ {
+ public IActionResult Index() => Ok();
+ }
+}
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/ModelWithAuthFilter.cs b/src/Mvc/test/WebSites/RazorPagesWebSite/Pages/ModelWithAuthFilter.cs
similarity index 100%
rename from src/Mvc/test/WebSites/RazorPagesWebSite/ModelWithAuthFilter.cs
rename to src/Mvc/test/WebSites/RazorPagesWebSite/Pages/ModelWithAuthFilter.cs
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/ModelWithAuthFilter.cshtml b/src/Mvc/test/WebSites/RazorPagesWebSite/Pages/ModelWithAuthFilter.cshtml
similarity index 100%
rename from src/Mvc/test/WebSites/RazorPagesWebSite/ModelWithAuthFilter.cshtml
rename to src/Mvc/test/WebSites/RazorPagesWebSite/Pages/ModelWithAuthFilter.cshtml
diff --git a/src/Mvc/test/WebSites/RazorPagesWebSite/StartupWithEndpointRouting.cs b/src/Mvc/test/WebSites/RazorPagesWebSite/StartupWithEndpointRouting.cs
new file mode 100644
index 0000000000..3483ad0b0f
--- /dev/null
+++ b/src/Mvc/test/WebSites/RazorPagesWebSite/StartupWithEndpointRouting.cs
@@ -0,0 +1,36 @@
+// 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.Authentication.Cookies;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace RazorPagesWebSite
+{
+ public class StartupWithEndpointRouting
+ {
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
+ .AddCookie(options => options.LoginPath = "/Login");
+
+ services.AddMvc()
+ .AddRazorPagesOptions(options =>
+ {
+ options.Conventions.AuthorizeFolder("/Admin");
+ })
+ .SetCompatibilityVersion(CompatibilityVersion.Latest);
+ }
+
+ public void Configure(IApplicationBuilder app)
+ {
+ app.UseRouting(routes =>
+ {
+ routes.MapApplication();
+ });
+
+ app.UseAuthorization();
+ }
+ }
+}
diff --git a/src/Mvc/test/WebSites/RazorWebSite/Controllers/EmbeddedViewsController.cs b/src/Mvc/test/WebSites/RazorWebSite/Controllers/EmbeddedViewsController.cs
deleted file mode 100644
index d170e5cf57..0000000000
--- a/src/Mvc/test/WebSites/RazorWebSite/Controllers/EmbeddedViewsController.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using Microsoft.AspNetCore.Mvc;
-
-namespace RazorWebSite.Controllers
-{
- public class EmbeddedViewsController : Controller
- {
- public IActionResult Index() => null;
-
- public IActionResult LookupByName() => View("Index");
-
- public IActionResult LookupByPath() => View("/Views/EmbeddedViews/Index.cshtml");
-
- public IActionResult RelativeNonPath() => View();
- }
-}
diff --git a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedShared/_Layout.cshtml b/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedShared/_Layout.cshtml
deleted file mode 100644
index e16c087dfd..0000000000
--- a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedShared/_Layout.cshtml
+++ /dev/null
@@ -1 +0,0 @@
-@RenderBody()
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedShared/_Partial.cshtml b/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedShared/_Partial.cshtml
deleted file mode 100644
index b34fab2eec..0000000000
--- a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedShared/_Partial.cshtml
+++ /dev/null
@@ -1 +0,0 @@
-Hello from EmbeddedShared/_Partial
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/EmbeddedPartial.cshtml b/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/EmbeddedPartial.cshtml
deleted file mode 100644
index cebe57816a..0000000000
--- a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/EmbeddedPartial.cshtml
+++ /dev/null
@@ -1 +0,0 @@
-Hello from EmbeddedHome\EmbeddedPartial
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/Index.cshtml b/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/Index.cshtml
deleted file mode 100644
index 0084534e52..0000000000
--- a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/Index.cshtml
+++ /dev/null
@@ -1,3 +0,0 @@
-@(await Html.PartialAsync("../EmbeddedShared/_Partial.cshtml"))
-@(await Html.PartialAsync("_EmbeddedPartial"))
-Tag Helper Link
diff --git a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/RelativeNonPath.cshtml b/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/RelativeNonPath.cshtml
deleted file mode 100644
index 03303e5f91..0000000000
--- a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/RelativeNonPath.cshtml
+++ /dev/null
@@ -1,2 +0,0 @@
-@{ Layout = "../EmbeddedShared/_Layout"; }
-@(await Html.PartialAsync("./EmbeddedPartial"))
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/_ViewImports.cshtml b/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/_ViewImports.cshtml
deleted file mode 100644
index 9018c7897f..0000000000
--- a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/_ViewImports.cshtml
+++ /dev/null
@@ -1 +0,0 @@
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/_ViewStart.cshtml b/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/_ViewStart.cshtml
deleted file mode 100644
index e4209d9008..0000000000
--- a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/EmbeddedViews/_ViewStart.cshtml
+++ /dev/null
@@ -1 +0,0 @@
-@{ Layout = "/Views/EmbeddedShared/_Layout.cshtml"; }
diff --git a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/Shared/_EmbeddedPartial.cshtml b/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/Shared/_EmbeddedPartial.cshtml
deleted file mode 100644
index ef09462726..0000000000
--- a/src/Mvc/test/WebSites/RazorWebSite/EmbeddedResources/Views/Shared/_EmbeddedPartial.cshtml
+++ /dev/null
@@ -1 +0,0 @@
-Hello from Shared/_EmbeddedPartial
\ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RazorWebSite/RazorWebSite.csproj b/src/Mvc/test/WebSites/RazorWebSite/RazorWebSite.csproj
index 17402ce6bc..edf7a035d9 100644
--- a/src/Mvc/test/WebSites/RazorWebSite/RazorWebSite.csproj
+++ b/src/Mvc/test/WebSites/RazorWebSite/RazorWebSite.csproj
@@ -1,4 +1,4 @@
-
+
netcoreapp3.0
@@ -6,10 +6,6 @@
true
-
-
-
-
diff --git a/src/Mvc/test/WebSites/RazorWebSite/Startup.cs b/src/Mvc/test/WebSites/RazorWebSite/Startup.cs
index 1be982ca9c..f49df81d55 100644
--- a/src/Mvc/test/WebSites/RazorWebSite/Startup.cs
+++ b/src/Mvc/test/WebSites/RazorWebSite/Startup.cs
@@ -3,14 +3,12 @@
using System.Collections.Generic;
using System.Globalization;
-using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.FileProviders;
namespace RazorWebSite
{
@@ -18,8 +16,6 @@ namespace RazorWebSite
{
public void ConfigureServices(IServiceCollection services)
{
- var updateableFileProvider = new UpdateableFileProvider();
- services.AddSingleton(updateableFileProvider);
services.AddSingleton();
services.AddSingleton();
diff --git a/src/Mvc/test/WebSites/RoutingWebSite/Controllers/NonParameterConstraintController.cs b/src/Mvc/test/WebSites/RoutingWebSite/Controllers/NonParameterConstraintController.cs
new file mode 100644
index 0000000000..af9ac7e600
--- /dev/null
+++ b/src/Mvc/test/WebSites/RoutingWebSite/Controllers/NonParameterConstraintController.cs
@@ -0,0 +1,26 @@
+// 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.Mvc;
+
+namespace RoutingWebSite
+{
+ public class NonParameterConstraintController : Controller
+ {
+ private readonly TestResponseGenerator _generator;
+
+ public NonParameterConstraintController(TestResponseGenerator generator)
+ {
+ _generator = generator;
+ }
+
+ public IActionResult Index()
+ {
+ return _generator.Generate("/NonParameterConstraintRoute/NonParameterConstraint/Index");
+ }
+ }
+}
diff --git a/src/Mvc/test/WebSites/RoutingWebSite/QueryStringConstraint.cs b/src/Mvc/test/WebSites/RoutingWebSite/QueryStringConstraint.cs
new file mode 100644
index 0000000000..d4661e0139
--- /dev/null
+++ b/src/Mvc/test/WebSites/RoutingWebSite/QueryStringConstraint.cs
@@ -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.Http;
+using Microsoft.AspNetCore.Routing;
+
+namespace RoutingWebSite
+{
+ public class QueryStringConstraint : IRouteConstraint
+ {
+ public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
+ {
+ return httpContext.Request.Query["allowed"].ToString() == "true";
+ }
+ }
+}
diff --git a/src/Mvc/test/WebSites/RoutingWebSite/Startup.cs b/src/Mvc/test/WebSites/RoutingWebSite/Startup.cs
index fe1765b123..ce27bce2a2 100644
--- a/src/Mvc/test/WebSites/RoutingWebSite/Startup.cs
+++ b/src/Mvc/test/WebSites/RoutingWebSite/Startup.cs
@@ -41,6 +41,12 @@ namespace RoutingWebSite
{
app.UseMvc(routes =>
{
+ routes.MapRoute(
+ "NonParameterConstraintRoute",
+ "NonParameterConstraintRoute/{controller}/{action}",
+ defaults: null,
+ constraints: new { controller = "NonParameterConstraint", nonParameter = new QueryStringConstraint() });
+
routes.MapRoute(
"DataTokensRoute",
"DataTokensRoute/{controller}/{action}",
diff --git a/src/ProjectTemplates/Directory.Build.props b/src/ProjectTemplates/Directory.Build.props
new file mode 100644
index 0000000000..6b4dafa228
--- /dev/null
+++ b/src/ProjectTemplates/Directory.Build.props
@@ -0,0 +1,10 @@
+
+
+
+
+
+ false
+
+
+
+
diff --git a/src/ProjectTemplates/Directory.Build.targets b/src/ProjectTemplates/Directory.Build.targets
new file mode 100644
index 0000000000..ddcc593ac3
--- /dev/null
+++ b/src/ProjectTemplates/Directory.Build.targets
@@ -0,0 +1,10 @@
+
+
+
+
+ false
+
+
+
+
+
diff --git a/src/ProjectTemplates/GenerateContent.targets b/src/ProjectTemplates/GenerateContent.targets
new file mode 100644
index 0000000000..33ca50461e
--- /dev/null
+++ b/src/ProjectTemplates/GenerateContent.targets
@@ -0,0 +1,54 @@
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+
+
+ <_GenerateContentPropertiesHashFile>$(IntermediateOutputPath)$(MSBuildProjectName).content.g.cache
+
+
+
+ $(GeneratedContentProperties);
+ MicrosoftAspNetCoreAppPackageVersion=$(SharedFxVersion);
+
+
+
+
+
+
+
+
+
+
+
+
+ $(GeneratedContentProperties);
+ @(_ResolvedPackageVersionVariableReference->'%(VersionVariableName)=%(PackageVersion)')
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Templating/src/SetPackageProperties.targets b/src/ProjectTemplates/SetPackageProperties.targets
similarity index 100%
rename from src/Templating/src/SetPackageProperties.targets
rename to src/ProjectTemplates/SetPackageProperties.targets
diff --git a/src/Templating/src/THIRD-PARTY-NOTICES b/src/ProjectTemplates/THIRD-PARTY-NOTICES
similarity index 100%
rename from src/Templating/src/THIRD-PARTY-NOTICES
rename to src/ProjectTemplates/THIRD-PARTY-NOTICES
diff --git a/src/Templating/src/Directory.Build.props b/src/ProjectTemplates/TemplateProjects.props
similarity index 67%
rename from src/Templating/src/Directory.Build.props
rename to src/ProjectTemplates/TemplateProjects.props
index fbd5ab84f5..8252226702 100644
--- a/src/Templating/src/Directory.Build.props
+++ b/src/ProjectTemplates/TemplateProjects.props
@@ -1,15 +1,17 @@
-
- false
False
False
False
- 2008;8021
+ false
+ false
+ $(NoWarn);2008;8021
aspnet;templates
$(MSBuildThisFileDirectory)templates.nuspec
$(MSBuildProjectDirectory)
+ false
+ false
@@ -18,11 +20,7 @@
-
-
-
-
-
+
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/Microsoft.DotNet.Web.Client.ItemTemplates.csproj b/src/ProjectTemplates/Web.Client.ItemTemplates/Microsoft.DotNet.Web.Client.ItemTemplates.csproj
similarity index 87%
rename from src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/Microsoft.DotNet.Web.Client.ItemTemplates.csproj
rename to src/ProjectTemplates/Web.Client.ItemTemplates/Microsoft.DotNet.Web.Client.ItemTemplates.csproj
index 9c3e04798e..1b409ca7ec 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/Microsoft.DotNet.Web.Client.ItemTemplates.csproj
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/Microsoft.DotNet.Web.Client.ItemTemplates.csproj
@@ -6,7 +6,7 @@
To install the templates in this package, run 'dotnet new --install $(PackageId)::$(PackageVersion)'.
- true
+ true
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/dotnetcli.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/.template.config/dotnetcli.host.json
rename to src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/dotnetcli.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/.template.config/template.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/template.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/.template.config/template.json
rename to src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/template.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/styleSheet1.less b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/styleSheet1.less
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Less/styleSheet1.less
rename to src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/styleSheet1.less
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/dotnetcli.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/.template.config/dotnetcli.host.json
rename to src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/dotnetcli.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/.template.config/template.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/template.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/.template.config/template.json
rename to src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/template.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/styleSheet1.scss b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/styleSheet1.scss
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/Scss/styleSheet1.scss
rename to src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/styleSheet1.scss
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/dotnetcli.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/.template.config/dotnetcli.host.json
rename to src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/dotnetcli.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/.template.config/template.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/template.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/.template.config/template.json
rename to src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/template.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/file1.ts b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/file1.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Client.ItemTemplates/content/TypeScript/file1.ts
rename to src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/file1.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/Microsoft.DotNet.Web.ItemTemplates.csproj b/src/ProjectTemplates/Web.ItemTemplates/Microsoft.DotNet.Web.ItemTemplates.csproj
similarity index 87%
rename from src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/Microsoft.DotNet.Web.ItemTemplates.csproj
rename to src/ProjectTemplates/Web.ItemTemplates/Microsoft.DotNet.Web.ItemTemplates.csproj
index 609e42dc46..b274d5c506 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/Microsoft.DotNet.Web.ItemTemplates.csproj
+++ b/src/ProjectTemplates/Web.ItemTemplates/Microsoft.DotNet.Web.ItemTemplates.csproj
@@ -5,7 +5,7 @@
Web File Templates for Microsoft Template Engine
To install the templates in this package, run 'dotnet new --install $(PackageId)::$(PackageVersion)'.
- true
+ true
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/dotnetcli.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/.template.config/dotnetcli.host.json
rename to src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/dotnetcli.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/.template.config/template.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/template.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/.template.config/template.json
rename to src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/template.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/Index.cshtml b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/Index.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/Index.cshtml
rename to src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/Index.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/Index.cshtml.cs b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/Index.cshtml.cs
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/RazorPage/Index.cshtml.cs
rename to src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/Index.cshtml.cs
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/dotnetcli.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/.template.config/dotnetcli.host.json
rename to src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/dotnetcli.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/.template.config/template.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/template.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/.template.config/template.json
rename to src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/template.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/_ViewImports.cshtml b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/_ViewImports.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewImports/_ViewImports.cshtml
rename to src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/_ViewImports.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/dotnetcli.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/.template.config/dotnetcli.host.json
rename to src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/dotnetcli.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/.template.config/template.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/template.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/.template.config/template.json
rename to src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/template.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/_ViewStart.cshtml b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/_ViewStart.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ItemTemplates/content/ViewStart/_ViewStart.cshtml
rename to src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/_ViewStart.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/.gitignore b/src/ProjectTemplates/Web.ProjectTemplates/.gitignore
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/.gitignore
rename to src/ProjectTemplates/Web.ProjectTemplates/.gitignore
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-CSharp.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/EmptyWeb-CSharp.csproj.in
similarity index 85%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-CSharp.csproj.in
rename to src/ProjectTemplates/Web.ProjectTemplates/EmptyWeb-CSharp.csproj.in
index 182ae2e7bf..1a00211608 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-CSharp.csproj.in
+++ b/src/ProjectTemplates/Web.ProjectTemplates/EmptyWeb-CSharp.csproj.in
@@ -3,7 +3,6 @@
netcoreapp3.0
True
- InProcess
Company.WebApplication1
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-FSharp.fsproj.in b/src/ProjectTemplates/Web.ProjectTemplates/EmptyWeb-FSharp.fsproj.in
similarity index 88%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-FSharp.fsproj.in
rename to src/ProjectTemplates/Web.ProjectTemplates/EmptyWeb-FSharp.fsproj.in
index 465baa7051..75b7c9f84a 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/EmptyWeb-FSharp.fsproj.in
+++ b/src/ProjectTemplates/Web.ProjectTemplates/EmptyWeb-FSharp.fsproj.in
@@ -3,7 +3,6 @@
netcoreapp3.0
True
- InProcess
Company.WebApplication1
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj b/src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj
new file mode 100644
index 0000000000..75423fcdc0
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj
@@ -0,0 +1,50 @@
+
+
+
+ netcoreapp3.0
+ Microsoft.DotNet.Web.ProjectTemplates.$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion)
+ ASP.NET Core Web Template Pack for Microsoft Template Engine
+
+ To install the templates in this package, run 'dotnet new --install $(PackageId)::$(PackageVersion)'.
+ true
+
+
+
+
+
+ MicrosoftAspNetCoreMvcRazorRuntimeCompilationPackageVersion=$(MicrosoftAspNetCoreMvcRazorRuntimeCompilationPackageVersion);
+ MicrosoftEntityFrameworkCoreSqlitePackageVersion=$(MicrosoftEntityFrameworkCoreSqlitePackageVersion);
+ MicrosoftEntityFrameworkCoreSqlServerPackageVersion=$(MicrosoftEntityFrameworkCoreSqlServerPackageVersion);
+ MicrosoftEntityFrameworkCoreToolsPackageVersion=$(MicrosoftEntityFrameworkCoreToolsPackageVersion);
+ MicrosoftNETCoreAppPackageVersion=$(MicrosoftNETCoreAppPackageVersion);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorClassLibrary-CSharp.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/RazorClassLibrary-CSharp.csproj.in
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorClassLibrary-CSharp.csproj.in
rename to src/ProjectTemplates/Web.ProjectTemplates/RazorClassLibrary-CSharp.csproj.in
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorComponentsWeb-CSharp.App.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/RazorComponentsWeb-CSharp.App.csproj.in
similarity index 67%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorComponentsWeb-CSharp.App.csproj.in
rename to src/ProjectTemplates/Web.ProjectTemplates/RazorComponentsWeb-CSharp.App.csproj.in
index 8766fab7d0..6a4069f993 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorComponentsWeb-CSharp.App.csproj.in
+++ b/src/ProjectTemplates/Web.ProjectTemplates/RazorComponentsWeb-CSharp.App.csproj.in
@@ -6,10 +6,9 @@
RazorComponentsWeb_CSharp.App
-
-
-
+
+
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorComponentsWeb-CSharp.Server.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/RazorComponentsWeb-CSharp.Server.csproj.in
similarity index 82%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorComponentsWeb-CSharp.Server.csproj.in
rename to src/ProjectTemplates/Web.ProjectTemplates/RazorComponentsWeb-CSharp.Server.csproj.in
index 970e5e45cc..4f089b0076 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorComponentsWeb-CSharp.Server.csproj.in
+++ b/src/ProjectTemplates/Web.ProjectTemplates/RazorComponentsWeb-CSharp.Server.csproj.in
@@ -2,9 +2,7 @@
netcoreapp3.0
-
True
- InProcess
RazorComponentsWeb_CSharp.Server
@@ -13,7 +11,7 @@
-
+
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in
similarity index 93%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in
rename to src/ProjectTemplates/Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in
index 60d4c2d807..1b8a5103ff 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in
+++ b/src/ProjectTemplates/Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in
@@ -6,7 +6,6 @@
0
1
True
- InProcess
Company.WebApplication1
@@ -17,7 +16,7 @@
-
+
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-CSharp.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-CSharp.csproj.in
similarity index 97%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-CSharp.csproj.in
rename to src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-CSharp.csproj.in
index df6ccde31c..c6fbbb7bf0 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-CSharp.csproj.in
+++ b/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-CSharp.csproj.in
@@ -6,7 +6,6 @@
0
1
True
- InProcess
Company.WebApplication1
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in b/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in
similarity index 82%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in
rename to src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in
index 8cce709251..40c54ea3be 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in
+++ b/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in
@@ -3,7 +3,6 @@
netcoreapp3.0
True
- InProcess
Company.WebApplication1
@@ -16,6 +15,7 @@
+
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-CSharp.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/WebApi-CSharp.csproj.in
similarity index 95%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-CSharp.csproj.in
rename to src/ProjectTemplates/Web.ProjectTemplates/WebApi-CSharp.csproj.in
index 15dd837559..bc72c6f34f 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-CSharp.csproj.in
+++ b/src/ProjectTemplates/Web.ProjectTemplates/WebApi-CSharp.csproj.in
@@ -6,7 +6,6 @@
0
1
True
- InProcess
Company.WebApplication1
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-FSharp.fsproj.in b/src/ProjectTemplates/Web.ProjectTemplates/WebApi-FSharp.fsproj.in
similarity index 91%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-FSharp.fsproj.in
rename to src/ProjectTemplates/Web.ProjectTemplates/WebApi-FSharp.fsproj.in
index 3101bda956..ad52e94ac5 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/WebApi-FSharp.fsproj.in
+++ b/src/ProjectTemplates/Web.ProjectTemplates/WebApi-FSharp.fsproj.in
@@ -3,7 +3,6 @@
netcoreapp3.0
True
- InProcess
Company.WebApplication1
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Directory.Build.props b/src/ProjectTemplates/Web.ProjectTemplates/content/Directory.Build.props
similarity index 81%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Directory.Build.props
rename to src/ProjectTemplates/Web.ProjectTemplates/content/Directory.Build.props
index 7916bd8054..5e2e694454 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Directory.Build.props
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Directory.Build.props
@@ -1,5 +1,5 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/React-CSharp.csproj.in b/src/ProjectTemplates/Web.Spa.ProjectTemplates/React-CSharp.csproj.in
similarity index 94%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/React-CSharp.csproj.in
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/React-CSharp.csproj.in
index 6bc19b7bd4..22d694c71a 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/React-CSharp.csproj.in
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/React-CSharp.csproj.in
@@ -12,6 +12,7 @@
+
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/ReactRedux-CSharp.csproj.in b/src/ProjectTemplates/Web.Spa.ProjectTemplates/ReactRedux-CSharp.csproj.in
similarity index 94%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/ReactRedux-CSharp.csproj.in
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/ReactRedux-CSharp.csproj.in
index 71a0a80686..eee417f529 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/ReactRedux-CSharp.csproj.in
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/ReactRedux-CSharp.csproj.in
@@ -12,6 +12,7 @@
+
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.gitignore b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/.gitignore
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.gitignore
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/.gitignore
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/dotnetcli.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/dotnetcli.host.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/dotnetcli.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/icon.png b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/icon.png
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/icon.png
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/icon.png
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/template.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/template.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/template.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/vs-2017.3.host.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/vs-2017.3.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/vs-2017.3.host.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/.template.config/vs-2017.3.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/.editorconfig b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/.editorconfig
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/.editorconfig
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/.editorconfig
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/.gitignore b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/.gitignore
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/.gitignore
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/.gitignore
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/README.md b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/README.md
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/README.md
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/README.md
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/angular.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/angular.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/angular.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/angular.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/protractor.conf.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/protractor.conf.js
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/protractor.conf.js
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/protractor.conf.js
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/src/app.e2e-spec.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/src/app.e2e-spec.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/src/app.e2e-spec.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/src/app.e2e-spec.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/src/app.po.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/src/app.po.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/src/app.po.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/src/app.po.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/tsconfig.e2e.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/tsconfig.e2e.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/tsconfig.e2e.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/e2e/tsconfig.e2e.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/package-lock.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/package-lock.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/package-lock.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/package-lock.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/package.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/package.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/package.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/package.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.component.html b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.component.html
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.component.html
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.component.html
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.component.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.component.ts
similarity index 63%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.component.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.component.ts
index 7b0f672831..0a40b8c1ed 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.component.ts
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.component.ts
@@ -2,8 +2,7 @@ import { Component } from '@angular/core';
@Component({
selector: 'app-root',
- templateUrl: './app.component.html',
- styleUrls: ['./app.component.css']
+ templateUrl: './app.component.html'
})
export class AppComponent {
title = 'app';
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.module.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.module.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.module.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.module.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.server.module.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.server.module.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.server.module.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/app.server.module.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.html b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.html
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.html
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.html
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.spec.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.spec.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.spec.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.spec.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/counter/counter.component.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/fetch-data/fetch-data.component.html b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/fetch-data/fetch-data.component.html
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/fetch-data/fetch-data.component.html
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/fetch-data/fetch-data.component.html
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/fetch-data/fetch-data.component.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/fetch-data/fetch-data.component.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/fetch-data/fetch-data.component.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/fetch-data/fetch-data.component.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/home/home.component.html b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/home/home.component.html
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/home/home.component.html
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/home/home.component.html
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/home/home.component.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/home/home.component.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/home/home.component.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/home/home.component.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.css b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.css
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.css
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.css
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.html b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.html
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.html
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.html
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/app/nav-menu/nav-menu.component.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/assets/.gitkeep b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/assets/.gitkeep
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/assets/.gitkeep
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/assets/.gitkeep
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/browserslist b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/browserslist
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/browserslist
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/browserslist
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/environments/environment.prod.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/environments/environment.prod.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/environments/environment.prod.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/environments/environment.prod.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/environments/environment.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/environments/environment.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/environments/environment.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/environments/environment.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/index.html b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/index.html
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/index.html
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/index.html
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/karma.conf.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/karma.conf.js
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/karma.conf.js
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/karma.conf.js
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/main.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/main.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/main.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/main.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/polyfills.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/polyfills.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/polyfills.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/polyfills.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/styles.css b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/styles.css
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/styles.css
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/styles.css
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/test.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/test.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/test.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/test.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.app.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.app.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.app.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.app.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.server.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.server.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.server.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.server.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.spec.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.spec.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.spec.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tsconfig.spec.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tslint.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tslint.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tslint.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/src/tslint.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/tsconfig.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/tsconfig.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/tsconfig.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/tsconfig.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/tslint.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/tslint.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/tslint.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/ClientApp/tslint.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Controllers/SampleDataController.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Controllers/SampleDataController.cs
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Controllers/SampleDataController.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Controllers/SampleDataController.cs
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/Error.cshtml b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/Error.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/Error.cshtml
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/Error.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/Error.cshtml.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/Error.cshtml.cs
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/Error.cshtml.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/Error.cshtml.cs
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/_ViewImports.cshtml b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/_ViewImports.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/_ViewImports.cshtml
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Pages/_ViewImports.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Program.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Program.cs
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Program.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Program.cs
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Properties/launchSettings.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Properties/launchSettings.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Properties/launchSettings.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Startup.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Startup.cs
similarity index 97%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Startup.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Startup.cs
index 5758f368c1..14cfb842b4 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/Startup.cs
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/Startup.cs
@@ -22,7 +22,8 @@ namespace Company.WebApplication1
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
- services.AddMvc();
+ services.AddMvc()
+ .AddNewtonsoftJson();
// In production, the Angular files will be served from this directory
services.AddSpaStaticFiles(configuration =>
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/appsettings.Development.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/appsettings.Development.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/appsettings.Development.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/appsettings.Development.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/appsettings.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/appsettings.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-CSharp/appsettings.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/appsettings.json
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/favicon.ico b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/wwwroot/favicon.ico
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/favicon.ico
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Angular-CSharp/wwwroot/favicon.ico
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/Directory.Build.props b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Directory.Build.props
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/Directory.Build.props
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Directory.Build.props
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Directory.Build.targets b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Directory.Build.targets
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Directory.Build.targets
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/Directory.Build.targets
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.gitignore b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/.gitignore
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.gitignore
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/.gitignore
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/dotnetcli.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/dotnetcli.host.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/dotnetcli.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/icon.png b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/icon.png
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/icon.png
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/icon.png
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/template.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/template.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/template.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/vs-2017.3.host.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/vs-2017.3.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/vs-2017.3.host.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/.template.config/vs-2017.3.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/.eslintrc.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/.eslintrc.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/.eslintrc.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/.eslintrc.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/.gitignore b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/.gitignore
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/.gitignore
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/.gitignore
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/README.md b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/README.md
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/README.md
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/README.md
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/package-lock.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/package-lock.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/package-lock.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/package-lock.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/package.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/package.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/package.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/package.json
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/favicon.ico b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/favicon.ico
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/favicon.ico
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/favicon.ico
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/index.html b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/index.html
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/index.html
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/index.html
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/manifest.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/manifest.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/manifest.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/manifest.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/scss/custom.scss b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/scss/custom.scss
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/scss/custom.scss
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/scss/custom.scss
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.js
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.js
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.js
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.test.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.test.js
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.test.js
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.test.js
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/App.test.tsx b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.test.tsx
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/App.test.tsx
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.test.tsx
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/App.tsx b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.tsx
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/App.tsx
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/App.tsx
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Counter.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Counter.js
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Counter.js
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Counter.js
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Counter.tsx b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Counter.tsx
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Counter.tsx
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Counter.tsx
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/FetchData.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/FetchData.js
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/FetchData.js
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/FetchData.js
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/FetchData.tsx b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/FetchData.tsx
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/FetchData.tsx
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/FetchData.tsx
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Home.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Home.js
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Home.js
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Home.js
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Home.tsx b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Home.tsx
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Home.tsx
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Home.tsx
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Layout.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Layout.js
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Layout.js
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Layout.js
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Layout.tsx b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Layout.tsx
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Layout.tsx
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/Layout.tsx
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/NavMenu.css b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/NavMenu.css
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/NavMenu.css
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/NavMenu.css
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/NavMenu.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/NavMenu.js
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/NavMenu.js
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/NavMenu.js
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/NavMenu.tsx b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/NavMenu.tsx
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/NavMenu.tsx
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/components/NavMenu.tsx
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/index.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/index.js
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/index.js
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/index.js
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/index.tsx b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/index.tsx
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/index.tsx
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/index.tsx
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/react-app-env.d.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/react-app-env.d.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/react-app-env.d.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/react-app-env.d.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/registerServiceWorker.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/registerServiceWorker.js
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/registerServiceWorker.js
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/registerServiceWorker.js
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/registerServiceWorker.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/registerServiceWorker.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/registerServiceWorker.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/registerServiceWorker.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/Counter.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/store/Counter.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/Counter.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/store/Counter.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/WeatherForecasts.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/store/WeatherForecasts.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/WeatherForecasts.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/store/WeatherForecasts.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/configureStore.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/store/configureStore.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/configureStore.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/store/configureStore.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/index.ts b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/store/index.ts
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/index.ts
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/src/store/index.ts
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/tsconfig.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/tsconfig.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/tsconfig.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/tsconfig.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Controllers/SampleDataController.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Controllers/SampleDataController.cs
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Controllers/SampleDataController.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Controllers/SampleDataController.cs
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Pages/Error.cshtml b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Pages/Error.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Pages/Error.cshtml
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Pages/Error.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Pages/Error.cshtml.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Pages/Error.cshtml.cs
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Pages/Error.cshtml.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Pages/Error.cshtml.cs
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Pages/_ViewImports.cshtml b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Pages/_ViewImports.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Pages/_ViewImports.cshtml
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Pages/_ViewImports.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Program.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Program.cs
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Program.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Program.cs
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Properties/launchSettings.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Properties/launchSettings.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Properties/launchSettings.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Startup.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Startup.cs
similarity index 96%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Startup.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Startup.cs
index 3009a15b7f..9b8508ddab 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Startup.cs
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/Startup.cs
@@ -22,7 +22,8 @@ namespace Company.WebApplication1
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
- services.AddMvc();
+ services.AddMvc()
+ .AddNewtonsoftJson();
// In production, the React files will be served from this directory
services.AddSpaStaticFiles(configuration =>
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/appsettings.Development.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/appsettings.Development.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/appsettings.Development.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/appsettings.Development.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/appsettings.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/appsettings.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/EmptyWeb-FSharp/appsettings.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/React-CSharp/appsettings.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.gitignore b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.gitignore
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.gitignore
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.gitignore
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/dotnetcli.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/dotnetcli.host.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/dotnetcli.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/icon.png b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/icon.png
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/icon.png
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/icon.png
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/template.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/template.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/template.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/vs-2017.3.host.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/vs-2017.3.host.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/vs-2017.3.host.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/.template.config/vs-2017.3.host.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/.gitignore b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/.gitignore
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/.gitignore
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/.gitignore
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/README.md b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/README.md
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/README.md
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/README.md
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/package-lock.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/package-lock.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/package-lock.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/package-lock.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/package.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/package.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/package.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/package.json
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/favicon.ico b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/favicon.ico
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/favicon.ico
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/favicon.ico
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/index.html b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/index.html
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/index.html
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/index.html
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/manifest.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/manifest.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/manifest.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/manifest.json
diff --git a/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Counter.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Counter.js
new file mode 100644
index 0000000000..6513638424
--- /dev/null
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Counter.js
@@ -0,0 +1,21 @@
+import React from 'react';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import { actionCreators } from '../store/Counter';
+
+const Counter = props => (
+
+
Counter
+
+
This is a simple example of a React component.
+
+
Current count: {props.count}
+
+
Increment
+
+);
+
+export default connect(
+ state => state.counter,
+ dispatch => bindActionCreators(actionCreators, dispatch)
+)(Counter);
diff --git a/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/FetchData.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/FetchData.js
new file mode 100644
index 0000000000..73a98881ed
--- /dev/null
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/FetchData.js
@@ -0,0 +1,74 @@
+import React, { Component } from 'react';
+import { bindActionCreators } from 'redux';
+import { connect } from 'react-redux';
+import { Link } from 'react-router-dom';
+import { actionCreators } from '../store/WeatherForecasts';
+
+class FetchData extends Component {
+ componentDidMount() {
+ // This method is called when the component is first added to the document
+ this.ensureDataFetched();
+ }
+
+ componentDidUpdate() {
+ // This method is called when the route parameters change
+ this.ensureDataFetched();
+ }
+
+ ensureDataFetched() {
+ const startDateIndex = parseInt(this.props.match.params.startDateIndex, 10) || 0;
+ this.props.requestWeatherForecasts(startDateIndex);
+ }
+
+ render() {
+ return (
+
+
Weather forecast
+
This component demonstrates fetching data from the server and working with URL parameters.
+ {renderForecastsTable(this.props)}
+ {renderPagination(this.props)}
+
+ );
+ }
+}
+
+function renderForecastsTable(props) {
+ return (
+
+
+
+ Date
+ Temp. (C)
+ Temp. (F)
+ Summary
+
+
+
+ {props.forecasts.map(forecast =>
+
+ {forecast.dateFormatted}
+ {forecast.temperatureC}
+ {forecast.temperatureF}
+ {forecast.summary}
+
+ )}
+
+
+ );
+}
+
+function renderPagination(props) {
+ const prevStartDateIndex = (props.startDateIndex || 0) - 5;
+ const nextStartDateIndex = (props.startDateIndex || 0) + 5;
+
+ return
+ Previous
+ Next
+ {props.isLoading ? Loading... : []}
+
;
+}
+
+export default connect(
+ state => state.weatherForecasts,
+ dispatch => bindActionCreators(actionCreators, dispatch)
+)(FetchData);
diff --git a/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Home.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Home.js
new file mode 100644
index 0000000000..d2d6c8258b
--- /dev/null
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Home.js
@@ -0,0 +1,23 @@
+import React from 'react';
+import { connect } from 'react-redux';
+
+const Home = props => (
+
+
Hello, world!
+
Welcome to your new single-page application, built with:
+
+
To help you get started, we've also set up:
+
+ Client-side navigation . For example, click Counter then Back to return here.
+ Development server integration . In development mode, the development server from create-react-app runs in the background automatically, so your client-side resources are dynamically built on demand and the page refreshes when you modify any file.
+ Efficient production builds . In production mode, development-time features are disabled, and your dotnet publish configuration produces minified, efficiently bundled JavaScript files.
+
+
The ClientApp subdirectory is a standard React application based on the create-react-app template. If you open a command prompt in that directory, you can run npm commands such as npm test or npm install.
+
+);
+
+export default connect()(Home);
diff --git a/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Layout.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Layout.js
new file mode 100644
index 0000000000..216fca9296
--- /dev/null
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/Layout.js
@@ -0,0 +1,12 @@
+import React from 'react';
+import { Container } from 'reactstrap';
+import NavMenu from './NavMenu';
+
+export default props => (
+
+
+
+ {props.children}
+
+
+);
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/NavMenu.css b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/NavMenu.css
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/NavMenu.css
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/NavMenu.css
diff --git a/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/NavMenu.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/NavMenu.js
new file mode 100644
index 0000000000..9eb976ab8a
--- /dev/null
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/components/NavMenu.js
@@ -0,0 +1,45 @@
+import React from 'react';
+import { Collapse, Container, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from 'reactstrap';
+import { Link } from 'react-router-dom';
+import './NavMenu.css';
+
+export default class NavMenu extends React.Component {
+ constructor (props) {
+ super(props);
+
+ this.toggle = this.toggle.bind(this);
+ this.state = {
+ isOpen: false
+ };
+ }
+ toggle () {
+ this.setState({
+ isOpen: !this.state.isOpen
+ });
+ }
+ render () {
+ return (
+
+
+
+ Company.WebApplication1
+
+
+
+
+ Home
+
+
+ Counter
+
+
+ Fetch data
+
+
+
+
+
+
+ );
+ }
+}
diff --git a/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/index.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/index.js
new file mode 100644
index 0000000000..5faeb680ba
--- /dev/null
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/index.js
@@ -0,0 +1,29 @@
+import 'bootstrap/dist/css/bootstrap.css';
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { Provider } from 'react-redux';
+import { ConnectedRouter } from 'react-router-redux';
+import { createBrowserHistory } from 'history';
+import configureStore from './store/configureStore';
+import App from './App';
+import registerServiceWorker from './registerServiceWorker';
+
+// Create browser history to use in the Redux store
+const baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');
+const history = createBrowserHistory({ basename: baseUrl });
+
+// Get the application-wide store instance, prepopulating with state from the server where available.
+const initialState = window.initialReduxState;
+const store = configureStore(history, initialState);
+
+const rootElement = document.getElementById('root');
+
+ReactDOM.render(
+
+
+
+
+ ,
+ rootElement);
+
+registerServiceWorker();
diff --git a/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/registerServiceWorker.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/registerServiceWorker.js
new file mode 100644
index 0000000000..12542ba229
--- /dev/null
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/registerServiceWorker.js
@@ -0,0 +1,108 @@
+// In production, we register a service worker to serve assets from local cache.
+
+// This lets the app load faster on subsequent visits in production, and gives
+// it offline capabilities. However, it also means that developers (and users)
+// will only see deployed updates on the "N+1" visit to a page, since previously
+// cached resources are updated in the background.
+
+// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
+// This link also includes instructions on opting out of this behavior.
+
+const isLocalhost = Boolean(
+ window.location.hostname === 'localhost' ||
+ // [::1] is the IPv6 localhost address.
+ window.location.hostname === '[::1]' ||
+ // 127.0.0.1/8 is considered localhost for IPv4.
+ window.location.hostname.match(
+ /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
+ )
+);
+
+export default function register() {
+ if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
+ // The URL constructor is available in all browsers that support SW.
+ const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
+ if (publicUrl.origin !== window.location.origin) {
+ // Our service worker won't work if PUBLIC_URL is on a different origin
+ // from what our page is served on. This might happen if a CDN is used to
+ // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374
+ return;
+ }
+
+ window.addEventListener('load', () => {
+ const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
+
+ if (isLocalhost) {
+ // This is running on localhost. Lets check if a service worker still exists or not.
+ checkValidServiceWorker(swUrl);
+ } else {
+ // Is not local host. Just register service worker
+ registerValidSW(swUrl);
+ }
+ });
+ }
+}
+
+function registerValidSW(swUrl) {
+ navigator.serviceWorker
+ .register(swUrl)
+ .then(registration => {
+ registration.onupdatefound = () => {
+ const installingWorker = registration.installing;
+ installingWorker.onstatechange = () => {
+ if (installingWorker.state === 'installed') {
+ if (navigator.serviceWorker.controller) {
+ // At this point, the old content will have been purged and
+ // the fresh content will have been added to the cache.
+ // It's the perfect time to display a "New content is
+ // available; please refresh." message in your web app.
+ console.log('New content is available; please refresh.');
+ } else {
+ // At this point, everything has been precached.
+ // It's the perfect time to display a
+ // "Content is cached for offline use." message.
+ console.log('Content is cached for offline use.');
+ }
+ }
+ };
+ };
+ })
+ .catch(error => {
+ console.error('Error during service worker registration:', error);
+ });
+}
+
+function checkValidServiceWorker(swUrl) {
+ // Check if the service worker can be found. If it can't reload the page.
+ fetch(swUrl)
+ .then(response => {
+ // Ensure service worker exists, and that we really are getting a JS file.
+ if (
+ response.status === 404 ||
+ response.headers.get('content-type').indexOf('javascript') === -1
+ ) {
+ // No service worker found. Probably a different app. Reload the page.
+ navigator.serviceWorker.ready.then(registration => {
+ registration.unregister().then(() => {
+ window.location.reload();
+ });
+ });
+ } else {
+ // Service worker found. Proceed as normal.
+ registerValidSW(swUrl);
+ }
+ })
+ .catch(() => {
+ console.log(
+ 'No internet connection found. App is running in offline mode.'
+ );
+ });
+}
+
+export function unregister() {
+ if ('serviceWorker' in navigator) {
+ navigator.serviceWorker.ready.then(registration => {
+ registration.unregister();
+ });
+ }
+}
diff --git a/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/Counter.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/Counter.js
new file mode 100644
index 0000000000..c3b7b101a7
--- /dev/null
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/Counter.js
@@ -0,0 +1,22 @@
+const incrementCountType = 'INCREMENT_COUNT';
+const decrementCountType = 'DECREMENT_COUNT';
+const initialState = { count: 0 };
+
+export const actionCreators = {
+ increment: () => ({ type: incrementCountType }),
+ decrement: () => ({ type: decrementCountType })
+};
+
+export const reducer = (state, action) => {
+ state = state || initialState;
+
+ if (action.type === incrementCountType) {
+ return { ...state, count: state.count + 1 };
+ }
+
+ if (action.type === decrementCountType) {
+ return { ...state, count: state.count - 1 };
+ }
+
+ return state;
+};
diff --git a/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/WeatherForecasts.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/WeatherForecasts.js
new file mode 100644
index 0000000000..6f0049030f
--- /dev/null
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/WeatherForecasts.js
@@ -0,0 +1,43 @@
+const requestWeatherForecastsType = 'REQUEST_WEATHER_FORECASTS';
+const receiveWeatherForecastsType = 'RECEIVE_WEATHER_FORECASTS';
+const initialState = { forecasts: [], isLoading: false };
+
+export const actionCreators = {
+ requestWeatherForecasts: startDateIndex => async (dispatch, getState) => {
+ if (startDateIndex === getState().weatherForecasts.startDateIndex) {
+ // Don't issue a duplicate request (we already have or are loading the requested data)
+ return;
+ }
+
+ dispatch({ type: requestWeatherForecastsType, startDateIndex });
+
+ const url = `api/SampleData/WeatherForecasts?startDateIndex=${startDateIndex}`;
+ const response = await fetch(url);
+ const forecasts = await response.json();
+
+ dispatch({ type: receiveWeatherForecastsType, startDateIndex, forecasts });
+ }
+};
+
+export const reducer = (state, action) => {
+ state = state || initialState;
+
+ if (action.type === requestWeatherForecastsType) {
+ return {
+ ...state,
+ startDateIndex: action.startDateIndex,
+ isLoading: true
+ };
+ }
+
+ if (action.type === receiveWeatherForecastsType) {
+ return {
+ ...state,
+ startDateIndex: action.startDateIndex,
+ forecasts: action.forecasts,
+ isLoading: false
+ };
+ }
+
+ return state;
+};
diff --git a/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/configureStore.js b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/configureStore.js
new file mode 100644
index 0000000000..7da6766bda
--- /dev/null
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/src/store/configureStore.js
@@ -0,0 +1,35 @@
+import { applyMiddleware, combineReducers, compose, createStore } from 'redux';
+import thunk from 'redux-thunk';
+import { routerReducer, routerMiddleware } from 'react-router-redux';
+import * as Counter from './Counter';
+import * as WeatherForecasts from './WeatherForecasts';
+
+export default function configureStore (history, initialState) {
+ const reducers = {
+ counter: Counter.reducer,
+ weatherForecasts: WeatherForecasts.reducer
+ };
+
+ const middleware = [
+ thunk,
+ routerMiddleware(history)
+ ];
+
+ // In development, use the browser's Redux dev tools extension if installed
+ const enhancers = [];
+ const isDevelopment = process.env.NODE_ENV === 'development';
+ if (isDevelopment && typeof window !== 'undefined' && window.devToolsExtension) {
+ enhancers.push(window.devToolsExtension());
+ }
+
+ const rootReducer = combineReducers({
+ ...reducers,
+ routing: routerReducer
+ });
+
+ return createStore(
+ rootReducer,
+ initialState,
+ compose(applyMiddleware(...middleware), ...enhancers)
+ );
+}
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Controllers/SampleDataController.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Controllers/SampleDataController.cs
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Controllers/SampleDataController.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Controllers/SampleDataController.cs
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/Error.cshtml b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/Error.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/Error.cshtml
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/Error.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/Error.cshtml.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/Error.cshtml.cs
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/Error.cshtml.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/Error.cshtml.cs
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/_ViewImports.cshtml b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/_ViewImports.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/_ViewImports.cshtml
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Pages/_ViewImports.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Program.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Program.cs
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Program.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Program.cs
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Properties/launchSettings.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Properties/launchSettings.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Properties/launchSettings.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Startup.cs b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Startup.cs
similarity index 96%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Startup.cs
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Startup.cs
index 3009a15b7f..9b8508ddab 100644
--- a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/Startup.cs
+++ b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/Startup.cs
@@ -22,7 +22,8 @@ namespace Company.WebApplication1
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
- services.AddMvc();
+ services.AddMvc()
+ .AddNewtonsoftJson();
// In production, the React files will be served from this directory
services.AddSpaStaticFiles(configuration =>
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/appsettings.Development.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/appsettings.Development.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/appsettings.Development.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/appsettings.Development.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorComponentsWeb-CSharp/RazorComponentsWeb-CSharp.Server/appsettings.json b/src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/appsettings.json
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorComponentsWeb-CSharp/RazorComponentsWeb-CSharp.Server/appsettings.json
rename to src/ProjectTemplates/Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/appsettings.json
diff --git a/src/Templating/build.cmd b/src/ProjectTemplates/build.cmd
similarity index 100%
rename from src/Templating/build.cmd
rename to src/ProjectTemplates/build.cmd
diff --git a/src/Templating/migrations/updateMigrations.cmd b/src/ProjectTemplates/migrations/updateMigrations.cmd
similarity index 100%
rename from src/Templating/migrations/updateMigrations.cmd
rename to src/ProjectTemplates/migrations/updateMigrations.cmd
diff --git a/src/Templating/migrations/updateProj.ps1 b/src/ProjectTemplates/migrations/updateProj.ps1
similarity index 100%
rename from src/Templating/migrations/updateProj.ps1
rename to src/ProjectTemplates/migrations/updateProj.ps1
diff --git a/src/Templating/scripts/.gitignore b/src/ProjectTemplates/scripts/.gitignore
similarity index 100%
rename from src/Templating/scripts/.gitignore
rename to src/ProjectTemplates/scripts/.gitignore
diff --git a/src/Templating/scripts/Audit-Packages.ps1 b/src/ProjectTemplates/scripts/Audit-Packages.ps1
similarity index 89%
rename from src/Templating/scripts/Audit-Packages.ps1
rename to src/ProjectTemplates/scripts/Audit-Packages.ps1
index 204c78b123..3d5dc375b9 100644
--- a/src/Templating/scripts/Audit-Packages.ps1
+++ b/src/ProjectTemplates/scripts/Audit-Packages.ps1
@@ -8,7 +8,7 @@ param(
Set-StrictMode -Version 2
$ErrorActionPreference = 'Stop'
-$contentDir = "$PSScriptRoot/../src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content"
+$contentDir = "$PSScriptRoot/../Web.Spa.ProjectTemplates/content"
foreach ($package in $contentDir) {
$spaFrameworks = Get-ChildItem -Path $package -Directory
diff --git a/src/Templating/scripts/Run-Angular-Locally.ps1 b/src/ProjectTemplates/scripts/Run-Angular-Locally.ps1
similarity index 84%
rename from src/Templating/scripts/Run-Angular-Locally.ps1
rename to src/ProjectTemplates/scripts/Run-Angular-Locally.ps1
index 53f50b852f..b764ef88ad 100644
--- a/src/Templating/scripts/Run-Angular-Locally.ps1
+++ b/src/ProjectTemplates/scripts/Run-Angular-Locally.ps1
@@ -9,4 +9,4 @@ $ErrorActionPreference = 'Stop'
. $PSScriptRoot\Test-Template.ps1
-Test-Template "angular" "angular" "Microsoft.DotNet.Web.Spa.ProjectTemplates.3.0.0-alpha1.nupkg" $true
+Test-Template "angular" "angular" "Microsoft.DotNet.Web.Spa.ProjectTemplates.3.0.0-preview-t000.nupkg" $true
diff --git a/src/ProjectTemplates/scripts/Run-EmptyWeb-Locally.ps1 b/src/ProjectTemplates/scripts/Run-EmptyWeb-Locally.ps1
new file mode 100644
index 0000000000..a0125f658a
--- /dev/null
+++ b/src/ProjectTemplates/scripts/Run-EmptyWeb-Locally.ps1
@@ -0,0 +1,12 @@
+#!/usr/bin/env pwsh
+#requires -version 4
+
+[CmdletBinding(PositionalBinding = $false)]
+param()
+
+Set-StrictMode -Version 2
+$ErrorActionPreference = 'Stop'
+
+. $PSScriptRoot\Test-Template.ps1
+
+Test-Template "web" "web" "Microsoft.DotNet.Web.ProjectTemplates.3.0.3.0.0-preview-t000.nupkg" $false
diff --git a/src/Templating/scripts/Run-Razor-Locally.ps1 b/src/ProjectTemplates/scripts/Run-Razor-Locally.ps1
similarity index 100%
rename from src/Templating/scripts/Run-Razor-Locally.ps1
rename to src/ProjectTemplates/scripts/Run-Razor-Locally.ps1
diff --git a/src/Templating/scripts/Run-React-Locally.ps1 b/src/ProjectTemplates/scripts/Run-React-Locally.ps1
similarity index 100%
rename from src/Templating/scripts/Run-React-Locally.ps1
rename to src/ProjectTemplates/scripts/Run-React-Locally.ps1
diff --git a/src/Templating/scripts/Run-ReactRedux-Locally.ps1 b/src/ProjectTemplates/scripts/Run-ReactRedux-Locally.ps1
similarity index 100%
rename from src/Templating/scripts/Run-ReactRedux-Locally.ps1
rename to src/ProjectTemplates/scripts/Run-ReactRedux-Locally.ps1
diff --git a/src/Templating/scripts/Run-Starterweb-Locally.ps1 b/src/ProjectTemplates/scripts/Run-Starterweb-Locally.ps1
similarity index 82%
rename from src/Templating/scripts/Run-Starterweb-Locally.ps1
rename to src/ProjectTemplates/scripts/Run-Starterweb-Locally.ps1
index 4eeff2e81b..a309da7e8a 100644
--- a/src/Templating/scripts/Run-Starterweb-Locally.ps1
+++ b/src/ProjectTemplates/scripts/Run-Starterweb-Locally.ps1
@@ -9,4 +9,4 @@ $ErrorActionPreference = 'Stop'
. $PSScriptRoot\Test-Template.ps1
-Test-Template "mvc" "mvc -au Individual" "Microsoft.DotNet.Web.ProjectTemplates.3.0.3.0.0-alpha1.nupkg" $false
+Test-Template "mvc" "mvc -au Individual" "Microsoft.DotNet.Web.ProjectTemplates.3.0.3.0.0-preview-t000.nupkg" $false
diff --git a/src/Templating/scripts/Test-Template.ps1 b/src/ProjectTemplates/scripts/Test-Template.ps1
similarity index 78%
rename from src/Templating/scripts/Test-Template.ps1
rename to src/ProjectTemplates/scripts/Test-Template.ps1
index bb9b028a6f..cb619ead35 100644
--- a/src/Templating/scripts/Test-Template.ps1
+++ b/src/ProjectTemplates/scripts/Test-Template.ps1
@@ -1,9 +1,9 @@
function Test-Template($templateName, $templateArgs, $templateNupkg, $isSPA) {
$tmpDir = "$PSScriptRoot/$templateName"
Remove-Item -Path $tmpDir -Recurse -ErrorAction Ignore
+ dotnet pack
- & "$PSScriptRoot/../build.cmd" /t:Package
- Run-DotnetNew "--install", "$PSScriptRoot/../artifacts/build/$templateNupkg"
+ Run-DotnetNew "--install", "$PSScriptRoot/../../../artifacts/packages/Debug/Shipping/$templateNupkg"
New-Item -ErrorAction Ignore -Path $tmpDir -ItemType Directory
Push-Location $tmpDir
@@ -20,14 +20,14 @@ function Test-Template($templateName, $templateArgs, $templateNupkg, $isSPA) {
$proj = "$tmpDir/$templateName.$extension"
$projContent = Get-Content -Path $proj -Raw
$projContent = $projContent -replace ('', "
-
+
")
$projContent | Set-Content $proj
-
+ dotnet ef migrations add mvc
dotnet publish --configuration Release
- dotnet bin\Release\netcoreapp2.2\publish\$templateName.dll
+ dotnet bin\Release\netcoreapp3.0\publish\$templateName.dll
}
finally {
Pop-Location
diff --git a/src/Templating/src/templates.nuspec b/src/ProjectTemplates/templates.nuspec
similarity index 100%
rename from src/Templating/src/templates.nuspec
rename to src/ProjectTemplates/templates.nuspec
diff --git a/src/Templating/test/Templates.Test/.gitattributes b/src/ProjectTemplates/test/.gitattributes
similarity index 100%
rename from src/Templating/test/Templates.Test/.gitattributes
rename to src/ProjectTemplates/test/.gitattributes
diff --git a/src/Templating/test/Templates.Test/BaselineTest.cs b/src/ProjectTemplates/test/BaselineTest.cs
similarity index 97%
rename from src/Templating/test/Templates.Test/BaselineTest.cs
rename to src/ProjectTemplates/test/BaselineTest.cs
index 479bf7b4a2..06fae861f1 100644
--- a/src/Templating/test/Templates.Test/BaselineTest.cs
+++ b/src/ProjectTemplates/test/BaselineTest.cs
@@ -21,7 +21,7 @@ namespace Templates.Test
{
get
{
- using (var stream = typeof(BaselineTest).Assembly.GetManifestResourceStream("Templates.Test.template-baselines.json"))
+ using (var stream = typeof(BaselineTest).Assembly.GetManifestResourceStream("ProjectTemplates.Tests.template-baselines.json"))
{
using (var jsonReader = new JsonTextReader(new StreamReader(stream)))
{
diff --git a/src/Templating/test/Templates.Test/ByteOrderMarkTest.cs b/src/ProjectTemplates/test/ByteOrderMarkTest.cs
similarity index 83%
rename from src/Templating/test/Templates.Test/ByteOrderMarkTest.cs
rename to src/ProjectTemplates/test/ByteOrderMarkTest.cs
index 791d20db4e..f36b04f5bc 100644
--- a/src/Templating/test/Templates.Test/ByteOrderMarkTest.cs
+++ b/src/ProjectTemplates/test/ByteOrderMarkTest.cs
@@ -19,15 +19,14 @@ namespace Templates.Test
}
[Theory]
- [InlineData("Microsoft.DotNet.Web.ProjectTemplates")]
- [InlineData("Microsoft.DotNet.Web.Spa.ProjectTemplates")]
- public void CheckForByteOrderMark_ForAllTemplates(string projectType)
+ [InlineData("Web.ProjectTemplates")]
+ [InlineData("Web.Spa.ProjectTemplates")]
+ public void CheckForByteOrderMark_ForAllTemplates(string projectName)
{
var currentDirectory = Directory.GetCurrentDirectory();
- var repositoryPath = Directory.GetParent(currentDirectory).Parent.Parent.Parent.Parent.FullName;
- var srcDirectory = Path.Combine(repositoryPath, "src");
- var path = Path.Combine(projectType, "content");
- var directories = Directory.GetDirectories(Path.Combine(srcDirectory, path), "*Sharp");
+ var projectTemplateDir = Directory.GetParent(currentDirectory).Parent.Parent.Parent.FullName;
+ var path = Path.Combine(projectName, "content");
+ var directories = Directory.GetDirectories(Path.Combine(projectTemplateDir, path), "*Sharp");
var filesWithBOMCharactersPresent = false;
foreach (var directory in directories)
diff --git a/src/Templating/test/Templates.Test/CdnScriptTagTests.cs b/src/ProjectTemplates/test/CdnScriptTagTests.cs
similarity index 91%
rename from src/Templating/test/Templates.Test/CdnScriptTagTests.cs
rename to src/ProjectTemplates/test/CdnScriptTagTests.cs
index 4a4ebc15f0..5b1112f1a9 100644
--- a/src/Templating/test/Templates.Test/CdnScriptTagTests.cs
+++ b/src/ProjectTemplates/test/CdnScriptTagTests.cs
@@ -13,6 +13,7 @@ using System.Linq;
using System.Net.Http;
using System.Security.Cryptography;
using System.Threading.Tasks;
+using Templates.Test.Helpers;
using Xunit;
using Xunit.Abstractions;
@@ -22,16 +23,12 @@ namespace Templates.Test
{
private readonly ITestOutputHelper _output;
private readonly HttpClient _httpClient;
- private static readonly string _solutionDir;
- private static readonly string _artifactsDir;
private static List _scriptTags;
private static List _linkTags;
static CdnScriptTagTests()
{
- _solutionDir = GetSolutionDir();
- _artifactsDir = Path.Combine(_solutionDir, "artifacts", "build");
- var packages = Directory.GetFiles(_artifactsDir, "*.nupkg");
+ var packages = MondoHelpers.GetNupkgFiles();
_scriptTags = new List();
_linkTags = new List();
@@ -164,7 +161,7 @@ namespace Templates.Test
private static string GetFileContentFromArchive(ScriptTag scriptTag, string relativeFilePath)
{
- var file = Path.Combine(_artifactsDir, scriptTag.FileName);
+ var file = MondoHelpers.GetNupkgFiles().Single(f => f.EndsWith(scriptTag.FileName));
using (var zip = new ZipArchive(File.OpenRead(file), ZipArchiveMode.Read, leaveOpen: false))
{
var entry = zip.Entries
@@ -238,20 +235,6 @@ namespace Templates.Test
return (scriptTags, linkTags);
}
- private static string GetSolutionDir()
- {
- var dir = new DirectoryInfo(AppContext.BaseDirectory);
- while (dir != null)
- {
- if (File.Exists(Path.Combine(dir.FullName, "Templating.sln")))
- {
- break;
- }
- dir = dir.Parent;
- }
- return dir.FullName;
- }
-
private static string RemoveLineEndings(string originalString)
{
return originalString.Replace("\r\n", "").Replace("\n", "");
diff --git a/src/ProjectTemplates/test/Directory.Build.targets b/src/ProjectTemplates/test/Directory.Build.targets
new file mode 100644
index 0000000000..10d44ec552
--- /dev/null
+++ b/src/ProjectTemplates/test/Directory.Build.targets
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/Templating/test/Templates.Test/EmptyWebTemplateTest.cs b/src/ProjectTemplates/test/EmptyWebTemplateTest.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/EmptyWebTemplateTest.cs
rename to src/ProjectTemplates/test/EmptyWebTemplateTest.cs
diff --git a/src/Templating/test/GenerateTestProps.targets b/src/ProjectTemplates/test/GenerateTestProps.targets
similarity index 63%
rename from src/Templating/test/GenerateTestProps.targets
rename to src/ProjectTemplates/test/GenerateTestProps.targets
index f61f5b8188..72ea315387 100644
--- a/src/Templating/test/GenerateTestProps.targets
+++ b/src/ProjectTemplates/test/GenerateTestProps.targets
@@ -2,11 +2,10 @@
- RestoreSources=$([MSBuild]::Escape($(RestoreSources)));
+ RestoreSources=$([MSBuild]::Escape("$(RestoreSources);$(ArtifactsShippingPackagesDir);$(ArtifactsNonShippingPackagesDir)"));
RuntimeFrameworkVersion=$(RuntimeFrameworkVersion);
MicrosoftNETSdkRazorPackageVersion=$(MicrosoftNETSdkRazorPackageVersion);
- BundledAspNetCoreAppTargetFrameworkVersion=$(MicrosoftAspNetCoreAppPackageVersion.Split('.')[0]).$(MicrosoftAspNetCoreAppPackageVersion.Split('.')[1]);
- BundledAspNetCoreAppPackageVersion=$(MicrosoftAspNetCoreAppPackageVersion)
+ MicrosoftAspNetCoreAppPackageVersion=$(SharedFxVersion)
diff --git a/src/Templating/test/Templates.Test/Helpers/AddFirewallExclusion.cs b/src/ProjectTemplates/test/Helpers/AddFirewallExclusion.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Helpers/AddFirewallExclusion.cs
rename to src/ProjectTemplates/test/Helpers/AddFirewallExclusion.cs
diff --git a/src/Templating/test/Templates.Test/Helpers/AspNetProcess.cs b/src/ProjectTemplates/test/Helpers/AspNetProcess.cs
similarity index 97%
rename from src/Templating/test/Templates.Test/Helpers/AspNetProcess.cs
rename to src/ProjectTemplates/test/Helpers/AspNetProcess.cs
index 570dcd4b6c..e26b75759e 100644
--- a/src/Templating/test/Templates.Test/Helpers/AspNetProcess.cs
+++ b/src/ProjectTemplates/test/Helpers/AspNetProcess.cs
@@ -119,8 +119,9 @@ namespace Templates.Test.Helpers
var listeningMessage = _process
.OutputLinesAsEnumerable
.Where(line => line != null)
- .FirstOrDefault(line => line.StartsWith(ListeningMessagePrefix, StringComparison.Ordinal));
+ .FirstOrDefault(line => line.Trim().StartsWith(ListeningMessagePrefix, StringComparison.Ordinal));
Assert.True(!string.IsNullOrEmpty(listeningMessage), $"ASP.NET process exited without listening for requests.\nOutput: { _process.Output }\nError: { _process.Error }");
+ listeningMessage = listeningMessage.Trim();
// Verify we have a valid URL to make requests to
var listeningUrlString = listeningMessage.Substring(ListeningMessagePrefix.Length);
diff --git a/src/ProjectTemplates/test/Helpers/MondoHelpers.cs b/src/ProjectTemplates/test/Helpers/MondoHelpers.cs
new file mode 100644
index 0000000000..37c564b642
--- /dev/null
+++ b/src/ProjectTemplates/test/Helpers/MondoHelpers.cs
@@ -0,0 +1,44 @@
+// 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.IO;
+
+namespace Templates.Test.Helpers
+{
+ public static class MondoHelpers
+ {
+ public static string[] GetNupkgFiles()
+ {
+ var mondoRoot = GetMondoRepoRoot();
+#if DEBUG
+ var configuration = "Debug";
+#else
+ var configuration = "Release";
+#endif
+
+ return Directory.GetFiles(Path.Combine(mondoRoot, "artifacts", "packages", configuration), "*.nupkg", SearchOption.AllDirectories);
+ }
+
+ private static string GetMondoRepoRoot()
+ {
+ return FindAncestorDirectoryContaining(".gitmodules");
+ }
+
+ private static string FindAncestorDirectoryContaining(string filename)
+ {
+ var dir = AppContext.BaseDirectory;
+ while (dir != null)
+ {
+ if (File.Exists(Path.Combine(dir, filename)))
+ {
+ return dir;
+ }
+
+ dir = Directory.GetParent(dir)?.FullName;
+ }
+
+ throw new InvalidOperationException($"Could not find any ancestor directory containing {filename} at or above {AppContext.BaseDirectory}");
+ }
+ }
+}
diff --git a/src/Templating/test/Templates.Test/Helpers/Npm.cs b/src/ProjectTemplates/test/Helpers/Npm.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Helpers/Npm.cs
rename to src/ProjectTemplates/test/Helpers/Npm.cs
diff --git a/src/Templating/test/Templates.Test/Helpers/ProcessEx.cs b/src/ProjectTemplates/test/Helpers/ProcessEx.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Helpers/ProcessEx.cs
rename to src/ProjectTemplates/test/Helpers/ProcessEx.cs
diff --git a/src/Templating/test/Templates.Test/Helpers/TemplatePackageInstaller.cs b/src/ProjectTemplates/test/Helpers/TemplatePackageInstaller.cs
similarity index 85%
rename from src/Templating/test/Templates.Test/Helpers/TemplatePackageInstaller.cs
rename to src/ProjectTemplates/test/Helpers/TemplatePackageInstaller.cs
index 304bfb3dd5..54915f3d8a 100644
--- a/src/Templating/test/Templates.Test/Helpers/TemplatePackageInstaller.cs
+++ b/src/ProjectTemplates/test/Helpers/TemplatePackageInstaller.cs
@@ -1,4 +1,4 @@
-// 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.
using System;
@@ -70,7 +70,7 @@ namespace Templates.Test.Helpers
public static ProcessEx RunDotNetNew(ITestOutputHelper output, string arguments, bool assertSuccess)
{
- lock(DotNetNewLock)
+ lock (DotNetNewLock)
{
var proc = ProcessEx.Run(
output,
@@ -100,10 +100,7 @@ namespace Templates.Test.Helpers
VerifyCannotFindTemplate(output, "reactredux");
VerifyCannotFindTemplate(output, "angular");
- // Locate the artifacts directory containing the built template packages
- var solutionDir = FindAncestorDirectoryContaining("Templating.sln");
- var artifactsDir = Path.Combine(solutionDir, "artifacts", "build");
- var builtPackages = Directory.GetFiles(artifactsDir, "*.nupkg");
+ var builtPackages = MondoHelpers.GetNupkgFiles();
foreach (var packagePath in builtPackages)
{
if (_templatePackages.Any(name => Path.GetFileName(packagePath).StartsWith(name, StringComparison.OrdinalIgnoreCase)))
@@ -146,21 +143,5 @@ namespace Templates.Test.Helpers
Directory.Delete(tempDir, recursive: true);
}
}
-
- private static string FindAncestorDirectoryContaining(string filename)
- {
- var dir = AppContext.BaseDirectory;
- while (dir != null)
- {
- if (File.Exists(Path.Combine(dir, filename)))
- {
- return dir;
- }
-
- dir = Directory.GetParent(dir)?.FullName;
- }
-
- throw new InvalidOperationException($"Could not find any ancestor directory containing {filename} at or above {AppContext.BaseDirectory}");
- }
}
}
diff --git a/src/Templating/test/Templates.Test/Helpers/TemplateTestBase.cs b/src/ProjectTemplates/test/Helpers/TemplateTestBase.cs
similarity index 97%
rename from src/Templating/test/Templates.Test/Helpers/TemplateTestBase.cs
rename to src/ProjectTemplates/test/Helpers/TemplateTestBase.cs
index 4ef1779deb..5aee2f0af9 100644
--- a/src/Templating/test/Templates.Test/Helpers/TemplateTestBase.cs
+++ b/src/ProjectTemplates/test/Helpers/TemplateTestBase.cs
@@ -56,11 +56,6 @@ $@"
var directoryBuildTargetsContent =
$@"
-
-
-
-
-
";
File.WriteAllText(Path.Combine(TemplateOutputDir, "Directory.Build.targets"), directoryBuildTargetsContent);
diff --git a/src/Templating/test/Templates.Test/Helpers/WebDriverExtensions.cs b/src/ProjectTemplates/test/Helpers/WebDriverExtensions.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Helpers/WebDriverExtensions.cs
rename to src/ProjectTemplates/test/Helpers/WebDriverExtensions.cs
diff --git a/src/Templating/test/Templates.Test/Helpers/WebDriverFactory.cs b/src/ProjectTemplates/test/Helpers/WebDriverFactory.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Helpers/WebDriverFactory.cs
rename to src/ProjectTemplates/test/Helpers/WebDriverFactory.cs
diff --git a/src/Templating/test/Templates.Test/Infrastructure/AssemblyFixtureAttribute.cs b/src/ProjectTemplates/test/Infrastructure/AssemblyFixtureAttribute.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Infrastructure/AssemblyFixtureAttribute.cs
rename to src/ProjectTemplates/test/Infrastructure/AssemblyFixtureAttribute.cs
diff --git a/src/Templating/test/Templates.Test/Infrastructure/BrowserFixture.cs b/src/ProjectTemplates/test/Infrastructure/BrowserFixture.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Infrastructure/BrowserFixture.cs
rename to src/ProjectTemplates/test/Infrastructure/BrowserFixture.cs
diff --git a/src/Templating/test/Templates.Test/Infrastructure/BrowserTestBase.cs b/src/ProjectTemplates/test/Infrastructure/BrowserTestBase.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Infrastructure/BrowserTestBase.cs
rename to src/ProjectTemplates/test/Infrastructure/BrowserTestBase.cs
diff --git a/src/Templating/test/Templates.Test/Infrastructure/CaptureSeleniumLogsAttribute.cs b/src/ProjectTemplates/test/Infrastructure/CaptureSeleniumLogsAttribute.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Infrastructure/CaptureSeleniumLogsAttribute.cs
rename to src/ProjectTemplates/test/Infrastructure/CaptureSeleniumLogsAttribute.cs
diff --git a/src/Templating/test/Templates.Test/Infrastructure/SeleniumServerFixture.cs b/src/ProjectTemplates/test/Infrastructure/SeleniumServerFixture.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Infrastructure/SeleniumServerFixture.cs
rename to src/ProjectTemplates/test/Infrastructure/SeleniumServerFixture.cs
diff --git a/src/Templating/test/Templates.Test/Infrastructure/XUnitExtensions/XUnitTestCollectionRunnerWIthAssemblyFixture.cs b/src/ProjectTemplates/test/Infrastructure/XUnitExtensions/XUnitTestCollectionRunnerWIthAssemblyFixture.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Infrastructure/XUnitExtensions/XUnitTestCollectionRunnerWIthAssemblyFixture.cs
rename to src/ProjectTemplates/test/Infrastructure/XUnitExtensions/XUnitTestCollectionRunnerWIthAssemblyFixture.cs
diff --git a/src/Templating/test/Templates.Test/Infrastructure/XUnitExtensions/XunitTestAssemblyRunnerWithAssemblyFixture.cs b/src/ProjectTemplates/test/Infrastructure/XUnitExtensions/XunitTestAssemblyRunnerWithAssemblyFixture.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Infrastructure/XUnitExtensions/XunitTestAssemblyRunnerWithAssemblyFixture.cs
rename to src/ProjectTemplates/test/Infrastructure/XUnitExtensions/XunitTestAssemblyRunnerWithAssemblyFixture.cs
diff --git a/src/Templating/test/Templates.Test/Infrastructure/XUnitExtensions/XunitTestFrameworkExecutorWithAssemblyFixture.cs b/src/ProjectTemplates/test/Infrastructure/XUnitExtensions/XunitTestFrameworkExecutorWithAssemblyFixture.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Infrastructure/XUnitExtensions/XunitTestFrameworkExecutorWithAssemblyFixture.cs
rename to src/ProjectTemplates/test/Infrastructure/XUnitExtensions/XunitTestFrameworkExecutorWithAssemblyFixture.cs
diff --git a/src/Templating/test/Templates.Test/Infrastructure/XUnitExtensions/XunitTestFrameworkWithAssemblyFixture.cs b/src/ProjectTemplates/test/Infrastructure/XUnitExtensions/XunitTestFrameworkWithAssemblyFixture.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/Infrastructure/XUnitExtensions/XunitTestFrameworkWithAssemblyFixture.cs
rename to src/ProjectTemplates/test/Infrastructure/XUnitExtensions/XunitTestFrameworkWithAssemblyFixture.cs
diff --git a/src/Templating/test/Templates.Test/MvcTemplateTest.cs b/src/ProjectTemplates/test/MvcTemplateTest.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/MvcTemplateTest.cs
rename to src/ProjectTemplates/test/MvcTemplateTest.cs
diff --git a/src/ProjectTemplates/test/ProjectTemplates.Tests.csproj b/src/ProjectTemplates/test/ProjectTemplates.Tests.csproj
new file mode 100644
index 0000000000..6e32f19f69
--- /dev/null
+++ b/src/ProjectTemplates/test/ProjectTemplates.Tests.csproj
@@ -0,0 +1,41 @@
+
+
+ netcoreapp3.0
+ $(DefineConstants);XPLAT
+
+ false
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <_Parameter1>DotNetEfFullPath
+ <_Parameter2>$([MSBuild]::EnsureTrailingSlash('$(NuGetPackageRoot)'))dotnet-ef/$(DotnetEfPackageVersion)/tools/netcoreapp3.0/any/dotnet-ef.dll
+
+
+
+
diff --git a/src/Templating/test/Templates.Test/RazorComponentsTemplateTest.cs b/src/ProjectTemplates/test/RazorComponentsTemplateTest.cs
similarity index 94%
rename from src/Templating/test/Templates.Test/RazorComponentsTemplateTest.cs
rename to src/ProjectTemplates/test/RazorComponentsTemplateTest.cs
index 34a52e2b3c..220361e2d6 100644
--- a/src/Templating/test/Templates.Test/RazorComponentsTemplateTest.cs
+++ b/src/ProjectTemplates/test/RazorComponentsTemplateTest.cs
@@ -29,7 +29,10 @@ namespace Templates.Test
" ");
File.WriteAllText(
Path.Combine(TemplateOutputDir, "Directory.Build.targets"),
- " ");
+ @"
+
+
+ ");
// Run the "server" project
ProjectName += ".Server";
diff --git a/src/Templating/test/Templates.Test/RazorPagesTemplateTest.cs b/src/ProjectTemplates/test/RazorPagesTemplateTest.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/RazorPagesTemplateTest.cs
rename to src/ProjectTemplates/test/RazorPagesTemplateTest.cs
diff --git a/src/Templating/test/Templates.Test/SpaTemplateTest/AngularTemplateTest.cs b/src/ProjectTemplates/test/SpaTemplateTest/AngularTemplateTest.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/SpaTemplateTest/AngularTemplateTest.cs
rename to src/ProjectTemplates/test/SpaTemplateTest/AngularTemplateTest.cs
diff --git a/src/Templating/test/Templates.Test/SpaTemplateTest/ReactReduxTemplateTest.cs b/src/ProjectTemplates/test/SpaTemplateTest/ReactReduxTemplateTest.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/SpaTemplateTest/ReactReduxTemplateTest.cs
rename to src/ProjectTemplates/test/SpaTemplateTest/ReactReduxTemplateTest.cs
diff --git a/src/Templating/test/Templates.Test/SpaTemplateTest/ReactTemplateTest.cs b/src/ProjectTemplates/test/SpaTemplateTest/ReactTemplateTest.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/SpaTemplateTest/ReactTemplateTest.cs
rename to src/ProjectTemplates/test/SpaTemplateTest/ReactTemplateTest.cs
diff --git a/src/Templating/test/Templates.Test/SpaTemplateTest/SpaTemplateTestBase.cs b/src/ProjectTemplates/test/SpaTemplateTest/SpaTemplateTestBase.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/SpaTemplateTest/SpaTemplateTestBase.cs
rename to src/ProjectTemplates/test/SpaTemplateTest/SpaTemplateTestBase.cs
diff --git a/src/ProjectTemplates/test/TemplateTests.props.in b/src/ProjectTemplates/test/TemplateTests.props.in
new file mode 100644
index 0000000000..9353422afa
--- /dev/null
+++ b/src/ProjectTemplates/test/TemplateTests.props.in
@@ -0,0 +1,21 @@
+
+
+ true
+ ${RestoreSources}
+ ${RuntimeFrameworkVersion}
+ ${MicrosoftNETSdkRazorPackageVersion}
+ AspNetCoreModuleV2
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Templating/test/Templates.Test/WebApiTemplateTest.cs b/src/ProjectTemplates/test/WebApiTemplateTest.cs
similarity index 100%
rename from src/Templating/test/Templates.Test/WebApiTemplateTest.cs
rename to src/ProjectTemplates/test/WebApiTemplateTest.cs
diff --git a/src/Templating/test/Templates.Test/template-baselines.json b/src/ProjectTemplates/test/template-baselines.json
similarity index 100%
rename from src/Templating/test/Templates.Test/template-baselines.json
rename to src/ProjectTemplates/test/template-baselines.json
diff --git a/src/ProjectTemplates/testassets/DotNetToolsInstaller/DotNetToolsInstaller.csproj b/src/ProjectTemplates/testassets/DotNetToolsInstaller/DotNetToolsInstaller.csproj
new file mode 100644
index 0000000000..def9d56018
--- /dev/null
+++ b/src/ProjectTemplates/testassets/DotNetToolsInstaller/DotNetToolsInstaller.csproj
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+ netcoreapp3.0
+ DotnetToolReference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Razor/Razor/src/TagHelpers/RestrictChildrenAttribute.cs b/src/Razor/Razor/src/TagHelpers/RestrictChildrenAttribute.cs
index bc4f6bac35..2c5652af8d 100644
--- a/src/Razor/Razor/src/TagHelpers/RestrictChildrenAttribute.cs
+++ b/src/Razor/Razor/src/TagHelpers/RestrictChildrenAttribute.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Razor.TagHelpers
/// as will result
/// in this attribute being ignored.
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
- public class RestrictChildrenAttribute : Attribute
+ public sealed class RestrictChildrenAttribute : Attribute
{
///
/// Instantiates a new instance of the class.
diff --git a/src/Security/AuthSamples.sln b/src/Security/AuthSamples.sln
new file mode 100644
index 0000000000..c18f74b920
--- /dev/null
+++ b/src/Security/AuthSamples.sln
@@ -0,0 +1,441 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27130.2003
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{CA4538F5-9DA8-4139-B891-A13279889F79}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{DA474CFD-7419-4747-A583-CCDC1FF71EB5}"
+ ProjectSection(SolutionItems) = preProject
+ build\common.props = build\common.props
+ build\dependencies.props = build\dependencies.props
+ EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{15E42EAC-5CBB-49EC-91FB-53743882CF2B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AuthSamples.FunctionalTests", "test\AuthSamples.FunctionalTests\AuthSamples.FunctionalTests.csproj", "{B5C26BE6-655E-4D7F-B756-F286750EF172}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cookies", "samples\Cookies\Cookies.csproj", "{7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClaimsTransformation", "samples\ClaimsTransformation\ClaimsTransformation.csproj", "{E973973F-5825-4F91-B017-93EC384B6CC8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamicSchemes", "samples\DynamicSchemes\DynamicSchemes.csproj", "{E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Identity.ExternalClaims", "samples\Identity.ExternalClaims\Identity.ExternalClaims.csproj", "{D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PathSchemeSelection", "samples\PathSchemeSelection\PathSchemeSelection.csproj", "{D467E511-71E0-4820-AFE4-2A88AA6B8849}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_dependencies", "_dependencies", "{142C8260-90B5-4D72-9564-17BFDD72F496}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore", "..\DefaultBuilder\src\Microsoft.AspNetCore.csproj", "{1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting", "..\Hosting\Hosting\src\Microsoft.AspNetCore.Hosting.csproj", "{81B41AD2-5D3D-4023-86EC-CAFE01A59174}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IntegrationTesting", "..\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj", "{1219DC35-FB59-40D3-BDEE-F67616AB7359}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.TestHost", "..\Hosting\TestHost\src\Microsoft.AspNetCore.TestHost.csproj", "{3A896D09-1E29-454A-983B-7E2060370727}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Testing", "..\Mvc\src\Microsoft.AspNetCore.Mvc.Testing\Microsoft.AspNetCore.Mvc.Testing.csproj", "{941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Cookies", "Authentication\Cookies\src\Microsoft.AspNetCore.Authentication.Cookies.csproj", "{2944F22B-746E-467B-A6FC-C003E32C3143}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc", "..\Mvc\src\Microsoft.AspNetCore.Mvc\Microsoft.AspNetCore.Mvc.csproj", "{A3053CD2-9CE9-4C30-9E25-9CAEF950B137}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.StaticFiles", "..\Middleware\StaticFiles\src\Microsoft.AspNetCore.StaticFiles.csproj", "{273EA5E9-9DFC-40B2-B4C2-80496ABE2675}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Google", "Authentication\Google\src\Microsoft.AspNetCore.Authentication.Google.csproj", "{CA598480-75BD-4999-A77A-24706262C457}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authorization", "Authorization\Core\src\Microsoft.AspNetCore.Authorization.csproj", "{659D2136-A231-405B-8B40-B3B116E5A9FB}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.DataProtection.Extensions", "..\DataProtection\Extensions\src\Microsoft.AspNetCore.DataProtection.Extensions.csproj", "{4E34175A-05EA-4E97-B49C-A4BD350A14C4}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Diagnostics", "..\Middleware\Diagnostics\src\Microsoft.AspNetCore.Diagnostics.csproj", "{E188C5B4-CF3C-431A-8B84-E3A0132D5A97}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore", "..\Middleware\Diagnostics.EntityFrameworkCore\src\Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj", "{A3844C69-785D-445E-95CE-E7FC17D5B65A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IISIntegration", "..\Servers\IIS\IISIntegration\src\Microsoft.AspNetCore.Server.IISIntegration.csproj", "{7F435FB2-DDE9-44E2-80C4-55A94E174B47}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.Kestrel", "..\Servers\Kestrel\Kestrel\src\Microsoft.AspNetCore.Server.Kestrel.csproj", "{8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity", "..\Identity\Core\src\Microsoft.AspNetCore.Identity.csproj", "{C5FAD129-AF09-433F-83A5-5601A9304CD7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Identity.EntityFrameworkCore", "..\Identity\EntityFrameworkCore\src\Microsoft.AspNetCore.Identity.EntityFrameworkCore.csproj", "{B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Facebook", "Authentication\Facebook\src\Microsoft.AspNetCore.Authentication.Facebook.csproj", "{9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Twitter", "Authentication\Twitter\src\Microsoft.AspNetCore.Authentication.Twitter.csproj", "{82C0816D-7051-4DDB-9B9E-6777973AD7AE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CustomPolicyProvider", "samples\CustomPolicyProvider\CustomPolicyProvider.csproj", "{38C0E122-64D0-497F-ABB0-C6A9C3349F02}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StaticFilesAuth", "samples\StaticFilesAuth\StaticFilesAuth.csproj", "{E1E8A599-AB42-4551-8C24-BE4404B65283}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|x64.Build.0 = Debug|Any CPU
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Debug|x86.Build.0 = Debug|Any CPU
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|x64.ActiveCfg = Release|Any CPU
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|x64.Build.0 = Release|Any CPU
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|x86.ActiveCfg = Release|Any CPU
+ {B5C26BE6-655E-4D7F-B756-F286750EF172}.Release|x86.Build.0 = Release|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Debug|x64.Build.0 = Debug|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Debug|x86.Build.0 = Debug|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Release|x64.ActiveCfg = Release|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Release|x64.Build.0 = Release|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Release|x86.ActiveCfg = Release|Any CPU
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748}.Release|x86.Build.0 = Release|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Debug|x64.Build.0 = Debug|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Debug|x86.Build.0 = Debug|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Release|x64.ActiveCfg = Release|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Release|x64.Build.0 = Release|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Release|x86.ActiveCfg = Release|Any CPU
+ {E973973F-5825-4F91-B017-93EC384B6CC8}.Release|x86.Build.0 = Release|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Debug|x64.Build.0 = Debug|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Debug|x86.Build.0 = Debug|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Release|x64.ActiveCfg = Release|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Release|x64.Build.0 = Release|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Release|x86.ActiveCfg = Release|Any CPU
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA}.Release|x86.Build.0 = Release|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Debug|x64.Build.0 = Debug|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Debug|x86.Build.0 = Debug|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Release|x64.ActiveCfg = Release|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Release|x64.Build.0 = Release|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Release|x86.ActiveCfg = Release|Any CPU
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272}.Release|x86.Build.0 = Release|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Debug|x64.Build.0 = Debug|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Debug|x86.Build.0 = Debug|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Release|x64.ActiveCfg = Release|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Release|x64.Build.0 = Release|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Release|x86.ActiveCfg = Release|Any CPU
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849}.Release|x86.Build.0 = Release|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Debug|x64.Build.0 = Debug|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Debug|x86.Build.0 = Debug|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Release|x64.ActiveCfg = Release|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Release|x64.Build.0 = Release|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Release|x86.ActiveCfg = Release|Any CPU
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F}.Release|x86.Build.0 = Release|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Debug|x64.Build.0 = Debug|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Debug|x86.Build.0 = Debug|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Release|Any CPU.Build.0 = Release|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Release|x64.ActiveCfg = Release|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Release|x64.Build.0 = Release|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Release|x86.ActiveCfg = Release|Any CPU
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174}.Release|x86.Build.0 = Release|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Debug|x64.Build.0 = Debug|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Debug|x86.Build.0 = Debug|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Release|x64.ActiveCfg = Release|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Release|x64.Build.0 = Release|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Release|x86.ActiveCfg = Release|Any CPU
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359}.Release|x86.Build.0 = Release|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Debug|x64.Build.0 = Debug|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Debug|x86.Build.0 = Debug|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Release|x64.ActiveCfg = Release|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Release|x64.Build.0 = Release|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Release|x86.ActiveCfg = Release|Any CPU
+ {3A896D09-1E29-454A-983B-7E2060370727}.Release|x86.Build.0 = Release|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Debug|x64.Build.0 = Debug|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Debug|x86.Build.0 = Debug|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Release|x64.ActiveCfg = Release|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Release|x64.Build.0 = Release|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Release|x86.ActiveCfg = Release|Any CPU
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB}.Release|x86.Build.0 = Release|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Debug|x64.Build.0 = Debug|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Debug|x86.Build.0 = Debug|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Release|x64.ActiveCfg = Release|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Release|x64.Build.0 = Release|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Release|x86.ActiveCfg = Release|Any CPU
+ {2944F22B-746E-467B-A6FC-C003E32C3143}.Release|x86.Build.0 = Release|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Debug|x64.Build.0 = Debug|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Debug|x86.Build.0 = Debug|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Release|x64.ActiveCfg = Release|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Release|x64.Build.0 = Release|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Release|x86.ActiveCfg = Release|Any CPU
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137}.Release|x86.Build.0 = Release|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Debug|x64.Build.0 = Debug|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Debug|x86.Build.0 = Debug|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Release|Any CPU.Build.0 = Release|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Release|x64.ActiveCfg = Release|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Release|x64.Build.0 = Release|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Release|x86.ActiveCfg = Release|Any CPU
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675}.Release|x86.Build.0 = Release|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Debug|x64.Build.0 = Debug|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Debug|x86.Build.0 = Debug|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Release|x64.ActiveCfg = Release|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Release|x64.Build.0 = Release|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Release|x86.ActiveCfg = Release|Any CPU
+ {CA598480-75BD-4999-A77A-24706262C457}.Release|x86.Build.0 = Release|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Debug|x64.Build.0 = Debug|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Debug|x86.Build.0 = Debug|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Release|x64.ActiveCfg = Release|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Release|x64.Build.0 = Release|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Release|x86.ActiveCfg = Release|Any CPU
+ {659D2136-A231-405B-8B40-B3B116E5A9FB}.Release|x86.Build.0 = Release|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Debug|x64.Build.0 = Debug|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Debug|x86.Build.0 = Debug|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Release|x64.ActiveCfg = Release|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Release|x64.Build.0 = Release|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Release|x86.ActiveCfg = Release|Any CPU
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4}.Release|x86.Build.0 = Release|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Debug|x64.Build.0 = Debug|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Debug|x86.Build.0 = Debug|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Release|x64.ActiveCfg = Release|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Release|x64.Build.0 = Release|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Release|x86.ActiveCfg = Release|Any CPU
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97}.Release|x86.Build.0 = Release|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Debug|x64.Build.0 = Debug|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Debug|x86.Build.0 = Debug|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Release|x64.ActiveCfg = Release|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Release|x64.Build.0 = Release|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Release|x86.ActiveCfg = Release|Any CPU
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A}.Release|x86.Build.0 = Release|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Debug|x64.Build.0 = Debug|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Debug|x86.Build.0 = Debug|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Release|x64.ActiveCfg = Release|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Release|x64.Build.0 = Release|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Release|x86.ActiveCfg = Release|Any CPU
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47}.Release|x86.Build.0 = Release|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Debug|x64.Build.0 = Debug|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Debug|x86.Build.0 = Debug|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Release|x64.ActiveCfg = Release|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Release|x64.Build.0 = Release|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Release|x86.ActiveCfg = Release|Any CPU
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD}.Release|x86.Build.0 = Release|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Debug|x64.Build.0 = Debug|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Debug|x86.Build.0 = Debug|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Release|x64.ActiveCfg = Release|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Release|x64.Build.0 = Release|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Release|x86.ActiveCfg = Release|Any CPU
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7}.Release|x86.Build.0 = Release|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Debug|x64.Build.0 = Debug|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Debug|x86.Build.0 = Debug|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Release|x64.ActiveCfg = Release|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Release|x64.Build.0 = Release|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Release|x86.ActiveCfg = Release|Any CPU
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC}.Release|x86.Build.0 = Release|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Debug|x64.Build.0 = Debug|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Debug|x86.Build.0 = Debug|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Release|x64.ActiveCfg = Release|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Release|x64.Build.0 = Release|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Release|x86.ActiveCfg = Release|Any CPU
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82}.Release|x86.Build.0 = Release|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Debug|x64.Build.0 = Debug|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Debug|x86.Build.0 = Debug|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Release|x64.ActiveCfg = Release|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Release|x64.Build.0 = Release|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Release|x86.ActiveCfg = Release|Any CPU
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE}.Release|x86.Build.0 = Release|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Debug|x64.Build.0 = Debug|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Debug|x86.Build.0 = Debug|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Release|Any CPU.Build.0 = Release|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Release|x64.ActiveCfg = Release|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Release|x64.Build.0 = Release|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Release|x86.ActiveCfg = Release|Any CPU
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02}.Release|x86.Build.0 = Release|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Debug|x64.Build.0 = Debug|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Debug|x86.Build.0 = Debug|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Release|x64.ActiveCfg = Release|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Release|x64.Build.0 = Release|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Release|x86.ActiveCfg = Release|Any CPU
+ {E1E8A599-AB42-4551-8C24-BE4404B65283}.Release|x86.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {B5C26BE6-655E-4D7F-B756-F286750EF172} = {15E42EAC-5CBB-49EC-91FB-53743882CF2B}
+ {7EC9C298-5C22-4CE1-B52C-E1D6AE5B5748} = {CA4538F5-9DA8-4139-B891-A13279889F79}
+ {E973973F-5825-4F91-B017-93EC384B6CC8} = {CA4538F5-9DA8-4139-B891-A13279889F79}
+ {E960EAAA-D1F1-4A3B-A02F-3737DE6236BA} = {CA4538F5-9DA8-4139-B891-A13279889F79}
+ {D28BE2B0-DAFD-4B4E-BBE3-5A35923F9272} = {CA4538F5-9DA8-4139-B891-A13279889F79}
+ {D467E511-71E0-4820-AFE4-2A88AA6B8849} = {CA4538F5-9DA8-4139-B891-A13279889F79}
+ {1F3578EE-9255-4DBA-BF4B-B19D73BEB77F} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {81B41AD2-5D3D-4023-86EC-CAFE01A59174} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {1219DC35-FB59-40D3-BDEE-F67616AB7359} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {3A896D09-1E29-454A-983B-7E2060370727} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {941DD8A4-1611-4022-AD67-0CBDC6B5B8CB} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {2944F22B-746E-467B-A6FC-C003E32C3143} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {A3053CD2-9CE9-4C30-9E25-9CAEF950B137} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {273EA5E9-9DFC-40B2-B4C2-80496ABE2675} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {CA598480-75BD-4999-A77A-24706262C457} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {659D2136-A231-405B-8B40-B3B116E5A9FB} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {4E34175A-05EA-4E97-B49C-A4BD350A14C4} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {E188C5B4-CF3C-431A-8B84-E3A0132D5A97} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {A3844C69-785D-445E-95CE-E7FC17D5B65A} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {7F435FB2-DDE9-44E2-80C4-55A94E174B47} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {8BEA4C2F-3608-4979-BE4A-C59D7C5F64CD} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {C5FAD129-AF09-433F-83A5-5601A9304CD7} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {B9B5D2E8-1B10-4239-B535-1D66F4F5DACC} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {9D5BD889-B84C-4D1A-B2AA-3FC1BF51BF82} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {82C0816D-7051-4DDB-9B9E-6777973AD7AE} = {142C8260-90B5-4D72-9564-17BFDD72F496}
+ {38C0E122-64D0-497F-ABB0-C6A9C3349F02} = {CA4538F5-9DA8-4139-B891-A13279889F79}
+ {E1E8A599-AB42-4551-8C24-BE4404B65283} = {CA4538F5-9DA8-4139-B891-A13279889F79}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {39E3AF62-B1FD-4156-92AA-F4FA99B5AD89}
+ EndGlobalSection
+EndGlobal
diff --git a/src/Security/Authentication/Cookies/src/CookieAppBuilderExtensions.cs b/src/Security/Authentication/Cookies/src/CookieAppBuilderExtensions.cs
deleted file mode 100644
index bdfd43c796..0000000000
--- a/src/Security/Authentication/Cookies/src/CookieAppBuilderExtensions.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Microsoft.AspNetCore.Authentication.Cookies;
-
-namespace Microsoft.AspNetCore.Builder
-{
- ///
- /// Extension methods to add cookie authentication capabilities to an HTTP application pipeline.
- ///
- public static class CookieAppBuilderExtensions
- {
- ///
- /// UseCookieAuthentication is obsolete. Configure Cookie authentication with AddAuthentication().AddCookie in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseCookieAuthentication is obsolete. Configure Cookie authentication with AddAuthentication().AddCookie in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseCookieAuthentication(this IApplicationBuilder app)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
-
- ///
- /// UseCookieAuthentication is obsolete. Configure Cookie authentication with AddAuthentication().AddCookie in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A that specifies options for the handler.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseCookieAuthentication is obsolete. Configure Cookie authentication with AddAuthentication().AddCookie in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseCookieAuthentication(this IApplicationBuilder app, CookieAuthenticationOptions options)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
- }
-}
\ No newline at end of file
diff --git a/src/Security/Authentication/Facebook/src/FacebookAppBuilderExtensions.cs b/src/Security/Authentication/Facebook/src/FacebookAppBuilderExtensions.cs
deleted file mode 100644
index a94dc7bc45..0000000000
--- a/src/Security/Authentication/Facebook/src/FacebookAppBuilderExtensions.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Microsoft.AspNetCore.Authentication.Facebook;
-
-namespace Microsoft.AspNetCore.Builder
-{
- ///
- /// Extension methods to add Facebook authentication capabilities to an HTTP application pipeline.
- ///
- public static class FacebookAppBuilderExtensions
- {
- ///
- /// UseFacebookAuthentication is obsolete. Configure Facebook authentication with AddAuthentication().AddFacebook in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseFacebookAuthentication is obsolete. Configure Facebook authentication with AddAuthentication().AddFacebook in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseFacebookAuthentication(this IApplicationBuilder app)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
-
- ///
- /// UseFacebookAuthentication is obsolete. Configure Facebook authentication with AddAuthentication().AddFacebook in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A that specifies options for the handler.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseFacebookAuthentication is obsolete. Configure Facebook authentication with AddAuthentication().AddFacebook in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseFacebookAuthentication(this IApplicationBuilder app, FacebookOptions options)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
- }
-}
\ No newline at end of file
diff --git a/src/Security/Authentication/Facebook/src/Microsoft.AspNetCore.Authentication.Facebook.csproj b/src/Security/Authentication/Facebook/src/Microsoft.AspNetCore.Authentication.Facebook.csproj
index ed95ec1799..ae327e6ab7 100644
--- a/src/Security/Authentication/Facebook/src/Microsoft.AspNetCore.Authentication.Facebook.csproj
+++ b/src/Security/Authentication/Facebook/src/Microsoft.AspNetCore.Authentication.Facebook.csproj
@@ -6,7 +6,7 @@
$(NoWarn);CS1591
true
aspnetcore;authentication;security
- true
+ true
diff --git a/src/Security/Authentication/Google/src/GoogleAppBuilderExtensions.cs b/src/Security/Authentication/Google/src/GoogleAppBuilderExtensions.cs
deleted file mode 100644
index 4302d20db1..0000000000
--- a/src/Security/Authentication/Google/src/GoogleAppBuilderExtensions.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Microsoft.AspNetCore.Authentication.Google;
-
-namespace Microsoft.AspNetCore.Builder
-{
- ///
- /// Extension methods to add Google authentication capabilities to an HTTP application pipeline.
- ///
- public static class GoogleAppBuilderExtensions
- {
- ///
- /// UseGoogleAuthentication is obsolete. Configure Google authentication with AddAuthentication().AddGoogle in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseGoogleAuthentication is obsolete. Configure Google authentication with AddAuthentication().AddGoogle in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseGoogleAuthentication(this IApplicationBuilder app)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
-
- ///
- /// UseGoogleAuthentication is obsolete. Configure Google authentication with AddAuthentication().AddGoogle in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A that specifies options for the handler.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseGoogleAuthentication is obsolete. Configure Google authentication with AddAuthentication().AddGoogle in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseGoogleAuthentication(this IApplicationBuilder app, GoogleOptions options)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
- }
-}
diff --git a/src/Security/Authentication/Google/src/GoogleDefaults.cs b/src/Security/Authentication/Google/src/GoogleDefaults.cs
index 26b3b8f01c..b4257f0619 100644
--- a/src/Security/Authentication/Google/src/GoogleDefaults.cs
+++ b/src/Security/Authentication/Google/src/GoogleDefaults.cs
@@ -1,6 +1,8 @@
// 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;
+
namespace Microsoft.AspNetCore.Authentication.Google
{
///
@@ -17,7 +19,6 @@ namespace Microsoft.AspNetCore.Authentication.Google
public static readonly string TokenEndpoint = "https://www.googleapis.com/oauth2/v4/token";
- // https://developers.google.com/+/web/people/
- public static readonly string UserInformationEndpoint = "https://www.googleapis.com/plus/v1/people/me";
+ public static readonly string UserInformationEndpoint = "https://www.googleapis.com/oauth2/v2/userinfo";
}
}
diff --git a/src/Security/Authentication/Google/src/GoogleHelper.cs b/src/Security/Authentication/Google/src/GoogleHelper.cs
deleted file mode 100644
index 2cac949a03..0000000000
--- a/src/Security/Authentication/Google/src/GoogleHelper.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Newtonsoft.Json.Linq;
-
-namespace Microsoft.AspNetCore.Authentication.Google
-{
- ///
- /// Contains static methods that allow to extract user's information from a
- /// instance retrieved from Google after a successful authentication process.
- ///
- public static class GoogleHelper
- {
- ///
- /// Gets the user's email.
- ///
- public static string GetEmail(JObject user)
- {
- if (user == null)
- {
- throw new ArgumentNullException(nameof(user));
- }
-
- return TryGetFirstValue(user, "emails", "value");
- }
-
- // Get the given subProperty from a list property.
- private static string TryGetFirstValue(JObject user, string propertyName, string subProperty)
- {
- JToken value;
- if (user.TryGetValue(propertyName, out value))
- {
- var array = JArray.Parse(value.ToString());
- if (array != null && array.Count > 0)
- {
- var subObject = JObject.Parse(array.First.ToString());
- if (subObject != null)
- {
- if (subObject.TryGetValue(subProperty, out value))
- {
- return value.ToString();
- }
- }
- }
- }
- return null;
- }
- }
-}
diff --git a/src/Security/Authentication/Google/src/GoogleOptions.cs b/src/Security/Authentication/Google/src/GoogleOptions.cs
index 34028bc52b..9d08bfc56a 100644
--- a/src/Security/Authentication/Google/src/GoogleOptions.cs
+++ b/src/Security/Authentication/Google/src/GoogleOptions.cs
@@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Security.Claims;
-using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OAuth;
using Microsoft.AspNetCore.Http;
@@ -27,11 +26,11 @@ namespace Microsoft.AspNetCore.Authentication.Google
Scope.Add("email");
ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
- ClaimActions.MapJsonKey(ClaimTypes.Name, "displayName");
- ClaimActions.MapJsonSubKey(ClaimTypes.GivenName, "name", "givenName");
- ClaimActions.MapJsonSubKey(ClaimTypes.Surname, "name", "familyName");
- ClaimActions.MapJsonKey("urn:google:profile", "url");
- ClaimActions.MapCustomJson(ClaimTypes.Email, GoogleHelper.GetEmail);
+ ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
+ ClaimActions.MapJsonKey(ClaimTypes.GivenName, "given_name");
+ ClaimActions.MapJsonKey(ClaimTypes.Surname, "family_name");
+ ClaimActions.MapJsonKey("urn:google:profile", "link");
+ ClaimActions.MapJsonKey(ClaimTypes.Email, "email");
}
///
@@ -39,4 +38,4 @@ namespace Microsoft.AspNetCore.Authentication.Google
///
public string AccessType { get; set; }
}
-}
\ No newline at end of file
+}
diff --git a/src/Security/Authentication/Google/src/Microsoft.AspNetCore.Authentication.Google.csproj b/src/Security/Authentication/Google/src/Microsoft.AspNetCore.Authentication.Google.csproj
index 1572906303..55ea3b2ec9 100644
--- a/src/Security/Authentication/Google/src/Microsoft.AspNetCore.Authentication.Google.csproj
+++ b/src/Security/Authentication/Google/src/Microsoft.AspNetCore.Authentication.Google.csproj
@@ -6,7 +6,7 @@
$(NoWarn);CS1591
true
aspnetcore;authentication;security
- true
+ true
diff --git a/src/Security/Authentication/JwtBearer/src/JwtBearerAppBuilderExtensions.cs b/src/Security/Authentication/JwtBearer/src/JwtBearerAppBuilderExtensions.cs
deleted file mode 100644
index 0cfc97573c..0000000000
--- a/src/Security/Authentication/JwtBearer/src/JwtBearerAppBuilderExtensions.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-
-namespace Microsoft.AspNetCore.Builder
-{
- ///
- /// Extension methods to add OpenIdConnect Bearer authentication capabilities to an HTTP application pipeline.
- ///
- public static class JwtBearerAppBuilderExtensions
- {
- ///
- /// UseJwtBearerAuthentication is obsolete. Configure JwtBearer authentication with AddAuthentication().AddJwtBearer in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseJwtBearerAuthentication is obsolete. Configure JwtBearer authentication with AddAuthentication().AddJwtBearer in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseJwtBearerAuthentication(this IApplicationBuilder app)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
-
- ///
- /// UseJwtBearerAuthentication is obsolete. Configure JwtBearer authentication with AddAuthentication().AddJwtBearer in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A that specifies options for the handler.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseJwtBearerAuthentication is obsolete. Configure JwtBearer authentication with AddAuthentication().AddJwtBearer in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseJwtBearerAuthentication(this IApplicationBuilder app, JwtBearerOptions options)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
- }
-}
\ No newline at end of file
diff --git a/src/Security/Authentication/JwtBearer/src/Microsoft.AspNetCore.Authentication.JwtBearer.csproj b/src/Security/Authentication/JwtBearer/src/Microsoft.AspNetCore.Authentication.JwtBearer.csproj
index 031b422413..b0c6cde4c8 100644
--- a/src/Security/Authentication/JwtBearer/src/Microsoft.AspNetCore.Authentication.JwtBearer.csproj
+++ b/src/Security/Authentication/JwtBearer/src/Microsoft.AspNetCore.Authentication.JwtBearer.csproj
@@ -6,7 +6,7 @@
$(NoWarn);CS1591
true
aspnetcore;authentication;security
- true
+ true
diff --git a/src/Security/Authentication/MicrosoftAccount/src/Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj b/src/Security/Authentication/MicrosoftAccount/src/Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj
index 7869e63d96..1678826d97 100644
--- a/src/Security/Authentication/MicrosoftAccount/src/Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj
+++ b/src/Security/Authentication/MicrosoftAccount/src/Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj
@@ -6,7 +6,7 @@
$(NoWarn);CS1591
true
aspnetcore;authentication;security
- true
+ true
diff --git a/src/Security/Authentication/MicrosoftAccount/src/MicrosoftAccountAppBuilderExtensions.cs b/src/Security/Authentication/MicrosoftAccount/src/MicrosoftAccountAppBuilderExtensions.cs
deleted file mode 100644
index 7fd71d7a9b..0000000000
--- a/src/Security/Authentication/MicrosoftAccount/src/MicrosoftAccountAppBuilderExtensions.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Microsoft.AspNetCore.Authentication.MicrosoftAccount;
-
-namespace Microsoft.AspNetCore.Builder
-{
- ///
- /// Extension methods to add Microsoft Account authentication capabilities to an HTTP application pipeline.
- ///
- public static class MicrosoftAccountAppBuilderExtensions
- {
- ///
- /// UseMicrosoftAccountAuthentication is obsolete. Configure MicrosoftAccount authentication with AddAuthentication().AddMicrosoftAccount in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseMicrosoftAccountAuthentication is obsolete. Configure MicrosoftAccount authentication with AddAuthentication().AddMicrosoftAccount in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseMicrosoftAccountAuthentication(this IApplicationBuilder app)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
-
- ///
- /// UseMicrosoftAccountAuthentication is obsolete. Configure MicrosoftAccount authentication with AddAuthentication().AddMicrosoftAccount in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A that specifies options for the handler.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseMicrosoftAccountAuthentication is obsolete. Configure MicrosoftAccount authentication with AddAuthentication().AddMicrosoftAccount in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseMicrosoftAccountAuthentication(this IApplicationBuilder app, MicrosoftAccountOptions options)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
- }
-}
\ No newline at end of file
diff --git a/src/Security/Authentication/OAuth/src/OAuthAppBuilderExtensions.cs b/src/Security/Authentication/OAuth/src/OAuthAppBuilderExtensions.cs
deleted file mode 100644
index d55f311f7b..0000000000
--- a/src/Security/Authentication/OAuth/src/OAuthAppBuilderExtensions.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Microsoft.AspNetCore.Authentication.OAuth;
-
-namespace Microsoft.AspNetCore.Builder
-{
- ///
- /// Extension methods to add OAuth 2.0 authentication capabilities to an HTTP application pipeline.
- ///
- public static class OAuthAppBuilderExtensions
- {
- ///
- /// UseOAuthAuthentication is obsolete. Configure OAuth authentication with AddAuthentication().AddOAuth in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseOAuthAuthentication is obsolete. Configure OAuth authentication with AddAuthentication().AddOAuth in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseOAuthAuthentication(this IApplicationBuilder app)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
-
- ///
- /// UseOAuthAuthentication is obsolete. Configure OAuth authentication with AddAuthentication().AddOAuth in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A that specifies options for the handler.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseOAuthAuthentication is obsolete. Configure OAuth authentication with AddAuthentication().AddOAuth in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseOAuthAuthentication(this IApplicationBuilder app, OAuthOptions options)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
- }
-}
\ No newline at end of file
diff --git a/src/Security/Authentication/OpenIdConnect/src/Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj b/src/Security/Authentication/OpenIdConnect/src/Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj
index 2ccf7b01d8..eb0ef01568 100644
--- a/src/Security/Authentication/OpenIdConnect/src/Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj
+++ b/src/Security/Authentication/OpenIdConnect/src/Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj
@@ -6,7 +6,7 @@
$(NoWarn);CS1591
true
aspnetcore;authentication;security
- true
+ true
diff --git a/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectAppBuilderExtensions.cs b/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectAppBuilderExtensions.cs
deleted file mode 100644
index 0746ae3fdb..0000000000
--- a/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectAppBuilderExtensions.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-
-namespace Microsoft.AspNetCore.Builder
-{
- ///
- /// Extension methods to add OpenID Connect authentication capabilities to an HTTP application pipeline.
- ///
- public static class OpenIdConnectAppBuilderExtensions
- {
- ///
- /// UseOpenIdConnectAuthentication is obsolete. Configure OpenIdConnect authentication with AddAuthentication().AddOpenIdConnect in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseOpenIdConnectAuthentication is obsolete. Configure OpenIdConnect authentication with AddAuthentication().AddOpenIdConnect in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseOpenIdConnectAuthentication(this IApplicationBuilder app)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
-
- ///
- /// UseOpenIdConnectAuthentication is obsolete. Configure OpenIdConnect authentication with AddAuthentication().AddOpenIdConnect in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A that specifies options for the handler.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseOpenIdConnectAuthentication is obsolete. Configure OpenIdConnect authentication with AddAuthentication().AddOpenIdConnect in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseOpenIdConnectAuthentication(this IApplicationBuilder app, OpenIdConnectOptions options)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
- }
-}
\ No newline at end of file
diff --git a/src/Security/Authentication/Twitter/src/Microsoft.AspNetCore.Authentication.Twitter.csproj b/src/Security/Authentication/Twitter/src/Microsoft.AspNetCore.Authentication.Twitter.csproj
index 40113b1a75..2dbb515a4a 100644
--- a/src/Security/Authentication/Twitter/src/Microsoft.AspNetCore.Authentication.Twitter.csproj
+++ b/src/Security/Authentication/Twitter/src/Microsoft.AspNetCore.Authentication.Twitter.csproj
@@ -6,7 +6,7 @@
$(NoWarn);CS1591
true
aspnetcore;authentication;security
- true
+ true
diff --git a/src/Security/Authentication/Twitter/src/TwitterAppBuilderExtensions.cs b/src/Security/Authentication/Twitter/src/TwitterAppBuilderExtensions.cs
deleted file mode 100644
index 36e1111da6..0000000000
--- a/src/Security/Authentication/Twitter/src/TwitterAppBuilderExtensions.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Microsoft.AspNetCore.Authentication.Twitter;
-
-namespace Microsoft.AspNetCore.Builder
-{
- ///
- /// Extension methods to add Twitter authentication capabilities to an HTTP application pipeline.
- ///
- public static class TwitterAppBuilderExtensions
- {
- ///
- /// UseTwitterAuthentication is obsolete. Configure Twitter authentication with AddAuthentication().AddTwitter in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseTwitterAuthentication is obsolete. Configure Twitter authentication with AddAuthentication().AddTwitter in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseTwitterAuthentication(this IApplicationBuilder app)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
-
- ///
- /// UseTwitterAuthentication is obsolete. Configure Twitter authentication with AddAuthentication().AddTwitter in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.
- ///
- /// The to add the handler to.
- /// An action delegate to configure the provided .
- /// A reference to this instance after the operation has completed.
- [Obsolete("UseTwitterAuthentication is obsolete. Configure Twitter authentication with AddAuthentication().AddTwitter in ConfigureServices. See https://go.microsoft.com/fwlink/?linkid=845470 for more details.", error: true)]
- public static IApplicationBuilder UseTwitterAuthentication(this IApplicationBuilder app, TwitterOptions options)
- {
- throw new NotSupportedException("This method is no longer supported, see https://go.microsoft.com/fwlink/?linkid=845470");
- }
- }
-}
\ No newline at end of file
diff --git a/src/Security/Authentication/WsFederation/src/Microsoft.AspNetCore.Authentication.WsFederation.csproj b/src/Security/Authentication/WsFederation/src/Microsoft.AspNetCore.Authentication.WsFederation.csproj
index 72106df001..1e864c5662 100644
--- a/src/Security/Authentication/WsFederation/src/Microsoft.AspNetCore.Authentication.WsFederation.csproj
+++ b/src/Security/Authentication/WsFederation/src/Microsoft.AspNetCore.Authentication.WsFederation.csproj
@@ -5,7 +5,7 @@
netcoreapp3.0
true
aspnetcore;authentication;security
- true
+ true
diff --git a/src/Security/Authentication/test/GoogleTests.cs b/src/Security/Authentication/test/GoogleTests.cs
index 24b7ef0fab..6559c1aacc 100644
--- a/src/Security/Authentication/test/GoogleTests.cs
+++ b/src/Security/Authentication/test/GoogleTests.cs
@@ -472,45 +472,7 @@ namespace Microsoft.AspNetCore.Authentication.Google
{
o.ClaimsIssuer = claimsIssuer;
}
- o.BackchannelHttpHandler = new TestHttpMessageHandler
- {
- Sender = req =>
- {
- if (req.RequestUri.AbsoluteUri == "https://www.googleapis.com/oauth2/v4/token")
- {
- return ReturnJsonResponse(new
- {
- access_token = "Test Access Token",
- expires_in = 3600,
- token_type = "Bearer"
- });
- }
- else if (req.RequestUri.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.UriEscaped) == "https://www.googleapis.com/plus/v1/people/me")
- {
- return ReturnJsonResponse(new
- {
- id = "Test User ID",
- displayName = "Test Name",
- name = new
- {
- familyName = "Test Family Name",
- givenName = "Test Given Name"
- },
- url = "Profile link",
- emails = new[]
- {
- new
- {
- value = "Test email",
- type = "account"
- }
- }
- });
- }
-
- throw new NotImplementedException(req.RequestUri.AbsoluteUri);
- }
- };
+ o.BackchannelHttpHandler = CreateBackchannel();
});
var properties = new AuthenticationProperties();
@@ -662,46 +624,7 @@ namespace Microsoft.AspNetCore.Authentication.Google
o.ClientId = "Test Id";
o.ClientSecret = "Test Secret";
o.StateDataFormat = stateFormat;
- o.BackchannelHttpHandler = new TestHttpMessageHandler
- {
- Sender = req =>
- {
- if (req.RequestUri.AbsoluteUri == "https://www.googleapis.com/oauth2/v4/token")
- {
- return ReturnJsonResponse(new
- {
- access_token = "Test Access Token",
- expires_in = 3600,
- token_type = "Bearer",
- refresh_token = "Test Refresh Token"
- });
- }
- else if (req.RequestUri.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.UriEscaped) == "https://www.googleapis.com/plus/v1/people/me")
- {
- return ReturnJsonResponse(new
- {
- id = "Test User ID",
- displayName = "Test Name",
- name = new
- {
- familyName = "Test Family Name",
- givenName = "Test Given Name"
- },
- url = "Profile link",
- emails = new[]
- {
- new
- {
- value = "Test email",
- type = "account"
- }
- }
- });
- }
-
- throw new NotImplementedException(req.RequestUri.AbsoluteUri);
- }
- };
+ o.BackchannelHttpHandler = CreateBackchannel();
o.Events = new OAuthEvents
{
OnCreatingTicket = context =>
@@ -742,46 +665,7 @@ namespace Microsoft.AspNetCore.Authentication.Google
o.ClientId = "Test Id";
o.ClientSecret = "Test Secret";
o.StateDataFormat = stateFormat;
- o.BackchannelHttpHandler = new TestHttpMessageHandler
- {
- Sender = req =>
- {
- if (req.RequestUri.AbsoluteUri == "https://www.googleapis.com/oauth2/v4/token")
- {
- return ReturnJsonResponse(new
- {
- access_token = "Test Access Token",
- expires_in = 3600,
- token_type = "Bearer",
- refresh_token = "Test Refresh Token"
- });
- }
- else if (req.RequestUri.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.UriEscaped) == "https://www.googleapis.com/plus/v1/people/me")
- {
- return ReturnJsonResponse(new
- {
- id = "Test User ID",
- displayName = "Test Name",
- name = new
- {
- familyName = "Test Family Name",
- givenName = "Test Given Name"
- },
- url = "Profile link",
- emails = new[]
- {
- new
- {
- value = "Test email",
- type = "account"
- }
- }
- });
- }
-
- throw new NotImplementedException(req.RequestUri.AbsoluteUri);
- }
- };
+ o.BackchannelHttpHandler = CreateBackchannel();
o.Events = new OAuthEvents
{
OnTicketReceived = context =>
@@ -832,46 +716,7 @@ namespace Microsoft.AspNetCore.Authentication.Google
return Task.FromResult(0);
}
};
- o.BackchannelHttpHandler = new TestHttpMessageHandler
- {
- Sender = req =>
- {
- if (req.RequestUri.AbsoluteUri == "https://www.googleapis.com/oauth2/v4/token")
- {
- return ReturnJsonResponse(new
- {
- access_token = "Test Access Token",
- expires_in = 3600,
- token_type = "Bearer",
- refresh_token = "Test Refresh Token"
- });
- }
- else if (req.RequestUri.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.UriEscaped) == "https://www.googleapis.com/plus/v1/people/me")
- {
- return ReturnJsonResponse(new
- {
- id = "Test User ID",
- displayName = "Test Name",
- name = new
- {
- familyName = "Test Family Name",
- givenName = "Test Given Name"
- },
- url = "Profile link",
- emails = new[]
- {
- new
- {
- value = "Test email",
- type = "account"
- }
- }
- });
- }
-
- throw new NotImplementedException(req.RequestUri.AbsoluteUri);
- }
- };
+ o.BackchannelHttpHandler = CreateBackchannel();
});
var properties = new AuthenticationProperties();
@@ -1102,29 +947,20 @@ namespace Microsoft.AspNetCore.Authentication.Google
{
access_token = "Test Access Token",
expires_in = 3600,
- token_type = "Bearer"
+ token_type = "Bearer",
+ refresh_token = "Test Refresh Token"
});
}
- else if (req.RequestUri.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.UriEscaped) == "https://www.googleapis.com/plus/v1/people/me")
+ else if (req.RequestUri.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.UriEscaped) == "https://www.googleapis.com/oauth2/v2/userinfo")
{
return ReturnJsonResponse(new
{
id = "Test User ID",
- displayName = "Test Name",
- name = new
- {
- familyName = "Test Family Name",
- givenName = "Test Given Name"
- },
- url = "Profile link",
- emails = new[]
- {
- new
- {
- value = "Test email",
- type = "account"
- }
- }
+ name = "Test Name",
+ given_name = "Test Given Name",
+ family_name = "Test Family Name",
+ link = "Profile link",
+ email = "Test email",
});
}
diff --git a/src/Security/Authorization/Policy/src/AuthorizationAppBuilderExtensions.cs b/src/Security/Authorization/Policy/src/AuthorizationAppBuilderExtensions.cs
index 66f0eb6f1e..08c4538f5a 100644
--- a/src/Security/Authorization/Policy/src/AuthorizationAppBuilderExtensions.cs
+++ b/src/Security/Authorization/Policy/src/AuthorizationAppBuilderExtensions.cs
@@ -1,8 +1,10 @@
-// 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.
using System;
using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Authorization.Policy;
+using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Builder
{
@@ -23,7 +25,22 @@ namespace Microsoft.AspNetCore.Builder
throw new ArgumentNullException(nameof(app));
}
+ VerifyServicesRegistered(app);
+
return app.UseMiddleware();
}
+
+ private static void VerifyServicesRegistered(IApplicationBuilder app)
+ {
+ // Verify that AddAuthorizationPolicy was called before calling UseAuthorization
+ // We use the AuthorizationPolicyMarkerService to ensure all the services were added.
+ if (app.ApplicationServices.GetService(typeof(AuthorizationPolicyMarkerService)) == null)
+ {
+ throw new InvalidOperationException(Resources.FormatException_UnableToFindServices(
+ nameof(IServiceCollection),
+ nameof(PolicyServiceCollectionExtensions.AddAuthorizationPolicyEvaluator),
+ "ConfigureServices(...)"));
+ }
+ }
}
}
diff --git a/src/Security/Authorization/Policy/src/AuthorizationEndpointConventionBuilderExtensions.cs b/src/Security/Authorization/Policy/src/AuthorizationEndpointConventionBuilderExtensions.cs
index 82331a3217..316c45012b 100644
--- a/src/Security/Authorization/Policy/src/AuthorizationEndpointConventionBuilderExtensions.cs
+++ b/src/Security/Authorization/Policy/src/AuthorizationEndpointConventionBuilderExtensions.cs
@@ -4,12 +4,20 @@
using System;
using System.Linq;
using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Builder
{
+ ///
+ /// Authorization extension methods for .
+ ///
public static class AuthorizationEndpointConventionBuilderExtensions
{
+ ///
+ /// Adds authorization policies with the specified to the endpoint(s).
+ ///
+ /// The endpoint convention builder.
+ /// A collection of .
+ /// The original convention builder parameter.
public static IEndpointConventionBuilder RequireAuthorization(this IEndpointConventionBuilder builder, params IAuthorizeData[] authorizeData)
{
if (builder == null)
@@ -32,6 +40,12 @@ namespace Microsoft.AspNetCore.Builder
return builder;
}
+ ///
+ /// Adds authorization policies with the specified names to the endpoint(s).
+ ///
+ /// The endpoint convention builder.
+ /// A collection of policy names.
+ /// The original convention builder parameter.
public static IEndpointConventionBuilder RequireAuthorization(this IEndpointConventionBuilder builder, params string[] policyNames)
{
if (builder == null)
@@ -46,5 +60,20 @@ namespace Microsoft.AspNetCore.Builder
return builder.RequireAuthorization(policyNames.Select(n => new AuthorizeAttribute(n)).ToArray());
}
+
+ ///
+ /// Adds the default authorization policy to the endpoint(s).
+ ///
+ /// The endpoint convention builder.
+ /// The original convention builder parameter.
+ public static IEndpointConventionBuilder RequireAuthorization(this IEndpointConventionBuilder builder)
+ {
+ if (builder == null)
+ {
+ throw new ArgumentNullException(nameof(builder));
+ }
+
+ return builder.RequireAuthorization(new AuthorizeAttribute());
+ }
}
}
diff --git a/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs b/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs
index e33bdd9bce..6284eea15d 100644
--- a/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs
+++ b/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs
@@ -8,7 +8,6 @@ using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization.Policy;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Endpoints;
-using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Authorization
@@ -45,11 +44,19 @@ namespace Microsoft.AspNetCore.Authorization
throw new ArgumentNullException(nameof(context));
}
+ var endpoint = context.GetEndpoint();
+
+ // Workaround for https://github.com/aspnet/AspNetCore/issues/7011. Do not use the AuthorizationMiddleware for Razor Pages
+ if (endpoint != null && endpoint.Metadata.Any(m => m.GetType().FullName == "Microsoft.AspNetCore.Mvc.ApplicationModels.PageRouteMetadata"))
+ {
+ await _next(context);
+ return;
+ }
+
// Flag to indicate to other systems, e.g. MVC, that authorization middleware was run for this request
context.Items[AuthorizationMiddlewareInvokedKey] = AuthorizationMiddlewareInvokedValue;
// IMPORTANT: Changes to authorization logic should be mirrored in MVC's AuthorizeFilter
- var endpoint = context.GetEndpoint();
var authorizeData = endpoint?.Metadata.GetOrderedMetadata() ?? Array.Empty();
var policy = await AuthorizationPolicy.CombineAsync(_policyProvider, authorizeData);
if (policy == null)
diff --git a/src/Security/Authorization/Policy/src/AuthorizationPolicyMarkerService.cs b/src/Security/Authorization/Policy/src/AuthorizationPolicyMarkerService.cs
new file mode 100644
index 0000000000..9061891e43
--- /dev/null
+++ b/src/Security/Authorization/Policy/src/AuthorizationPolicyMarkerService.cs
@@ -0,0 +1,9 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+namespace Microsoft.AspNetCore.Authorization.Policy
+{
+ internal class AuthorizationPolicyMarkerService
+ {
+ }
+}
diff --git a/src/Security/Authorization/Policy/src/PolicyServiceCollectionExtensions.cs b/src/Security/Authorization/Policy/src/PolicyServiceCollectionExtensions.cs
index 9b72a5cab4..dc1056e696 100644
--- a/src/Security/Authorization/Policy/src/PolicyServiceCollectionExtensions.cs
+++ b/src/Security/Authorization/Policy/src/PolicyServiceCollectionExtensions.cs
@@ -23,7 +23,9 @@ namespace Microsoft.Extensions.DependencyInjection
{
throw new ArgumentNullException(nameof(services));
}
-
+
+ services.AddAuthorization();
+ services.TryAddSingleton();
services.TryAdd(ServiceDescriptor.Transient());
return services;
}
diff --git a/src/Security/Authorization/Policy/src/Properties/Resources.Designer.cs b/src/Security/Authorization/Policy/src/Properties/Resources.Designer.cs
new file mode 100644
index 0000000000..d4e50a8631
--- /dev/null
+++ b/src/Security/Authorization/Policy/src/Properties/Resources.Designer.cs
@@ -0,0 +1,44 @@
+//
+namespace Microsoft.AspNetCore.Authorization.Policy
+{
+ using System.Globalization;
+ using System.Reflection;
+ using System.Resources;
+
+ internal static class Resources
+ {
+ private static readonly ResourceManager _resourceManager
+ = new ResourceManager("Microsoft.AspNetCore.Authorization.Policy.Resources", typeof(Resources).GetTypeInfo().Assembly);
+
+ ///
+ /// Unable to find the required services. Please add all the required services by calling '{0}.{1}' inside the call to '{2}' in the application startup code.
+ ///
+ internal static string Exception_UnableToFindServices
+ {
+ get => GetString("Exception_UnableToFindServices");
+ }
+
+ ///
+ /// Unable to find the required services. Please add all the required services by calling '{0}.{1}' inside the call to '{2}' in the application startup code.
+ ///
+ internal static string FormatException_UnableToFindServices(object p0, object p1, object p2)
+ => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UnableToFindServices"), p0, p1, p2);
+
+ private static string GetString(string name, params string[] formatterNames)
+ {
+ var value = _resourceManager.GetString(name);
+
+ System.Diagnostics.Debug.Assert(value != null);
+
+ if (formatterNames != null)
+ {
+ for (var i = 0; i < formatterNames.Length; i++)
+ {
+ value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}");
+ }
+ }
+
+ return value;
+ }
+ }
+}
diff --git a/src/Security/Authorization/Policy/src/Resources.resx b/src/Security/Authorization/Policy/src/Resources.resx
new file mode 100644
index 0000000000..15d6f7d53c
--- /dev/null
+++ b/src/Security/Authorization/Policy/src/Resources.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Unable to find the required services. Please add all the required services by calling '{0}.{1}' inside the call to '{2}' in the application startup code.
+
+
\ No newline at end of file
diff --git a/src/Security/Authorization/test/AuthorizationAppBuilderExtensionsTests.cs b/src/Security/Authorization/test/AuthorizationAppBuilderExtensionsTests.cs
index c6fb596f18..ffb3ddeb1b 100644
--- a/src/Security/Authorization/test/AuthorizationAppBuilderExtensionsTests.cs
+++ b/src/Security/Authorization/test/AuthorizationAppBuilderExtensionsTests.cs
@@ -1,4 +1,4 @@
-// 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.
using System;
@@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Authorization.Test
public class AuthorizationAppBuilderExtensionsTests
{
[Fact]
- public async Task UseAuthorization_RegistersMiddleware()
+ public async Task UseAuthorization_HasRequiredSevices_RegistersMiddleware()
{
// Arrange
var authenticationService = new TestAuthenticationService();
@@ -48,11 +48,32 @@ namespace Microsoft.AspNetCore.Authorization.Test
Assert.True(authenticationService.ChallengeCalled);
}
+ [Fact]
+ public void UseAuthorization_MissingRequiredSevices_FriendlyErrorMessage()
+ {
+ // Arrange
+ var authenticationService = new TestAuthenticationService();
+
+ var app = new ApplicationBuilder(new ServiceCollection().BuildServiceProvider());
+
+ // Act
+ var ex = Assert.Throws(() =>
+ {
+ app.UseAuthorization();
+ });
+
+ // Assert
+ Assert.Equal(
+ "Unable to find the required services. Please add all the required services by calling " +
+ "'IServiceCollection.AddAuthorizationPolicyEvaluator' inside the call to 'ConfigureServices(...)' " +
+ "in the application startup code.",
+ ex.Message);
+ }
+
private IServiceProvider CreateServices(IAuthenticationService authenticationService)
{
var services = new ServiceCollection();
- services.AddAuthorization(options => { });
services.AddAuthorizationPolicyEvaluator();
services.AddLogging();
services.AddSingleton(authenticationService);
diff --git a/src/Security/Authorization/test/AuthorizationEndpointConventionBuilderExtensionsTests.cs b/src/Security/Authorization/test/AuthorizationEndpointConventionBuilderExtensionsTests.cs
index 94d8a71d45..7a01f88ae6 100644
--- a/src/Security/Authorization/test/AuthorizationEndpointConventionBuilderExtensionsTests.cs
+++ b/src/Security/Authorization/test/AuthorizationEndpointConventionBuilderExtensionsTests.cs
@@ -47,7 +47,27 @@ namespace Microsoft.AspNetCore.Authorization.Test
var endpointModel = new RouteEndpointBuilder((context) => Task.CompletedTask, RoutePatternFactory.Parse("/"), 0);
convention(endpointModel);
- Assert.Equal("policy", Assert.IsAssignableFrom(Assert.Single(endpointModel.Metadata)).Policy);
+ var authMetadata = Assert.IsAssignableFrom(Assert.Single(endpointModel.Metadata));
+ Assert.Equal("policy", authMetadata.Policy);
+ }
+
+ [Fact]
+ public void RequireAuthorization_Default()
+ {
+ // Arrange
+ var builder = new TestEndpointConventionBuilder();
+
+ // Act
+ builder.RequireAuthorization();
+
+ // Assert
+ var convention = Assert.Single(builder.Conventions);
+
+ var endpointModel = new RouteEndpointBuilder((context) => Task.CompletedTask, RoutePatternFactory.Parse("/"), 0);
+ convention(endpointModel);
+
+ var authMetadata = Assert.IsAssignableFrom(Assert.Single(endpointModel.Metadata));
+ Assert.Null(authMetadata.Policy);
}
private class TestEndpointConventionBuilder : IEndpointConventionBuilder
diff --git a/src/AuthSamples/samples/ClaimsTransformation/.bowerrc b/src/Security/samples/ClaimsTransformation/.bowerrc
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/.bowerrc
rename to src/Security/samples/ClaimsTransformation/.bowerrc
diff --git a/src/Security/samples/ClaimsTransformation/ClaimsTransformation.csproj b/src/Security/samples/ClaimsTransformation/ClaimsTransformation.csproj
new file mode 100644
index 0000000000..91734de305
--- /dev/null
+++ b/src/Security/samples/ClaimsTransformation/ClaimsTransformation.csproj
@@ -0,0 +1,16 @@
+
+
+
+ netcoreapp3.0
+ true
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/AuthSamples/samples/ClaimsTransformation/ClaimsTransformer.cs b/src/Security/samples/ClaimsTransformation/ClaimsTransformer.cs
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/ClaimsTransformer.cs
rename to src/Security/samples/ClaimsTransformation/ClaimsTransformer.cs
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Controllers/AccountController.cs b/src/Security/samples/ClaimsTransformation/Controllers/AccountController.cs
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Controllers/AccountController.cs
rename to src/Security/samples/ClaimsTransformation/Controllers/AccountController.cs
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Controllers/HomeController.cs b/src/Security/samples/ClaimsTransformation/Controllers/HomeController.cs
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Controllers/HomeController.cs
rename to src/Security/samples/ClaimsTransformation/Controllers/HomeController.cs
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Models/ErrorViewModel.cs b/src/Security/samples/ClaimsTransformation/Models/ErrorViewModel.cs
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Models/ErrorViewModel.cs
rename to src/Security/samples/ClaimsTransformation/Models/ErrorViewModel.cs
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Program.cs b/src/Security/samples/ClaimsTransformation/Program.cs
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Program.cs
rename to src/Security/samples/ClaimsTransformation/Program.cs
diff --git a/src/AuthSamples/samples/ClaimsTransformation/README.md b/src/Security/samples/ClaimsTransformation/README.md
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/README.md
rename to src/Security/samples/ClaimsTransformation/README.md
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Startup.cs b/src/Security/samples/ClaimsTransformation/Startup.cs
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Startup.cs
rename to src/Security/samples/ClaimsTransformation/Startup.cs
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Views/Account/AccessDenied.cshtml b/src/Security/samples/ClaimsTransformation/Views/Account/AccessDenied.cshtml
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Views/Account/AccessDenied.cshtml
rename to src/Security/samples/ClaimsTransformation/Views/Account/AccessDenied.cshtml
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Views/Account/Login.cshtml b/src/Security/samples/ClaimsTransformation/Views/Account/Login.cshtml
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Views/Account/Login.cshtml
rename to src/Security/samples/ClaimsTransformation/Views/Account/Login.cshtml
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Views/Home/Index.cshtml b/src/Security/samples/ClaimsTransformation/Views/Home/Index.cshtml
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Views/Home/Index.cshtml
rename to src/Security/samples/ClaimsTransformation/Views/Home/Index.cshtml
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Views/Home/MyClaims.cshtml b/src/Security/samples/ClaimsTransformation/Views/Home/MyClaims.cshtml
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Views/Home/MyClaims.cshtml
rename to src/Security/samples/ClaimsTransformation/Views/Home/MyClaims.cshtml
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Views/Shared/Error.cshtml b/src/Security/samples/ClaimsTransformation/Views/Shared/Error.cshtml
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Views/Shared/Error.cshtml
rename to src/Security/samples/ClaimsTransformation/Views/Shared/Error.cshtml
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Views/Shared/_Layout.cshtml b/src/Security/samples/ClaimsTransformation/Views/Shared/_Layout.cshtml
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Views/Shared/_Layout.cshtml
rename to src/Security/samples/ClaimsTransformation/Views/Shared/_Layout.cshtml
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Views/Shared/_ValidationScriptsPartial.cshtml b/src/Security/samples/ClaimsTransformation/Views/Shared/_ValidationScriptsPartial.cshtml
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Views/Shared/_ValidationScriptsPartial.cshtml
rename to src/Security/samples/ClaimsTransformation/Views/Shared/_ValidationScriptsPartial.cshtml
diff --git a/src/AuthSamples/samples/ClaimsTransformation/Views/_ViewImports.cshtml b/src/Security/samples/ClaimsTransformation/Views/_ViewImports.cshtml
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/Views/_ViewImports.cshtml
rename to src/Security/samples/ClaimsTransformation/Views/_ViewImports.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/_ViewStart.cshtml b/src/Security/samples/ClaimsTransformation/Views/_ViewStart.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/_ViewStart.cshtml
rename to src/Security/samples/ClaimsTransformation/Views/_ViewStart.cshtml
diff --git a/src/AuthSamples/samples/Cookies/appsettings.Development.json b/src/Security/samples/ClaimsTransformation/appsettings.Development.json
similarity index 100%
rename from src/AuthSamples/samples/Cookies/appsettings.Development.json
rename to src/Security/samples/ClaimsTransformation/appsettings.Development.json
diff --git a/src/AuthSamples/samples/ClaimsTransformation/appsettings.json b/src/Security/samples/ClaimsTransformation/appsettings.json
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/appsettings.json
rename to src/Security/samples/ClaimsTransformation/appsettings.json
diff --git a/src/AuthSamples/samples/ClaimsTransformation/bower.json b/src/Security/samples/ClaimsTransformation/bower.json
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/bower.json
rename to src/Security/samples/ClaimsTransformation/bower.json
diff --git a/src/AuthSamples/samples/ClaimsTransformation/bundleconfig.json b/src/Security/samples/ClaimsTransformation/bundleconfig.json
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/bundleconfig.json
rename to src/Security/samples/ClaimsTransformation/bundleconfig.json
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/css/site.css b/src/Security/samples/ClaimsTransformation/wwwroot/css/site.css
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/css/site.css
rename to src/Security/samples/ClaimsTransformation/wwwroot/css/site.css
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/css/site.min.css b/src/Security/samples/ClaimsTransformation/wwwroot/css/site.min.css
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/css/site.min.css
rename to src/Security/samples/ClaimsTransformation/wwwroot/css/site.min.css
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/favicon.ico b/src/Security/samples/ClaimsTransformation/wwwroot/favicon.ico
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/favicon.ico
rename to src/Security/samples/ClaimsTransformation/wwwroot/favicon.ico
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/images/banner1.svg b/src/Security/samples/ClaimsTransformation/wwwroot/images/banner1.svg
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/images/banner1.svg
rename to src/Security/samples/ClaimsTransformation/wwwroot/images/banner1.svg
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/images/banner2.svg b/src/Security/samples/ClaimsTransformation/wwwroot/images/banner2.svg
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/images/banner2.svg
rename to src/Security/samples/ClaimsTransformation/wwwroot/images/banner2.svg
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/images/banner3.svg b/src/Security/samples/ClaimsTransformation/wwwroot/images/banner3.svg
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/images/banner3.svg
rename to src/Security/samples/ClaimsTransformation/wwwroot/images/banner3.svg
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/images/banner4.svg b/src/Security/samples/ClaimsTransformation/wwwroot/images/banner4.svg
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/images/banner4.svg
rename to src/Security/samples/ClaimsTransformation/wwwroot/images/banner4.svg
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/js/site.js b/src/Security/samples/ClaimsTransformation/wwwroot/js/site.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/js/site.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/js/site.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/js/site.min.js b/src/Security/samples/ClaimsTransformation/wwwroot/js/site.min.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/js/site.min.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/js/site.min.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/.bower.json b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/.bower.json
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/.bower.json
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/LICENSE b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/LICENSE
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/LICENSE
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/LICENSE
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.css b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.css
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.css
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.css
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/bootstrap.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/bootstrap.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/bootstrap.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/bootstrap.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/npm.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/npm.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/npm.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/bootstrap/dist/js/npm.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/.bower.json b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/.bower.json
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/.bower.json
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/LICENSE.md b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/LICENSE.md
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/LICENSE.md
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/LICENSE.md
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/additional-methods.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/additional-methods.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/additional-methods.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/additional-methods.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/additional-methods.min.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/jquery.validate.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/jquery.validate.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/jquery.validate.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/jquery.validate.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery/.bower.json b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery/.bower.json
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/.bower.json
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/LICENSE.txt
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery/LICENSE.txt
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/LICENSE.txt
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.js
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.js
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.js
diff --git a/src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.map
similarity index 100%
rename from src/AuthSamples/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.map
rename to src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.map
diff --git a/src/AuthSamples/samples/Cookies/.bowerrc b/src/Security/samples/Cookies/.bowerrc
similarity index 100%
rename from src/AuthSamples/samples/Cookies/.bowerrc
rename to src/Security/samples/Cookies/.bowerrc
diff --git a/src/AuthSamples/samples/Cookies/ConfigureMyCookie.cs b/src/Security/samples/Cookies/ConfigureMyCookie.cs
similarity index 100%
rename from src/AuthSamples/samples/Cookies/ConfigureMyCookie.cs
rename to src/Security/samples/Cookies/ConfigureMyCookie.cs
diff --git a/src/AuthSamples/samples/Cookies/Controllers/AccountController.cs b/src/Security/samples/Cookies/Controllers/AccountController.cs
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Controllers/AccountController.cs
rename to src/Security/samples/Cookies/Controllers/AccountController.cs
diff --git a/src/AuthSamples/samples/Cookies/Controllers/HomeController.cs b/src/Security/samples/Cookies/Controllers/HomeController.cs
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Controllers/HomeController.cs
rename to src/Security/samples/Cookies/Controllers/HomeController.cs
diff --git a/src/Security/samples/Cookies/Cookies.csproj b/src/Security/samples/Cookies/Cookies.csproj
new file mode 100644
index 0000000000..91734de305
--- /dev/null
+++ b/src/Security/samples/Cookies/Cookies.csproj
@@ -0,0 +1,16 @@
+
+
+
+ netcoreapp3.0
+ true
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/AuthSamples/samples/Cookies/Models/ErrorViewModel.cs b/src/Security/samples/Cookies/Models/ErrorViewModel.cs
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Models/ErrorViewModel.cs
rename to src/Security/samples/Cookies/Models/ErrorViewModel.cs
diff --git a/src/AuthSamples/samples/Cookies/Program.cs b/src/Security/samples/Cookies/Program.cs
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Program.cs
rename to src/Security/samples/Cookies/Program.cs
diff --git a/src/AuthSamples/samples/Cookies/README.md b/src/Security/samples/Cookies/README.md
similarity index 100%
rename from src/AuthSamples/samples/Cookies/README.md
rename to src/Security/samples/Cookies/README.md
diff --git a/src/AuthSamples/samples/Cookies/Startup.cs b/src/Security/samples/Cookies/Startup.cs
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Startup.cs
rename to src/Security/samples/Cookies/Startup.cs
diff --git a/src/AuthSamples/samples/Cookies/Views/Account/AccessDenied.cshtml b/src/Security/samples/Cookies/Views/Account/AccessDenied.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Views/Account/AccessDenied.cshtml
rename to src/Security/samples/Cookies/Views/Account/AccessDenied.cshtml
diff --git a/src/AuthSamples/samples/Cookies/Views/Account/Login.cshtml b/src/Security/samples/Cookies/Views/Account/Login.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Views/Account/Login.cshtml
rename to src/Security/samples/Cookies/Views/Account/Login.cshtml
diff --git a/src/AuthSamples/samples/Cookies/Views/Home/Index.cshtml b/src/Security/samples/Cookies/Views/Home/Index.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Views/Home/Index.cshtml
rename to src/Security/samples/Cookies/Views/Home/Index.cshtml
diff --git a/src/AuthSamples/samples/Cookies/Views/Home/MyClaims.cshtml b/src/Security/samples/Cookies/Views/Home/MyClaims.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Views/Home/MyClaims.cshtml
rename to src/Security/samples/Cookies/Views/Home/MyClaims.cshtml
diff --git a/src/AuthSamples/samples/Cookies/Views/Shared/Error.cshtml b/src/Security/samples/Cookies/Views/Shared/Error.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Views/Shared/Error.cshtml
rename to src/Security/samples/Cookies/Views/Shared/Error.cshtml
diff --git a/src/AuthSamples/samples/Cookies/Views/Shared/_Layout.cshtml b/src/Security/samples/Cookies/Views/Shared/_Layout.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Views/Shared/_Layout.cshtml
rename to src/Security/samples/Cookies/Views/Shared/_Layout.cshtml
diff --git a/src/AuthSamples/samples/Cookies/Views/Shared/_ValidationScriptsPartial.cshtml b/src/Security/samples/Cookies/Views/Shared/_ValidationScriptsPartial.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Views/Shared/_ValidationScriptsPartial.cshtml
rename to src/Security/samples/Cookies/Views/Shared/_ValidationScriptsPartial.cshtml
diff --git a/src/AuthSamples/samples/Cookies/Views/_ViewImports.cshtml b/src/Security/samples/Cookies/Views/_ViewImports.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Cookies/Views/_ViewImports.cshtml
rename to src/Security/samples/Cookies/Views/_ViewImports.cshtml
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Views/_ViewStart.cshtml b/src/Security/samples/Cookies/Views/_ViewStart.cshtml
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Views/_ViewStart.cshtml
rename to src/Security/samples/Cookies/Views/_ViewStart.cshtml
diff --git a/src/AuthSamples/samples/DynamicSchemes/appsettings.Development.json b/src/Security/samples/Cookies/appsettings.Development.json
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/appsettings.Development.json
rename to src/Security/samples/Cookies/appsettings.Development.json
diff --git a/src/AuthSamples/samples/Cookies/appsettings.json b/src/Security/samples/Cookies/appsettings.json
similarity index 100%
rename from src/AuthSamples/samples/Cookies/appsettings.json
rename to src/Security/samples/Cookies/appsettings.json
diff --git a/src/AuthSamples/samples/Cookies/bower.json b/src/Security/samples/Cookies/bower.json
similarity index 100%
rename from src/AuthSamples/samples/Cookies/bower.json
rename to src/Security/samples/Cookies/bower.json
diff --git a/src/AuthSamples/samples/Cookies/bundleconfig.json b/src/Security/samples/Cookies/bundleconfig.json
similarity index 100%
rename from src/AuthSamples/samples/Cookies/bundleconfig.json
rename to src/Security/samples/Cookies/bundleconfig.json
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/css/site.css b/src/Security/samples/Cookies/wwwroot/css/site.css
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/css/site.css
rename to src/Security/samples/Cookies/wwwroot/css/site.css
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/css/site.min.css b/src/Security/samples/Cookies/wwwroot/css/site.min.css
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/css/site.min.css
rename to src/Security/samples/Cookies/wwwroot/css/site.min.css
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/favicon.ico b/src/Security/samples/Cookies/wwwroot/favicon.ico
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/favicon.ico
rename to src/Security/samples/Cookies/wwwroot/favicon.ico
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/images/banner1.svg b/src/Security/samples/Cookies/wwwroot/images/banner1.svg
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/images/banner1.svg
rename to src/Security/samples/Cookies/wwwroot/images/banner1.svg
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/images/banner2.svg b/src/Security/samples/Cookies/wwwroot/images/banner2.svg
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/images/banner2.svg
rename to src/Security/samples/Cookies/wwwroot/images/banner2.svg
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/images/banner3.svg b/src/Security/samples/Cookies/wwwroot/images/banner3.svg
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/images/banner3.svg
rename to src/Security/samples/Cookies/wwwroot/images/banner3.svg
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/images/banner4.svg b/src/Security/samples/Cookies/wwwroot/images/banner4.svg
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/images/banner4.svg
rename to src/Security/samples/Cookies/wwwroot/images/banner4.svg
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/js/site.js b/src/Security/samples/Cookies/wwwroot/js/site.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/js/site.js
rename to src/Security/samples/Cookies/wwwroot/js/site.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/js/site.min.js b/src/Security/samples/Cookies/wwwroot/js/site.min.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/js/site.min.js
rename to src/Security/samples/Cookies/wwwroot/js/site.min.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/.bower.json b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/.bower.json
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/.bower.json
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/LICENSE b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/LICENSE
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/LICENSE
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/LICENSE
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.css b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.css
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.css
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.css
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/js/bootstrap.js b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/js/bootstrap.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/js/bootstrap.js
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/js/bootstrap.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/js/npm.js b/src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/js/npm.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/bootstrap/dist/js/npm.js
rename to src/Security/samples/Cookies/wwwroot/lib/bootstrap/dist/js/npm.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
rename to src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
rename to src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
rename to src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation/.bower.json b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation/.bower.json
rename to src/Security/samples/Cookies/wwwroot/lib/jquery-validation/.bower.json
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/LICENSE.md b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation/LICENSE.md
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/LICENSE.md
rename to src/Security/samples/Cookies/wwwroot/lib/jquery-validation/LICENSE.md
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation/dist/additional-methods.js b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation/dist/additional-methods.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation/dist/additional-methods.js
rename to src/Security/samples/Cookies/wwwroot/lib/jquery-validation/dist/additional-methods.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation/dist/additional-methods.min.js b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
rename to src/Security/samples/Cookies/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation/dist/jquery.validate.js b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation/dist/jquery.validate.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation/dist/jquery.validate.js
rename to src/Security/samples/Cookies/wwwroot/lib/jquery-validation/dist/jquery.validate.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
rename to src/Security/samples/Cookies/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery/.bower.json b/src/Security/samples/Cookies/wwwroot/lib/jquery/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery/.bower.json
rename to src/Security/samples/Cookies/wwwroot/lib/jquery/.bower.json
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/Cookies/wwwroot/lib/jquery/LICENSE.txt
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery/LICENSE.txt
rename to src/Security/samples/Cookies/wwwroot/lib/jquery/LICENSE.txt
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery/dist/jquery.js
rename to src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.js b/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.js
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.js
rename to src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.js
diff --git a/src/AuthSamples/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.map
similarity index 100%
rename from src/AuthSamples/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.map
rename to src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.map
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Authorization/MinimumAgeAuthorizationHandler.cs b/src/Security/samples/CustomPolicyProvider/Authorization/MinimumAgeAuthorizationHandler.cs
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Authorization/MinimumAgeAuthorizationHandler.cs
rename to src/Security/samples/CustomPolicyProvider/Authorization/MinimumAgeAuthorizationHandler.cs
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Authorization/MinimumAgeAuthorizeAttribute.cs b/src/Security/samples/CustomPolicyProvider/Authorization/MinimumAgeAuthorizeAttribute.cs
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Authorization/MinimumAgeAuthorizeAttribute.cs
rename to src/Security/samples/CustomPolicyProvider/Authorization/MinimumAgeAuthorizeAttribute.cs
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Authorization/MinimumAgePolicyProvider.cs b/src/Security/samples/CustomPolicyProvider/Authorization/MinimumAgePolicyProvider.cs
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Authorization/MinimumAgePolicyProvider.cs
rename to src/Security/samples/CustomPolicyProvider/Authorization/MinimumAgePolicyProvider.cs
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Authorization/MinimumAgeRequirement.cs b/src/Security/samples/CustomPolicyProvider/Authorization/MinimumAgeRequirement.cs
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Authorization/MinimumAgeRequirement.cs
rename to src/Security/samples/CustomPolicyProvider/Authorization/MinimumAgeRequirement.cs
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Controllers/AccountController.cs b/src/Security/samples/CustomPolicyProvider/Controllers/AccountController.cs
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Controllers/AccountController.cs
rename to src/Security/samples/CustomPolicyProvider/Controllers/AccountController.cs
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Controllers/HomeController.cs b/src/Security/samples/CustomPolicyProvider/Controllers/HomeController.cs
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Controllers/HomeController.cs
rename to src/Security/samples/CustomPolicyProvider/Controllers/HomeController.cs
diff --git a/src/Security/samples/CustomPolicyProvider/CustomPolicyProvider.csproj b/src/Security/samples/CustomPolicyProvider/CustomPolicyProvider.csproj
new file mode 100644
index 0000000000..70e4609aae
--- /dev/null
+++ b/src/Security/samples/CustomPolicyProvider/CustomPolicyProvider.csproj
@@ -0,0 +1,15 @@
+
+
+
+ netcoreapp3.0
+ true
+
+
+
+
+
+
+
+
+
+
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Program.cs b/src/Security/samples/CustomPolicyProvider/Program.cs
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Program.cs
rename to src/Security/samples/CustomPolicyProvider/Program.cs
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Startup.cs b/src/Security/samples/CustomPolicyProvider/Startup.cs
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Startup.cs
rename to src/Security/samples/CustomPolicyProvider/Startup.cs
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Views/Account/Denied.cshtml b/src/Security/samples/CustomPolicyProvider/Views/Account/Denied.cshtml
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Views/Account/Denied.cshtml
rename to src/Security/samples/CustomPolicyProvider/Views/Account/Denied.cshtml
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Views/Account/Signin.cshtml b/src/Security/samples/CustomPolicyProvider/Views/Account/Signin.cshtml
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Views/Account/Signin.cshtml
rename to src/Security/samples/CustomPolicyProvider/Views/Account/Signin.cshtml
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Views/Home/Index.cshtml b/src/Security/samples/CustomPolicyProvider/Views/Home/Index.cshtml
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Views/Home/Index.cshtml
rename to src/Security/samples/CustomPolicyProvider/Views/Home/Index.cshtml
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/Views/Home/MinimumAge.cshtml b/src/Security/samples/CustomPolicyProvider/Views/Home/MinimumAge.cshtml
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/Views/Home/MinimumAge.cshtml
rename to src/Security/samples/CustomPolicyProvider/Views/Home/MinimumAge.cshtml
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/appsettings.Development.json b/src/Security/samples/CustomPolicyProvider/appsettings.Development.json
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/appsettings.Development.json
rename to src/Security/samples/CustomPolicyProvider/appsettings.Development.json
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/appsettings.json b/src/Security/samples/CustomPolicyProvider/appsettings.json
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/appsettings.json
rename to src/Security/samples/CustomPolicyProvider/appsettings.json
diff --git a/src/AuthSamples/samples/CustomPolicyProvider/readme.md b/src/Security/samples/CustomPolicyProvider/readme.md
similarity index 100%
rename from src/AuthSamples/samples/CustomPolicyProvider/readme.md
rename to src/Security/samples/CustomPolicyProvider/readme.md
diff --git a/src/AuthSamples/samples/DynamicSchemes/Controllers/AuthController.cs b/src/Security/samples/DynamicSchemes/Controllers/AuthController.cs
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Controllers/AuthController.cs
rename to src/Security/samples/DynamicSchemes/Controllers/AuthController.cs
diff --git a/src/Security/samples/DynamicSchemes/DynamicSchemes.csproj b/src/Security/samples/DynamicSchemes/DynamicSchemes.csproj
new file mode 100644
index 0000000000..2c65adebba
--- /dev/null
+++ b/src/Security/samples/DynamicSchemes/DynamicSchemes.csproj
@@ -0,0 +1,26 @@
+
+
+ netcoreapp3.0
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/AuthSamples/samples/DynamicSchemes/Pages/About.cshtml b/src/Security/samples/DynamicSchemes/Pages/About.cshtml
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Pages/About.cshtml
rename to src/Security/samples/DynamicSchemes/Pages/About.cshtml
diff --git a/src/AuthSamples/samples/DynamicSchemes/Pages/About.cshtml.cs b/src/Security/samples/DynamicSchemes/Pages/About.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Pages/About.cshtml.cs
rename to src/Security/samples/DynamicSchemes/Pages/About.cshtml.cs
diff --git a/src/AuthSamples/samples/DynamicSchemes/Pages/Contact.cshtml b/src/Security/samples/DynamicSchemes/Pages/Contact.cshtml
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Pages/Contact.cshtml
rename to src/Security/samples/DynamicSchemes/Pages/Contact.cshtml
diff --git a/src/AuthSamples/samples/DynamicSchemes/Pages/Contact.cshtml.cs b/src/Security/samples/DynamicSchemes/Pages/Contact.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Pages/Contact.cshtml.cs
rename to src/Security/samples/DynamicSchemes/Pages/Contact.cshtml.cs
diff --git a/src/AuthSamples/samples/DynamicSchemes/Pages/Error.cshtml b/src/Security/samples/DynamicSchemes/Pages/Error.cshtml
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Pages/Error.cshtml
rename to src/Security/samples/DynamicSchemes/Pages/Error.cshtml
diff --git a/src/AuthSamples/samples/DynamicSchemes/Pages/Error.cshtml.cs b/src/Security/samples/DynamicSchemes/Pages/Error.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Pages/Error.cshtml.cs
rename to src/Security/samples/DynamicSchemes/Pages/Error.cshtml.cs
diff --git a/src/AuthSamples/samples/DynamicSchemes/Pages/Index.cshtml b/src/Security/samples/DynamicSchemes/Pages/Index.cshtml
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Pages/Index.cshtml
rename to src/Security/samples/DynamicSchemes/Pages/Index.cshtml
diff --git a/src/AuthSamples/samples/DynamicSchemes/Pages/Index.cshtml.cs b/src/Security/samples/DynamicSchemes/Pages/Index.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Pages/Index.cshtml.cs
rename to src/Security/samples/DynamicSchemes/Pages/Index.cshtml.cs
diff --git a/src/AuthSamples/samples/DynamicSchemes/Pages/_Layout.cshtml b/src/Security/samples/DynamicSchemes/Pages/_Layout.cshtml
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Pages/_Layout.cshtml
rename to src/Security/samples/DynamicSchemes/Pages/_Layout.cshtml
diff --git a/src/AuthSamples/samples/DynamicSchemes/Pages/_ValidationScriptsPartial.cshtml b/src/Security/samples/DynamicSchemes/Pages/_ValidationScriptsPartial.cshtml
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Pages/_ValidationScriptsPartial.cshtml
rename to src/Security/samples/DynamicSchemes/Pages/_ValidationScriptsPartial.cshtml
diff --git a/src/AuthSamples/samples/DynamicSchemes/Pages/_ViewImports.cshtml b/src/Security/samples/DynamicSchemes/Pages/_ViewImports.cshtml
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Pages/_ViewImports.cshtml
rename to src/Security/samples/DynamicSchemes/Pages/_ViewImports.cshtml
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Views/_ViewStart.cshtml b/src/Security/samples/DynamicSchemes/Pages/_ViewStart.cshtml
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Views/_ViewStart.cshtml
rename to src/Security/samples/DynamicSchemes/Pages/_ViewStart.cshtml
diff --git a/src/AuthSamples/samples/DynamicSchemes/Program.cs b/src/Security/samples/DynamicSchemes/Program.cs
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Program.cs
rename to src/Security/samples/DynamicSchemes/Program.cs
diff --git a/src/AuthSamples/samples/DynamicSchemes/README.md b/src/Security/samples/DynamicSchemes/README.md
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/README.md
rename to src/Security/samples/DynamicSchemes/README.md
diff --git a/src/AuthSamples/samples/DynamicSchemes/SimpleAuthHandler.cs b/src/Security/samples/DynamicSchemes/SimpleAuthHandler.cs
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/SimpleAuthHandler.cs
rename to src/Security/samples/DynamicSchemes/SimpleAuthHandler.cs
diff --git a/src/AuthSamples/samples/DynamicSchemes/Startup.cs b/src/Security/samples/DynamicSchemes/Startup.cs
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/Startup.cs
rename to src/Security/samples/DynamicSchemes/Startup.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/appsettings.Development.json b/src/Security/samples/DynamicSchemes/appsettings.Development.json
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/appsettings.Development.json
rename to src/Security/samples/DynamicSchemes/appsettings.Development.json
diff --git a/src/AuthSamples/samples/DynamicSchemes/appsettings.json b/src/Security/samples/DynamicSchemes/appsettings.json
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/appsettings.json
rename to src/Security/samples/DynamicSchemes/appsettings.json
diff --git a/src/AuthSamples/samples/DynamicSchemes/bundleconfig.json b/src/Security/samples/DynamicSchemes/bundleconfig.json
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/bundleconfig.json
rename to src/Security/samples/DynamicSchemes/bundleconfig.json
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/css/site.css b/src/Security/samples/DynamicSchemes/wwwroot/css/site.css
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/css/site.css
rename to src/Security/samples/DynamicSchemes/wwwroot/css/site.css
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/css/site.min.css b/src/Security/samples/DynamicSchemes/wwwroot/css/site.min.css
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/css/site.min.css
rename to src/Security/samples/DynamicSchemes/wwwroot/css/site.min.css
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/favicon.ico b/src/Security/samples/DynamicSchemes/wwwroot/favicon.ico
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/favicon.ico
rename to src/Security/samples/DynamicSchemes/wwwroot/favicon.ico
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/images/banner1.svg b/src/Security/samples/DynamicSchemes/wwwroot/images/banner1.svg
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/images/banner1.svg
rename to src/Security/samples/DynamicSchemes/wwwroot/images/banner1.svg
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/images/banner2.svg b/src/Security/samples/DynamicSchemes/wwwroot/images/banner2.svg
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/images/banner2.svg
rename to src/Security/samples/DynamicSchemes/wwwroot/images/banner2.svg
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/images/banner3.svg b/src/Security/samples/DynamicSchemes/wwwroot/images/banner3.svg
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/images/banner3.svg
rename to src/Security/samples/DynamicSchemes/wwwroot/images/banner3.svg
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/images/banner4.svg b/src/Security/samples/DynamicSchemes/wwwroot/images/banner4.svg
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/images/banner4.svg
rename to src/Security/samples/DynamicSchemes/wwwroot/images/banner4.svg
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/js/site.js b/src/Security/samples/DynamicSchemes/wwwroot/js/site.js
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/js/site.js
rename to src/Security/samples/DynamicSchemes/wwwroot/js/site.js
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/js/site.min.js b/src/Security/samples/DynamicSchemes/wwwroot/js/site.min.js
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/js/site.min.js
rename to src/Security/samples/DynamicSchemes/wwwroot/js/site.min.js
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/.bower.json b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/.bower.json
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/.bower.json
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/LICENSE b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/LICENSE
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/LICENSE
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/LICENSE
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.css b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.css
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.css
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.css
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/js/bootstrap.js b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/js/bootstrap.js
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/js/bootstrap.js
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/js/bootstrap.js
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/js/npm.js b/src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/js/npm.js
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/js/npm.js
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/bootstrap/dist/js/npm.js
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation/.bower.json b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation/.bower.json
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation/.bower.json
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/LICENSE.md b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation/LICENSE.md
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/LICENSE.md
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation/LICENSE.md
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation/dist/additional-methods.js b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation/dist/additional-methods.js
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation/dist/additional-methods.js
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation/dist/additional-methods.js
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation/dist/jquery.validate.js b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation/dist/jquery.validate.js
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery-validation/dist/jquery.validate.js
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation/dist/jquery.validate.js
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery/.bower.json b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery/.bower.json
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/.bower.json
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/LICENSE.txt
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery/LICENSE.txt
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/LICENSE.txt
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.js
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.js
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.js
diff --git a/src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.map
similarity index 100%
rename from src/AuthSamples/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.map
rename to src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.map
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Controllers/AccountController.cs b/src/Security/samples/Identity.ExternalClaims/Controllers/AccountController.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Controllers/AccountController.cs
rename to src/Security/samples/Identity.ExternalClaims/Controllers/AccountController.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Data/ApplicationDbContext.cs b/src/Security/samples/Identity.ExternalClaims/Data/ApplicationDbContext.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Data/ApplicationDbContext.cs
rename to src/Security/samples/Identity.ExternalClaims/Data/ApplicationDbContext.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Data/ApplicationUser.cs b/src/Security/samples/Identity.ExternalClaims/Data/ApplicationUser.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Data/ApplicationUser.cs
rename to src/Security/samples/Identity.ExternalClaims/Data/ApplicationUser.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Data/Migrations/00000000000000_CreateIdentitySchema.Designer.cs b/src/Security/samples/Identity.ExternalClaims/Data/Migrations/00000000000000_CreateIdentitySchema.Designer.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Data/Migrations/00000000000000_CreateIdentitySchema.Designer.cs
rename to src/Security/samples/Identity.ExternalClaims/Data/Migrations/00000000000000_CreateIdentitySchema.Designer.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Data/Migrations/00000000000000_CreateIdentitySchema.cs b/src/Security/samples/Identity.ExternalClaims/Data/Migrations/00000000000000_CreateIdentitySchema.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Data/Migrations/00000000000000_CreateIdentitySchema.cs
rename to src/Security/samples/Identity.ExternalClaims/Data/Migrations/00000000000000_CreateIdentitySchema.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Data/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Security/samples/Identity.ExternalClaims/Data/Migrations/ApplicationDbContextModelSnapshot.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Data/Migrations/ApplicationDbContextModelSnapshot.cs
rename to src/Security/samples/Identity.ExternalClaims/Data/Migrations/ApplicationDbContextModelSnapshot.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Extensions/EmailSenderExtensions.cs b/src/Security/samples/Identity.ExternalClaims/Extensions/EmailSenderExtensions.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Extensions/EmailSenderExtensions.cs
rename to src/Security/samples/Identity.ExternalClaims/Extensions/EmailSenderExtensions.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Extensions/UrlHelperExtensions.cs b/src/Security/samples/Identity.ExternalClaims/Extensions/UrlHelperExtensions.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Extensions/UrlHelperExtensions.cs
rename to src/Security/samples/Identity.ExternalClaims/Extensions/UrlHelperExtensions.cs
diff --git a/src/Security/samples/Identity.ExternalClaims/Identity.ExternalClaims.csproj b/src/Security/samples/Identity.ExternalClaims/Identity.ExternalClaims.csproj
new file mode 100644
index 0000000000..cf7f7ee9b7
--- /dev/null
+++ b/src/Security/samples/Identity.ExternalClaims/Identity.ExternalClaims.csproj
@@ -0,0 +1,31 @@
+
+
+ netcoreapp3.0
+ aspnet-Identity.ExternalClaims-E95BE154-CB1B-4633-A2E0-B2DF12FE8BD3
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/AccessDenied.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/AccessDenied.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/AccessDenied.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/AccessDenied.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/AccessDenied.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/AccessDenied.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/AccessDenied.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/AccessDenied.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ConfirmEmail.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ConfirmEmail.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ConfirmEmail.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ConfirmEmail.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ConfirmEmail.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ConfirmEmail.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ConfirmEmail.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ConfirmEmail.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ExternalLogin.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ExternalLogin.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ExternalLogin.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ExternalLogin.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ExternalLogin.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ExternalLogin.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ExternalLogin.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ExternalLogin.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ForgotPassword.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ForgotPassword.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ForgotPassword.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ForgotPassword.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ForgotPassword.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ForgotPassword.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ForgotPassword.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ForgotPassword.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ForgotPasswordConfirmation.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ForgotPasswordConfirmation.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ForgotPasswordConfirmation.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ForgotPasswordConfirmation.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ForgotPasswordConfirmation.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ForgotPasswordConfirmation.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ForgotPasswordConfirmation.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ForgotPasswordConfirmation.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Lockout.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Lockout.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Lockout.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Lockout.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Lockout.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Lockout.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Lockout.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Lockout.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Login.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Login.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Login.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Login.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Login.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Login.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Login.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Login.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/LoginWith2fa.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/LoginWith2fa.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/LoginWith2fa.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/LoginWith2fa.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/LoginWith2fa.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/LoginWith2fa.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/LoginWith2fa.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/LoginWith2fa.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/LoginWithRecoveryCode.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/LoginWithRecoveryCode.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/LoginWithRecoveryCode.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/LoginWithRecoveryCode.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/LoginWithRecoveryCode.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/LoginWithRecoveryCode.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/LoginWithRecoveryCode.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/LoginWithRecoveryCode.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ChangePassword.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ChangePassword.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ChangePassword.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ChangePassword.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ChangePassword.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ChangePassword.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ChangePassword.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ChangePassword.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/Disable2fa.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/Disable2fa.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/Disable2fa.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/Disable2fa.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/Disable2fa.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/Disable2fa.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/Disable2fa.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/Disable2fa.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/EnableAuthenticator.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/EnableAuthenticator.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/EnableAuthenticator.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/EnableAuthenticator.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/EnableAuthenticator.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/EnableAuthenticator.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/EnableAuthenticator.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/EnableAuthenticator.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ExternalLogins.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ExternalLogins.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ExternalLogins.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ExternalLogins.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ExternalLogins.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ExternalLogins.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ExternalLogins.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ExternalLogins.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/GenerateRecoveryCodes.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/GenerateRecoveryCodes.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/GenerateRecoveryCodes.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/GenerateRecoveryCodes.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/GenerateRecoveryCodes.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/GenerateRecoveryCodes.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/GenerateRecoveryCodes.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/GenerateRecoveryCodes.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/Index.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/Index.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/Index.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/Index.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/Index.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/Index.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/Index.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/Index.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ManageNavPages.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ManageNavPages.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ManageNavPages.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ManageNavPages.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ResetAuthenticator.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ResetAuthenticator.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ResetAuthenticator.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ResetAuthenticator.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ResetAuthenticator.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ResetAuthenticator.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/ResetAuthenticator.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/ResetAuthenticator.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/SetPassword.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/SetPassword.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/SetPassword.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/SetPassword.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/SetPassword.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/SetPassword.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/SetPassword.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/SetPassword.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/TwoFactorAuthentication.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/TwoFactorAuthentication.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/TwoFactorAuthentication.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/TwoFactorAuthentication.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/TwoFactorAuthentication.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/TwoFactorAuthentication.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/TwoFactorAuthentication.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/TwoFactorAuthentication.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/_Layout.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/_Layout.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/_Layout.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/_Layout.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/_ManageNav.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/_ManageNav.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/_ManageNav.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/_ManageNav.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/_StatusMessage.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/_StatusMessage.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/_StatusMessage.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/_StatusMessage.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/_ViewImports.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/_ViewImports.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Manage/_ViewImports.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Manage/_ViewImports.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ResetPassword.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ResetPassword.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ResetPassword.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ResetPassword.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ResetPassword.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ResetPassword.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ResetPassword.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ResetPassword.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ResetPasswordConfirmation.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ResetPasswordConfirmation.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ResetPasswordConfirmation.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ResetPasswordConfirmation.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ResetPasswordConfirmation.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/ResetPasswordConfirmation.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/ResetPasswordConfirmation.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/ResetPasswordConfirmation.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/SignedOut.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/SignedOut.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/SignedOut.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/SignedOut.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/SignedOut.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/SignedOut.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/SignedOut.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/SignedOut.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/_ViewImports.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Account/_ViewImports.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Account/_ViewImports.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Account/_ViewImports.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Contact.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Contact.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Contact.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Contact.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Contact.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Contact.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Contact.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Contact.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Error.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Error.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Error.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Error.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Error.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Error.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Error.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Error.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Index.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/Index.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Index.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/Index.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/Index.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Index.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/Index.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/Index.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/MyClaims.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/MyClaims.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/MyClaims.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/MyClaims.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/MyClaims.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/MyClaims.cshtml.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/MyClaims.cshtml.cs
rename to src/Security/samples/Identity.ExternalClaims/Pages/MyClaims.cshtml.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/_Layout.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/_Layout.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/_Layout.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/_Layout.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/_LoginPartial.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/_LoginPartial.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/_LoginPartial.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/_LoginPartial.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/_ValidationScriptsPartial.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/_ValidationScriptsPartial.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/_ValidationScriptsPartial.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/_ValidationScriptsPartial.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Pages/_ViewImports.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/_ViewImports.cshtml
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Pages/_ViewImports.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/_ViewImports.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Pages/_ViewStart.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/_ViewStart.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Pages/_ViewStart.cshtml
rename to src/Security/samples/Identity.ExternalClaims/Pages/_ViewStart.cshtml
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Program.cs b/src/Security/samples/Identity.ExternalClaims/Program.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Program.cs
rename to src/Security/samples/Identity.ExternalClaims/Program.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/README.md b/src/Security/samples/Identity.ExternalClaims/README.md
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/README.md
rename to src/Security/samples/Identity.ExternalClaims/README.md
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Services/EmailSender.cs b/src/Security/samples/Identity.ExternalClaims/Services/EmailSender.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Services/EmailSender.cs
rename to src/Security/samples/Identity.ExternalClaims/Services/EmailSender.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Services/IEmailSender.cs b/src/Security/samples/Identity.ExternalClaims/Services/IEmailSender.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Services/IEmailSender.cs
rename to src/Security/samples/Identity.ExternalClaims/Services/IEmailSender.cs
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/Startup.cs b/src/Security/samples/Identity.ExternalClaims/Startup.cs
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/Startup.cs
rename to src/Security/samples/Identity.ExternalClaims/Startup.cs
diff --git a/src/AuthSamples/samples/PathSchemeSelection/appsettings.Development.json b/src/Security/samples/Identity.ExternalClaims/appsettings.Development.json
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/appsettings.Development.json
rename to src/Security/samples/Identity.ExternalClaims/appsettings.Development.json
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/appsettings.json b/src/Security/samples/Identity.ExternalClaims/appsettings.json
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/appsettings.json
rename to src/Security/samples/Identity.ExternalClaims/appsettings.json
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/bundleconfig.json b/src/Security/samples/Identity.ExternalClaims/bundleconfig.json
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/bundleconfig.json
rename to src/Security/samples/Identity.ExternalClaims/bundleconfig.json
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/css/site.css b/src/Security/samples/Identity.ExternalClaims/wwwroot/css/site.css
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/css/site.css
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/css/site.css
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/css/site.min.css b/src/Security/samples/Identity.ExternalClaims/wwwroot/css/site.min.css
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/css/site.min.css
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/css/site.min.css
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/wwwroot/favicon.ico b/src/Security/samples/Identity.ExternalClaims/wwwroot/favicon.ico
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/Angular-CSharp/wwwroot/favicon.ico
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/favicon.ico
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/images/banner1.svg b/src/Security/samples/Identity.ExternalClaims/wwwroot/images/banner1.svg
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/images/banner1.svg
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/images/banner1.svg
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/images/banner2.svg b/src/Security/samples/Identity.ExternalClaims/wwwroot/images/banner2.svg
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/images/banner2.svg
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/images/banner2.svg
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/images/banner3.svg b/src/Security/samples/Identity.ExternalClaims/wwwroot/images/banner3.svg
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/images/banner3.svg
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/images/banner3.svg
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/images/banner4.svg b/src/Security/samples/Identity.ExternalClaims/wwwroot/images/banner4.svg
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/images/banner4.svg
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/images/banner4.svg
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/js/site.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/js/site.js
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/js/site.js
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/js/site.js
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/js/site.min.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/js/site.min.js
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/js/site.min.js
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/js/site.min.js
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/.bower.json b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/.bower.json
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/.bower.json
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/LICENSE b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/LICENSE
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/LICENSE
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/LICENSE
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.css b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.css
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.css
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.css
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/js/bootstrap.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/js/bootstrap.js
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/js/bootstrap.js
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/js/bootstrap.js
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/js/npm.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/js/npm.js
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/js/npm.js
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/bootstrap/dist/js/npm.js
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/.bower.json b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/.bower.json
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/.bower.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation/LICENSE.md b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/LICENSE.md
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation/LICENSE.md
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/LICENSE.md
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/dist/additional-methods.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/dist/additional-methods.js
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/dist/additional-methods.js
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/dist/additional-methods.js
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/dist/jquery.validate.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/dist/jquery.validate.js
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/dist/jquery.validate.js
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation/dist/jquery.validate.js
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery/.bower.json b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery/.bower.json
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/.bower.json
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/LICENSE.txt
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery/LICENSE.txt
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/LICENSE.txt
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.js
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.js
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.js
diff --git a/src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.map
similarity index 100%
rename from src/AuthSamples/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.map
rename to src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.map
diff --git a/src/AuthSamples/samples/PathSchemeSelection/.bowerrc b/src/Security/samples/PathSchemeSelection/.bowerrc
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/.bowerrc
rename to src/Security/samples/PathSchemeSelection/.bowerrc
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Controllers/AccountController.cs b/src/Security/samples/PathSchemeSelection/Controllers/AccountController.cs
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Controllers/AccountController.cs
rename to src/Security/samples/PathSchemeSelection/Controllers/AccountController.cs
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Controllers/HomeController.cs b/src/Security/samples/PathSchemeSelection/Controllers/HomeController.cs
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Controllers/HomeController.cs
rename to src/Security/samples/PathSchemeSelection/Controllers/HomeController.cs
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Models/ErrorViewModel.cs b/src/Security/samples/PathSchemeSelection/Models/ErrorViewModel.cs
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Models/ErrorViewModel.cs
rename to src/Security/samples/PathSchemeSelection/Models/ErrorViewModel.cs
diff --git a/src/Security/samples/PathSchemeSelection/PathSchemeSelection.csproj b/src/Security/samples/PathSchemeSelection/PathSchemeSelection.csproj
new file mode 100644
index 0000000000..91734de305
--- /dev/null
+++ b/src/Security/samples/PathSchemeSelection/PathSchemeSelection.csproj
@@ -0,0 +1,16 @@
+
+
+
+ netcoreapp3.0
+ true
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Program.cs b/src/Security/samples/PathSchemeSelection/Program.cs
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Program.cs
rename to src/Security/samples/PathSchemeSelection/Program.cs
diff --git a/src/AuthSamples/samples/PathSchemeSelection/README.md b/src/Security/samples/PathSchemeSelection/README.md
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/README.md
rename to src/Security/samples/PathSchemeSelection/README.md
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Startup.cs b/src/Security/samples/PathSchemeSelection/Startup.cs
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Startup.cs
rename to src/Security/samples/PathSchemeSelection/Startup.cs
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Views/Account/AccessDenied.cshtml b/src/Security/samples/PathSchemeSelection/Views/Account/AccessDenied.cshtml
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Views/Account/AccessDenied.cshtml
rename to src/Security/samples/PathSchemeSelection/Views/Account/AccessDenied.cshtml
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Views/Account/Login.cshtml b/src/Security/samples/PathSchemeSelection/Views/Account/Login.cshtml
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Views/Account/Login.cshtml
rename to src/Security/samples/PathSchemeSelection/Views/Account/Login.cshtml
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Views/Home/Index.cshtml b/src/Security/samples/PathSchemeSelection/Views/Home/Index.cshtml
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Views/Home/Index.cshtml
rename to src/Security/samples/PathSchemeSelection/Views/Home/Index.cshtml
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Views/Home/MyClaims.cshtml b/src/Security/samples/PathSchemeSelection/Views/Home/MyClaims.cshtml
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Views/Home/MyClaims.cshtml
rename to src/Security/samples/PathSchemeSelection/Views/Home/MyClaims.cshtml
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Views/Shared/Error.cshtml b/src/Security/samples/PathSchemeSelection/Views/Shared/Error.cshtml
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Views/Shared/Error.cshtml
rename to src/Security/samples/PathSchemeSelection/Views/Shared/Error.cshtml
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Views/Shared/_Layout.cshtml b/src/Security/samples/PathSchemeSelection/Views/Shared/_Layout.cshtml
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Views/Shared/_Layout.cshtml
rename to src/Security/samples/PathSchemeSelection/Views/Shared/_Layout.cshtml
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Views/Shared/_ValidationScriptsPartial.cshtml b/src/Security/samples/PathSchemeSelection/Views/Shared/_ValidationScriptsPartial.cshtml
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Views/Shared/_ValidationScriptsPartial.cshtml
rename to src/Security/samples/PathSchemeSelection/Views/Shared/_ValidationScriptsPartial.cshtml
diff --git a/src/AuthSamples/samples/PathSchemeSelection/Views/_ViewImports.cshtml b/src/Security/samples/PathSchemeSelection/Views/_ViewImports.cshtml
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/Views/_ViewImports.cshtml
rename to src/Security/samples/PathSchemeSelection/Views/_ViewImports.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-CSharp/Views/_ViewStart.cshtml b/src/Security/samples/PathSchemeSelection/Views/_ViewStart.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-CSharp/Views/_ViewStart.cshtml
rename to src/Security/samples/PathSchemeSelection/Views/_ViewStart.cshtml
diff --git a/src/Components/test/testapps/TestServer/appsettings.Development.json b/src/Security/samples/PathSchemeSelection/appsettings.Development.json
similarity index 100%
rename from src/Components/test/testapps/TestServer/appsettings.Development.json
rename to src/Security/samples/PathSchemeSelection/appsettings.Development.json
diff --git a/src/AuthSamples/samples/PathSchemeSelection/appsettings.json b/src/Security/samples/PathSchemeSelection/appsettings.json
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/appsettings.json
rename to src/Security/samples/PathSchemeSelection/appsettings.json
diff --git a/src/AuthSamples/samples/PathSchemeSelection/bower.json b/src/Security/samples/PathSchemeSelection/bower.json
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/bower.json
rename to src/Security/samples/PathSchemeSelection/bower.json
diff --git a/src/AuthSamples/samples/PathSchemeSelection/bundleconfig.json b/src/Security/samples/PathSchemeSelection/bundleconfig.json
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/bundleconfig.json
rename to src/Security/samples/PathSchemeSelection/bundleconfig.json
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/css/site.css b/src/Security/samples/PathSchemeSelection/wwwroot/css/site.css
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/css/site.css
rename to src/Security/samples/PathSchemeSelection/wwwroot/css/site.css
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/css/site.min.css b/src/Security/samples/PathSchemeSelection/wwwroot/css/site.min.css
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/css/site.min.css
rename to src/Security/samples/PathSchemeSelection/wwwroot/css/site.min.css
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/favicon.ico b/src/Security/samples/PathSchemeSelection/wwwroot/favicon.ico
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/React-CSharp/ClientApp/public/favicon.ico
rename to src/Security/samples/PathSchemeSelection/wwwroot/favicon.ico
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/images/banner1.svg b/src/Security/samples/PathSchemeSelection/wwwroot/images/banner1.svg
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/images/banner1.svg
rename to src/Security/samples/PathSchemeSelection/wwwroot/images/banner1.svg
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/images/banner2.svg b/src/Security/samples/PathSchemeSelection/wwwroot/images/banner2.svg
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/images/banner2.svg
rename to src/Security/samples/PathSchemeSelection/wwwroot/images/banner2.svg
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/images/banner3.svg b/src/Security/samples/PathSchemeSelection/wwwroot/images/banner3.svg
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/images/banner3.svg
rename to src/Security/samples/PathSchemeSelection/wwwroot/images/banner3.svg
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/images/banner4.svg b/src/Security/samples/PathSchemeSelection/wwwroot/images/banner4.svg
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/images/banner4.svg
rename to src/Security/samples/PathSchemeSelection/wwwroot/images/banner4.svg
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/js/site.js b/src/Security/samples/PathSchemeSelection/wwwroot/js/site.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/js/site.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/js/site.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/js/site.min.js b/src/Security/samples/PathSchemeSelection/wwwroot/js/site.min.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/js/site.min.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/js/site.min.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/.bower.json b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/.bower.json
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/.bower.json
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/LICENSE b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/LICENSE
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/LICENSE
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/LICENSE
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.css b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.css
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.css
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.css
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/bootstrap.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/bootstrap.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/bootstrap.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/bootstrap.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/npm.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/npm.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/npm.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/bootstrap/dist/js/npm.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/.bower.json b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/.bower.json
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/.bower.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation/LICENSE.md b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/LICENSE.md
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation/LICENSE.md
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/LICENSE.md
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/additional-methods.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/additional-methods.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/additional-methods.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/additional-methods.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/additional-methods.min.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/jquery.validate.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/jquery.validate.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/jquery.validate.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/jquery.validate.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery/.bower.json b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery/.bower.json
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/.bower.json
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/LICENSE.txt
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery/LICENSE.txt
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/LICENSE.txt
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.js
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.js
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.js
diff --git a/src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.map
similarity index 100%
rename from src/AuthSamples/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.map
rename to src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.map
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Controllers/AccountController.cs b/src/Security/samples/StaticFilesAuth/Controllers/AccountController.cs
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Controllers/AccountController.cs
rename to src/Security/samples/StaticFilesAuth/Controllers/AccountController.cs
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Controllers/HomeController.cs b/src/Security/samples/StaticFilesAuth/Controllers/HomeController.cs
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Controllers/HomeController.cs
rename to src/Security/samples/StaticFilesAuth/Controllers/HomeController.cs
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Models/ErrorViewModel.cs b/src/Security/samples/StaticFilesAuth/Models/ErrorViewModel.cs
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Models/ErrorViewModel.cs
rename to src/Security/samples/StaticFilesAuth/Models/ErrorViewModel.cs
diff --git a/src/AuthSamples/samples/StaticFilesAuth/PrivateFiles/Users/User1/user1file.html b/src/Security/samples/StaticFilesAuth/PrivateFiles/Users/User1/user1file.html
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/PrivateFiles/Users/User1/user1file.html
rename to src/Security/samples/StaticFilesAuth/PrivateFiles/Users/User1/user1file.html
diff --git a/src/AuthSamples/samples/StaticFilesAuth/PrivateFiles/Users/User2/user2file.html b/src/Security/samples/StaticFilesAuth/PrivateFiles/Users/User2/user2file.html
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/PrivateFiles/Users/User2/user2file.html
rename to src/Security/samples/StaticFilesAuth/PrivateFiles/Users/User2/user2file.html
diff --git a/src/AuthSamples/samples/StaticFilesAuth/PrivateFiles/Users/privatesub.html b/src/Security/samples/StaticFilesAuth/PrivateFiles/Users/privatesub.html
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/PrivateFiles/Users/privatesub.html
rename to src/Security/samples/StaticFilesAuth/PrivateFiles/Users/privatesub.html
diff --git a/src/AuthSamples/samples/StaticFilesAuth/PrivateFiles/private.html b/src/Security/samples/StaticFilesAuth/PrivateFiles/private.html
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/PrivateFiles/private.html
rename to src/Security/samples/StaticFilesAuth/PrivateFiles/private.html
diff --git a/src/AuthSamples/samples/StaticFilesAuth/PrivateFiles/private.txt b/src/Security/samples/StaticFilesAuth/PrivateFiles/private.txt
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/PrivateFiles/private.txt
rename to src/Security/samples/StaticFilesAuth/PrivateFiles/private.txt
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Program.cs b/src/Security/samples/StaticFilesAuth/Program.cs
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Program.cs
rename to src/Security/samples/StaticFilesAuth/Program.cs
diff --git a/src/AuthSamples/samples/StaticFilesAuth/README.md b/src/Security/samples/StaticFilesAuth/README.md
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/README.md
rename to src/Security/samples/StaticFilesAuth/README.md
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Startup.cs b/src/Security/samples/StaticFilesAuth/Startup.cs
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Startup.cs
rename to src/Security/samples/StaticFilesAuth/Startup.cs
diff --git a/src/AuthSamples/samples/StaticFilesAuth/StaticFilesAuth.csproj b/src/Security/samples/StaticFilesAuth/StaticFilesAuth.csproj
similarity index 63%
rename from src/AuthSamples/samples/StaticFilesAuth/StaticFilesAuth.csproj
rename to src/Security/samples/StaticFilesAuth/StaticFilesAuth.csproj
index 9336ee497c..b9b72ef3a6 100644
--- a/src/AuthSamples/samples/StaticFilesAuth/StaticFilesAuth.csproj
+++ b/src/Security/samples/StaticFilesAuth/StaticFilesAuth.csproj
@@ -3,6 +3,7 @@
netcoreapp3.0
aspnet-StaticFilesAuth-AFE2BD9D-1575-4C3E-BE32-3F15C5BC9947
+ true
@@ -31,14 +32,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Views/Account/AccessDenied.cshtml b/src/Security/samples/StaticFilesAuth/Views/Account/AccessDenied.cshtml
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Views/Account/AccessDenied.cshtml
rename to src/Security/samples/StaticFilesAuth/Views/Account/AccessDenied.cshtml
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Views/Account/Login.cshtml b/src/Security/samples/StaticFilesAuth/Views/Account/Login.cshtml
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Views/Account/Login.cshtml
rename to src/Security/samples/StaticFilesAuth/Views/Account/Login.cshtml
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Views/Home/Index.cshtml b/src/Security/samples/StaticFilesAuth/Views/Home/Index.cshtml
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Views/Home/Index.cshtml
rename to src/Security/samples/StaticFilesAuth/Views/Home/Index.cshtml
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Views/Shared/Error.cshtml b/src/Security/samples/StaticFilesAuth/Views/Shared/Error.cshtml
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Views/Shared/Error.cshtml
rename to src/Security/samples/StaticFilesAuth/Views/Shared/Error.cshtml
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Views/Shared/_Layout.cshtml b/src/Security/samples/StaticFilesAuth/Views/Shared/_Layout.cshtml
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Views/Shared/_Layout.cshtml
rename to src/Security/samples/StaticFilesAuth/Views/Shared/_Layout.cshtml
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Views/Shared/_LoginPartial.cshtml b/src/Security/samples/StaticFilesAuth/Views/Shared/_LoginPartial.cshtml
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Views/Shared/_LoginPartial.cshtml
rename to src/Security/samples/StaticFilesAuth/Views/Shared/_LoginPartial.cshtml
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Views/Shared/_ValidationScriptsPartial.cshtml b/src/Security/samples/StaticFilesAuth/Views/Shared/_ValidationScriptsPartial.cshtml
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Views/Shared/_ValidationScriptsPartial.cshtml
rename to src/Security/samples/StaticFilesAuth/Views/Shared/_ValidationScriptsPartial.cshtml
diff --git a/src/AuthSamples/samples/StaticFilesAuth/Views/_ViewImports.cshtml b/src/Security/samples/StaticFilesAuth/Views/_ViewImports.cshtml
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/Views/_ViewImports.cshtml
rename to src/Security/samples/StaticFilesAuth/Views/_ViewImports.cshtml
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-FSharp/Views/_ViewStart.cshtml b/src/Security/samples/StaticFilesAuth/Views/_ViewStart.cshtml
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-FSharp/Views/_ViewStart.cshtml
rename to src/Security/samples/StaticFilesAuth/Views/_ViewStart.cshtml
diff --git a/src/AuthSamples/samples/StaticFilesAuth/appsettings.Development.json b/src/Security/samples/StaticFilesAuth/appsettings.Development.json
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/appsettings.Development.json
rename to src/Security/samples/StaticFilesAuth/appsettings.Development.json
diff --git a/src/AuthSamples/samples/StaticFilesAuth/appsettings.json b/src/Security/samples/StaticFilesAuth/appsettings.json
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/appsettings.json
rename to src/Security/samples/StaticFilesAuth/appsettings.json
diff --git a/src/AuthSamples/samples/StaticFilesAuth/bundleconfig.json b/src/Security/samples/StaticFilesAuth/bundleconfig.json
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/bundleconfig.json
rename to src/Security/samples/StaticFilesAuth/bundleconfig.json
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/css/site.css b/src/Security/samples/StaticFilesAuth/wwwroot/css/site.css
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/css/site.css
rename to src/Security/samples/StaticFilesAuth/wwwroot/css/site.css
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/css/site.min.css b/src/Security/samples/StaticFilesAuth/wwwroot/css/site.min.css
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/css/site.min.css
rename to src/Security/samples/StaticFilesAuth/wwwroot/css/site.min.css
diff --git a/src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/favicon.ico b/src/Security/samples/StaticFilesAuth/wwwroot/favicon.ico
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.Spa.ProjectTemplates/content/ReactRedux-CSharp/ClientApp/public/favicon.ico
rename to src/Security/samples/StaticFilesAuth/wwwroot/favicon.ico
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/images/banner1.svg b/src/Security/samples/StaticFilesAuth/wwwroot/images/banner1.svg
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/images/banner1.svg
rename to src/Security/samples/StaticFilesAuth/wwwroot/images/banner1.svg
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/images/banner2.svg b/src/Security/samples/StaticFilesAuth/wwwroot/images/banner2.svg
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/images/banner2.svg
rename to src/Security/samples/StaticFilesAuth/wwwroot/images/banner2.svg
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/images/banner3.svg b/src/Security/samples/StaticFilesAuth/wwwroot/images/banner3.svg
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/images/banner3.svg
rename to src/Security/samples/StaticFilesAuth/wwwroot/images/banner3.svg
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/images/banner4.svg b/src/Security/samples/StaticFilesAuth/wwwroot/images/banner4.svg
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/images/banner4.svg
rename to src/Security/samples/StaticFilesAuth/wwwroot/images/banner4.svg
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/js/site.js b/src/Security/samples/StaticFilesAuth/wwwroot/js/site.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/js/site.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/js/site.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/js/site.min.js b/src/Security/samples/StaticFilesAuth/wwwroot/js/site.min.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/js/site.min.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/js/site.min.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/.bower.json b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/.bower.json
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/.bower.json
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/LICENSE b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/LICENSE
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/LICENSE
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/LICENSE
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.css.map
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap-theme.min.css.map
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.css b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.css
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.css
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.css
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/bootstrap.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/bootstrap.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/bootstrap.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/bootstrap.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/npm.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/npm.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/npm.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/bootstrap/dist/js/npm.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/.bower.json b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/.bower.json
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/.bower.json
diff --git a/src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation/LICENSE.md b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/LICENSE.md
similarity index 100%
rename from src/Templating/src/Microsoft.DotNet.Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation/LICENSE.md
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/LICENSE.md
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/additional-methods.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/additional-methods.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/additional-methods.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/additional-methods.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/additional-methods.min.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/jquery.validate.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/jquery.validate.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/jquery.validate.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/jquery.validate.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery/.bower.json b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/.bower.json
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery/.bower.json
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/.bower.json
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/LICENSE.txt
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery/LICENSE.txt
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/LICENSE.txt
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.js
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.js
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.js
diff --git a/src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.map
similarity index 100%
rename from src/AuthSamples/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.map
rename to src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.map
diff --git a/src/Security/startvs.cmd b/src/Security/startvs.cmd
new file mode 100644
index 0000000000..dfbf0fe4c8
--- /dev/null
+++ b/src/Security/startvs.cmd
@@ -0,0 +1,3 @@
+@ECHO OFF
+
+%~dp0..\..\startvs.cmd %~dp0Security.sln
diff --git a/src/Security/test/AuthSamples.FunctionalTests/AuthSamples.FunctionalTests.csproj b/src/Security/test/AuthSamples.FunctionalTests/AuthSamples.FunctionalTests.csproj
new file mode 100644
index 0000000000..fb386d335c
--- /dev/null
+++ b/src/Security/test/AuthSamples.FunctionalTests/AuthSamples.FunctionalTests.csproj
@@ -0,0 +1,29 @@
+
+
+
+ netcoreapp3.0
+ false
+ AnyCPU
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/AuthSamples/test/AuthSamples.FunctionalTests/ClaimsTransformTests.cs b/src/Security/test/AuthSamples.FunctionalTests/ClaimsTransformTests.cs
similarity index 100%
rename from src/AuthSamples/test/AuthSamples.FunctionalTests/ClaimsTransformTests.cs
rename to src/Security/test/AuthSamples.FunctionalTests/ClaimsTransformTests.cs
diff --git a/src/AuthSamples/test/AuthSamples.FunctionalTests/CookiesTests.cs b/src/Security/test/AuthSamples.FunctionalTests/CookiesTests.cs
similarity index 100%
rename from src/AuthSamples/test/AuthSamples.FunctionalTests/CookiesTests.cs
rename to src/Security/test/AuthSamples.FunctionalTests/CookiesTests.cs
diff --git a/src/AuthSamples/test/AuthSamples.FunctionalTests/CustomPolicyProviderTests.cs b/src/Security/test/AuthSamples.FunctionalTests/CustomPolicyProviderTests.cs
similarity index 100%
rename from src/AuthSamples/test/AuthSamples.FunctionalTests/CustomPolicyProviderTests.cs
rename to src/Security/test/AuthSamples.FunctionalTests/CustomPolicyProviderTests.cs
diff --git a/src/AuthSamples/test/AuthSamples.FunctionalTests/DynamicSchemeTests.cs b/src/Security/test/AuthSamples.FunctionalTests/DynamicSchemeTests.cs
similarity index 100%
rename from src/AuthSamples/test/AuthSamples.FunctionalTests/DynamicSchemeTests.cs
rename to src/Security/test/AuthSamples.FunctionalTests/DynamicSchemeTests.cs
diff --git a/src/AuthSamples/test/AuthSamples.FunctionalTests/HttpClientExtensions.cs b/src/Security/test/AuthSamples.FunctionalTests/HttpClientExtensions.cs
similarity index 100%
rename from src/AuthSamples/test/AuthSamples.FunctionalTests/HttpClientExtensions.cs
rename to src/Security/test/AuthSamples.FunctionalTests/HttpClientExtensions.cs
diff --git a/src/AuthSamples/test/AuthSamples.FunctionalTests/IdentityExternalClaimsTests.cs b/src/Security/test/AuthSamples.FunctionalTests/IdentityExternalClaimsTests.cs
similarity index 100%
rename from src/AuthSamples/test/AuthSamples.FunctionalTests/IdentityExternalClaimsTests.cs
rename to src/Security/test/AuthSamples.FunctionalTests/IdentityExternalClaimsTests.cs
diff --git a/src/AuthSamples/test/AuthSamples.FunctionalTests/PathSchemeSelectionTests.cs b/src/Security/test/AuthSamples.FunctionalTests/PathSchemeSelectionTests.cs
similarity index 100%
rename from src/AuthSamples/test/AuthSamples.FunctionalTests/PathSchemeSelectionTests.cs
rename to src/Security/test/AuthSamples.FunctionalTests/PathSchemeSelectionTests.cs
diff --git a/src/AuthSamples/test/AuthSamples.FunctionalTests/StaticFilesAuthTests.cs b/src/Security/test/AuthSamples.FunctionalTests/StaticFilesAuthTests.cs
similarity index 100%
rename from src/AuthSamples/test/AuthSamples.FunctionalTests/StaticFilesAuthTests.cs
rename to src/Security/test/AuthSamples.FunctionalTests/StaticFilesAuthTests.cs
diff --git a/src/AuthSamples/test/AuthSamples.FunctionalTests/TestAssert.cs b/src/Security/test/AuthSamples.FunctionalTests/TestAssert.cs
similarity index 100%
rename from src/AuthSamples/test/AuthSamples.FunctionalTests/TestAssert.cs
rename to src/Security/test/AuthSamples.FunctionalTests/TestAssert.cs
diff --git a/src/AuthSamples/test/AuthSamples.FunctionalTests/xunit.runner.json b/src/Security/test/AuthSamples.FunctionalTests/xunit.runner.json
similarity index 100%
rename from src/AuthSamples/test/AuthSamples.FunctionalTests/xunit.runner.json
rename to src/Security/test/AuthSamples.FunctionalTests/xunit.runner.json
diff --git a/src/Servers/Connections.Abstractions/src/ConnectionContext.cs b/src/Servers/Connections.Abstractions/src/ConnectionContext.cs
index 680762d680..a709a5f891 100644
--- a/src/Servers/Connections.Abstractions/src/ConnectionContext.cs
+++ b/src/Servers/Connections.Abstractions/src/ConnectionContext.cs
@@ -1,4 +1,4 @@
-// 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.
using System.Collections.Generic;
@@ -26,6 +26,6 @@ namespace Microsoft.AspNetCore.Connections
Features.Get()?.Abort();
}
- public virtual void Abort() => Abort(new ConnectionAbortedException("The connection was aborted by the application."));
+ public virtual void Abort() => Abort(new ConnectionAbortedException("The connection was aborted by the application via ConnectionContext.Abort()."));
}
}
diff --git a/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj b/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj
index 8ce855f807..baa0fd66b2 100644
--- a/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj
+++ b/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj
@@ -6,7 +6,7 @@
true
aspnetcore
CS1591;$(NoWarn)
- true
+ true
diff --git a/src/Servers/HttpSys/build.cmd b/src/Servers/HttpSys/build.cmd
new file mode 100644
index 0000000000..bc82307787
--- /dev/null
+++ b/src/Servers/HttpSys/build.cmd
@@ -0,0 +1,3 @@
+@ECHO OFF
+SET RepoRoot=%~dp0..\..\..
+%RepoRoot%\build.cmd -projects %~dp0\**\*.*proj %*
diff --git a/src/Servers/HttpSys/src/HttpSysDefaults.cs b/src/Servers/HttpSys/src/HttpSysDefaults.cs
index ea22e86d8e..fde04af7ba 100644
--- a/src/Servers/HttpSys/src/HttpSysDefaults.cs
+++ b/src/Servers/HttpSys/src/HttpSysDefaults.cs
@@ -8,6 +8,6 @@ namespace Microsoft.AspNetCore.Server.HttpSys
///
/// The name of the authentication scheme used.
///
- public static readonly string AuthenticationScheme = "Windows";
+ public const string AuthenticationScheme = "Windows";
}
}
diff --git a/src/Servers/HttpSys/test/FunctionalTests/AuthenticationTests.cs b/src/Servers/HttpSys/test/FunctionalTests/AuthenticationTests.cs
index f533303309..4e8679b193 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/AuthenticationTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/AuthenticationTests.cs
@@ -8,6 +8,7 @@ using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
using Xunit;
@@ -167,7 +168,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
[ConditionalFact]
public async Task AuthTypes_AccessUserInOnCompleted_Success()
{
- var completed = new ManualResetEvent(false);
+ var completed = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
string userName = null;
var authTypes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.NTLM;
using (var server = Utilities.CreateDynamicHost(authTypes, DenyAnoymous, out var address, httpContext =>
@@ -178,7 +179,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
httpContext.Response.OnCompleted(() =>
{
userName = httpContext.User.Identity.Name;
- completed.Set();
+ completed.SetResult(0);
return Task.FromResult(0);
});
return Task.FromResult(0);
@@ -186,7 +187,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
{
var response = await SendRequestAsync(address, useDefaultCredentials: true);
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.True(completed.WaitOne(TimeSpan.FromSeconds(5)));
+ await completed.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
Assert.False(string.IsNullOrEmpty(userName));
}
}
diff --git a/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs b/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs
index 2cb25cc3c1..bb14512fa8 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs
@@ -9,6 +9,7 @@ using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
using Xunit;
@@ -20,7 +21,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener
public async Task Server_TokenRegisteredAfterClientDisconnects_CallCanceled()
{
var interval = TimeSpan.FromSeconds(1);
- var canceled = new ManualResetEvent(false);
+ var canceled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
string address;
using (var server = Utilities.CreateHttpServer(out address))
@@ -36,11 +37,11 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener
var ct = context.DisconnectToken;
Assert.True(ct.CanBeCanceled, "CanBeCanceled");
- ct.Register(() => canceled.Set());
+ ct.Register(() => canceled.SetResult(0));
Assert.True(ct.WaitHandle.WaitOne(interval));
Assert.True(ct.IsCancellationRequested, "IsCancellationRequested");
- Assert.True(canceled.WaitOne(interval), "canceled");
+ await canceled.Task.TimeoutAfter(interval);
context.Dispose();
}
@@ -51,7 +52,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener
public async Task Server_TokenRegisteredAfterResponseSent_Success()
{
var interval = TimeSpan.FromSeconds(1);
- var canceled = new ManualResetEvent(false);
+ var canceled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
string address;
using (var server = Utilities.CreateHttpServer(out address))
@@ -69,11 +70,11 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener
var ct = context.DisconnectToken;
Assert.False(ct.CanBeCanceled, "CanBeCanceled");
- ct.Register(() => canceled.Set());
+ ct.Register(() => canceled.SetResult(0));
Assert.False(ct.WaitHandle.WaitOne(interval));
Assert.False(ct.IsCancellationRequested, "IsCancellationRequested");
- Assert.False(canceled.WaitOne(interval), "canceled");
+ Assert.False(canceled.Task.IsCompleted, "canceled");
}
}
}
@@ -82,7 +83,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener
public async Task Server_ConnectionCloseHeader_CancellationTokenFires()
{
var interval = TimeSpan.FromSeconds(1);
- var canceled = new ManualResetEvent(false);
+ var canceled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
string address;
using (var server = Utilities.CreateHttpServer(out address))
@@ -93,7 +94,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener
var ct = context.DisconnectToken;
Assert.True(ct.CanBeCanceled, "CanBeCanceled");
Assert.False(ct.IsCancellationRequested, "IsCancellationRequested");
- ct.Register(() => canceled.Set());
+ ct.Register(() => canceled.SetResult(0));
context.Response.Headers["Connection"] = "close";
@@ -102,7 +103,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener
await writer.WriteAsync("Hello World");
await writer.FlushAsync();
- Assert.True(canceled.WaitOne(interval), "Disconnected");
+ await canceled.Task.TimeoutAfter(interval);
Assert.True(ct.IsCancellationRequested, "IsCancellationRequested");
var response = await responseTask;
diff --git a/src/Servers/HttpSys/test/FunctionalTests/OpaqueUpgradeTests.cs b/src/Servers/HttpSys/test/FunctionalTests/OpaqueUpgradeTests.cs
index c9bebee2de..24144bf04a 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/OpaqueUpgradeTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/OpaqueUpgradeTests.cs
@@ -10,6 +10,7 @@ using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
using Xunit;
@@ -104,25 +105,20 @@ namespace Microsoft.AspNetCore.Server.HttpSys
[OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, WindowsVersions.Win2008R2)]
public async Task OpaqueUpgrade_GetUpgrade_Success()
{
- ManualResetEvent waitHandle = new ManualResetEvent(false);
- bool? upgraded = null;
- string address;
- using (Utilities.CreateHttpServer(out address, async httpContext =>
+ var upgraded = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (Utilities.CreateHttpServer(out var address, async httpContext =>
{
httpContext.Response.Headers["Upgrade"] = "websocket"; // Win8.1 blocks anything but WebSockets
var opaqueFeature = httpContext.Features.Get();
Assert.NotNull(opaqueFeature);
Assert.True(opaqueFeature.IsUpgradableRequest);
await opaqueFeature.UpgradeAsync();
- upgraded = true;
- waitHandle.Set();
+ upgraded.SetResult(true);
}))
{
using (Stream stream = await SendOpaqueRequestAsync("GET", address))
{
- Assert.True(waitHandle.WaitOne(TimeSpan.FromSeconds(1)), "Timed out");
- Assert.True(upgraded.HasValue, "Upgraded not set");
- Assert.True(upgraded.Value, "Upgrade failed");
+ Assert.True(await upgraded.Task.TimeoutAfter(TimeSpan.FromSeconds(1)));
}
}
}
@@ -131,10 +127,8 @@ namespace Microsoft.AspNetCore.Server.HttpSys
[OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, WindowsVersions.Win2008R2)]
public async Task OpaqueUpgrade_GetUpgrade_NotAffectedByMaxRequestBodyLimit()
{
- ManualResetEvent waitHandle = new ManualResetEvent(false);
- bool? upgraded = null;
- string address;
- using (Utilities.CreateHttpServer(out address, async httpContext =>
+ var upgraded = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (Utilities.CreateHttpServer(out var address, async httpContext =>
{
var feature = httpContext.Features.Get();
Assert.NotNull(feature);
@@ -150,16 +144,13 @@ namespace Microsoft.AspNetCore.Server.HttpSys
Assert.Null(feature.MaxRequestBodySize);
Assert.Throws(() => feature.MaxRequestBodySize = 12);
Assert.Equal(15, await stream.ReadAsync(new byte[15], 0, 15));
- upgraded = true;
- waitHandle.Set();
+ upgraded.SetResult(true);
}, options => options.MaxRequestBodySize = 10))
{
using (Stream stream = await SendOpaqueRequestAsync("GET", address))
{
stream.Write(new byte[15], 0, 15);
- Assert.True(waitHandle.WaitOne(TimeSpan.FromSeconds(10)), "Timed out");
- Assert.True(upgraded.HasValue, "Upgraded not set");
- Assert.True(upgraded.Value, "Upgrade failed");
+ Assert.True(await upgraded.Task.TimeoutAfter(TimeSpan.FromSeconds(10)));
}
}
}
@@ -169,10 +160,8 @@ namespace Microsoft.AspNetCore.Server.HttpSys
public async Task OpaqueUpgrade_WithOnStarting_CallbackCalled()
{
var callbackCalled = false;
- var waitHandle = new ManualResetEvent(false);
- bool? upgraded = null;
- string address;
- using (Utilities.CreateHttpServer(out address, async httpContext =>
+ var upgraded = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (Utilities.CreateHttpServer(out var address, async httpContext =>
{
httpContext.Response.OnStarting(_ =>
{
@@ -184,15 +173,12 @@ namespace Microsoft.AspNetCore.Server.HttpSys
Assert.NotNull(opaqueFeature);
Assert.True(opaqueFeature.IsUpgradableRequest);
await opaqueFeature.UpgradeAsync();
- upgraded = true;
- waitHandle.Set();
+ upgraded.SetResult(true);
}))
{
using (Stream stream = await SendOpaqueRequestAsync("GET", address))
{
- Assert.True(waitHandle.WaitOne(TimeSpan.FromSeconds(1)), "Timed out");
- Assert.True(upgraded.HasValue, "Upgraded not set");
- Assert.True(upgraded.Value, "Upgrade failed");
+ Assert.True(await upgraded.Task.TimeoutAfter(TimeSpan.FromSeconds(1)));
Assert.True(callbackCalled, "Callback not called");
}
}
@@ -364,4 +350,4 @@ namespace Microsoft.AspNetCore.Server.HttpSys
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Servers/HttpSys/test/FunctionalTests/ResponseBodyTests.cs b/src/Servers/HttpSys/test/FunctionalTests/ResponseBodyTests.cs
index a42071b342..0a07b456cb 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/ResponseBodyTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/ResponseBodyTests.cs
@@ -10,6 +10,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
using Xunit;
@@ -157,10 +158,8 @@ namespace Microsoft.AspNetCore.Server.HttpSys
[ConditionalFact]
public async Task ResponseBody_WriteContentLengthExtraWritten_Throws()
{
- var waitHandle = new ManualResetEvent(false);
- bool? appThrew = null;
- string address;
- using (Utilities.CreateHttpServer(out address, httpContext =>
+ var requestThrew = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (Utilities.CreateHttpServer(out var address, httpContext =>
{
try
{
@@ -168,13 +167,12 @@ namespace Microsoft.AspNetCore.Server.HttpSys
httpContext.Response.Headers["Content-lenGth"] = " 10 ";
httpContext.Response.Body.Write(new byte[10], 0, 10);
httpContext.Response.Body.Write(new byte[9], 0, 9);
- appThrew = false;
+ requestThrew.SetResult(false);
}
catch (Exception)
{
- appThrew = true;
+ requestThrew.SetResult(true);
}
- waitHandle.Set();
return Task.FromResult(0);
}))
{
@@ -188,9 +186,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
Assert.Null(response.Headers.TransferEncodingChunked);
Assert.Equal(new byte[10], await response.Content.ReadAsByteArrayAsync());
- Assert.True(waitHandle.WaitOne(100));
- Assert.True(appThrew.HasValue, "appThrew.HasValue");
- Assert.True(appThrew.Value, "appThrew.Value");
+ Assert.True(await requestThrew.Task.TimeoutAfter(TimeSpan.FromSeconds(10)));
}
}
diff --git a/src/Servers/HttpSys/test/FunctionalTests/ResponseSendFileTests.cs b/src/Servers/HttpSys/test/FunctionalTests/ResponseSendFileTests.cs
index 69f0a64ec9..6023fd42db 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/ResponseSendFileTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/ResponseSendFileTests.cs
@@ -12,6 +12,7 @@ using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
using Xunit;
@@ -74,34 +75,26 @@ namespace Microsoft.AspNetCore.Server.HttpSys
[ConditionalFact]
public async Task ResponseSendFile_MissingFile_Throws()
{
- var waitHandle = new ManualResetEvent(false);
- bool? appThrew = null;
- string address;
- using (Utilities.CreateHttpServer(out address, httpContext =>
+ var appThrew = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (Utilities.CreateHttpServer(out var address, httpContext =>
{
var sendFile = httpContext.Features.Get();
try
{
sendFile.SendFileAsync(string.Empty, 0, null, CancellationToken.None).Wait();
- appThrew = false;
+ appThrew.SetResult(false);
}
catch (Exception)
{
- appThrew = true;
+ appThrew.SetResult(true);
throw;
}
- finally
- {
- waitHandle.Set();
- }
return Task.FromResult(0);
}))
{
HttpResponseMessage response = await SendRequestAsync(address);
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
- Assert.True(waitHandle.WaitOne(100));
- Assert.True(appThrew.HasValue, "appThrew.HasValue");
- Assert.True(appThrew.Value, "appThrew.Value");
+ Assert.True(await appThrew.Task.TimeoutAfter(TimeSpan.FromSeconds(10)));
}
}
diff --git a/src/Servers/HttpSys/test/FunctionalTests/ResponseTests.cs b/src/Servers/HttpSys/test/FunctionalTests/ResponseTests.cs
index f2d244edce..455ac93377 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/ResponseTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/ResponseTests.cs
@@ -8,6 +8,7 @@ using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.Testing.xunit;
using Xunit;
@@ -123,21 +124,21 @@ namespace Microsoft.AspNetCore.Server.HttpSys
[ConditionalFact]
public async Task Response_Empty_CallsOnStartingAndOnCompleted()
{
- var onStartingCalled = new ManualResetEvent(false);
- var onCompletedCalled = new ManualResetEvent(false);
- string address;
- using (Utilities.CreateHttpServer(out address, httpContext =>
+ var onStartingCalled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var onCompletedCalled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+
+ using (Utilities.CreateHttpServer(out var address, httpContext =>
{
httpContext.Response.OnStarting(state =>
{
Assert.Same(state, httpContext);
- onStartingCalled.Set();
+ onStartingCalled.SetResult(0);
return Task.FromResult(0);
}, httpContext);
httpContext.Response.OnCompleted(state =>
{
Assert.Same(state, httpContext);
- onCompletedCalled.Set();
+ onCompletedCalled.SetResult(0);
return Task.FromResult(0);
}, httpContext);
return Task.FromResult(0);
@@ -145,29 +146,28 @@ namespace Microsoft.AspNetCore.Server.HttpSys
{
var response = await SendRequestAsync(address);
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.True(onStartingCalled.WaitOne(0));
+ await onStartingCalled.Task.TimeoutAfter(TimeSpan.FromSeconds(1));
// Fires after the response completes
- Assert.True(onCompletedCalled.WaitOne(TimeSpan.FromSeconds(5)));
+ await onCompletedCalled.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
}
}
[ConditionalFact]
public async Task Response_OnStartingThrows_StillCallsOnCompleted()
{
- var onStartingCalled = new ManualResetEvent(false);
- var onCompletedCalled = new ManualResetEvent(false);
- string address;
- using (Utilities.CreateHttpServer(out address, httpContext =>
+ var onStartingCalled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var onCompletedCalled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (Utilities.CreateHttpServer(out var address, httpContext =>
{
httpContext.Response.OnStarting(state =>
{
- onStartingCalled.Set();
+ onStartingCalled.SetResult(0);
throw new Exception("Failed OnStarting");
}, httpContext);
httpContext.Response.OnCompleted(state =>
{
Assert.Same(state, httpContext);
- onCompletedCalled.Set();
+ onCompletedCalled.SetResult(0);
return Task.FromResult(0);
}, httpContext);
return Task.FromResult(0);
@@ -175,29 +175,28 @@ namespace Microsoft.AspNetCore.Server.HttpSys
{
var response = await SendRequestAsync(address);
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
- Assert.True(onStartingCalled.WaitOne(0));
+ await onStartingCalled.Task.TimeoutAfter(TimeSpan.FromSeconds(1));
// Fires after the response completes
- Assert.True(onCompletedCalled.WaitOne(TimeSpan.FromSeconds(5)));
+ await onCompletedCalled.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
}
}
[ConditionalFact]
public async Task Response_OnStartingThrowsAfterWrite_WriteThrowsAndStillCallsOnCompleted()
{
- var onStartingCalled = new ManualResetEvent(false);
- var onCompletedCalled = new ManualResetEvent(false);
- string address;
- using (Utilities.CreateHttpServer(out address, httpContext =>
+ var onStartingCalled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var onCompletedCalled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (Utilities.CreateHttpServer(out var address, httpContext =>
{
httpContext.Response.OnStarting(state =>
{
- onStartingCalled.Set();
+ onStartingCalled.SetResult(0);
throw new InvalidTimeZoneException("Failed OnStarting");
}, httpContext);
httpContext.Response.OnCompleted(state =>
{
Assert.Same(state, httpContext);
- onCompletedCalled.Set();
+ onCompletedCalled.SetResult(0);
return Task.FromResult(0);
}, httpContext);
Assert.Throws(() => httpContext.Response.Body.Write(new byte[10], 0, 10));
@@ -206,9 +205,9 @@ namespace Microsoft.AspNetCore.Server.HttpSys
{
var response = await SendRequestAsync(address);
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.True(onStartingCalled.WaitOne(0));
+ await onStartingCalled.Task.TimeoutAfter(TimeSpan.FromSeconds(1));
// Fires after the response completes
- Assert.True(onCompletedCalled.WaitOne(TimeSpan.FromSeconds(5)));
+ await onCompletedCalled.Task.TimeoutAfter(TimeSpan.FromSeconds(5));
}
}
diff --git a/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs b/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs
index 32e328a63d..b1eceb56d7 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs
@@ -69,17 +69,16 @@ namespace Microsoft.AspNetCore.Server.HttpSys
public async Task Server_ShutdownDuringRequest_Success()
{
Task responseTask;
- ManualResetEvent received = new ManualResetEvent(false);
- string address;
- using (var server = Utilities.CreateHttpServer(out address, httpContext =>
+ var received = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (var server = Utilities.CreateHttpServer(out var address, httpContext =>
{
- received.Set();
+ received.SetResult(0);
httpContext.Response.ContentLength = 11;
return httpContext.Response.WriteAsync("Hello World");
}))
{
responseTask = SendRequestAsync(address);
- Assert.True(received.WaitOne(10000));
+ await received.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
await server.StopAsync(new CancellationTokenSource(TimeSpan.FromSeconds(5)).Token);
}
string response = await responseTask;
@@ -90,21 +89,20 @@ namespace Microsoft.AspNetCore.Server.HttpSys
public async Task Server_DisposeWithoutStopDuringRequest_Aborts()
{
Task responseTask;
- var received = new ManualResetEvent(false);
- var stopped = new ManualResetEvent(false);
- string address;
- using (var server = Utilities.CreateHttpServer(out address, httpContext =>
+ var received = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var stopped = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (var server = Utilities.CreateHttpServer(out var address, async httpContext =>
{
- received.Set();
- Assert.True(stopped.WaitOne(TimeSpan.FromSeconds(10)));
+ received.SetResult(0);
+ await stopped.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
httpContext.Response.ContentLength = 11;
- return httpContext.Response.WriteAsync("Hello World");
+ await httpContext.Response.WriteAsync("Hello World");
}))
{
responseTask = SendRequestAsync(address);
- Assert.True(received.WaitOne(TimeSpan.FromSeconds(10)));
+ await received.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
}
- stopped.Set();
+ stopped.SetResult(0);
await Assert.ThrowsAsync(async () => await responseTask);
}
@@ -112,24 +110,21 @@ namespace Microsoft.AspNetCore.Server.HttpSys
public async Task Server_ShutdownDuringLongRunningRequest_TimesOut()
{
Task responseTask;
- var received = new ManualResetEvent(false);
- bool? shutdown = null;
- var waitForShutdown = new ManualResetEvent(false);
- string address;
- using (var server = Utilities.CreateHttpServer(out address, httpContext =>
+ var received = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var shutdown = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (var server = Utilities.CreateHttpServer(out var address, async httpContext =>
{
- received.Set();
- shutdown = waitForShutdown.WaitOne(TimeSpan.FromSeconds(15));
+ received.SetResult(0);
+ await shutdown.Task.TimeoutAfter(TimeSpan.FromSeconds(15));
httpContext.Response.ContentLength = 11;
- return httpContext.Response.WriteAsync("Hello World");
+ await httpContext.Response.WriteAsync("Hello World");
}))
{
responseTask = SendRequestAsync(address);
- Assert.True(received.WaitOne(TimeSpan.FromSeconds(10)));
- Assert.False(shutdown.HasValue);
+ await received.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
await server.StopAsync(new CancellationTokenSource(TimeSpan.FromSeconds(5)).Token);
}
- waitForShutdown.Set();
+ shutdown.SetResult(0);
await Assert.ThrowsAsync(async () => await responseTask);
}
@@ -217,64 +212,59 @@ namespace Microsoft.AspNetCore.Server.HttpSys
[ConditionalFact]
public async Task Server_ClientDisconnects_CallCanceled()
{
- TimeSpan interval = TimeSpan.FromSeconds(10);
- ManualResetEvent received = new ManualResetEvent(false);
- ManualResetEvent aborted = new ManualResetEvent(false);
- ManualResetEvent canceled = new ManualResetEvent(false);
+ var interval = TimeSpan.FromSeconds(10);
+ var received = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var aborted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var canceled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
- string address;
- using (Utilities.CreateHttpServer(out address, httpContext =>
+ using (Utilities.CreateHttpServer(out var address, async httpContext =>
{
- CancellationToken ct = httpContext.RequestAborted;
+ var ct = httpContext.RequestAborted;
Assert.True(ct.CanBeCanceled, "CanBeCanceled");
Assert.False(ct.IsCancellationRequested, "IsCancellationRequested");
- ct.Register(() => canceled.Set());
- received.Set();
- Assert.True(aborted.WaitOne(interval), "Aborted");
+ ct.Register(() => canceled.SetResult(0));
+ received.SetResult(0);
+ await aborted.Task.TimeoutAfter(interval);
Assert.True(ct.WaitHandle.WaitOne(interval), "CT Wait");
Assert.True(ct.IsCancellationRequested, "IsCancellationRequested");
- return Task.FromResult(0);
}))
{
// Note: System.Net.Sockets does not RST the connection by default, it just FINs.
// Http.Sys's disconnect notice requires a RST.
using (var client = await SendHungRequestAsync("GET", address))
{
- Assert.True(received.WaitOne(interval), "Receive Timeout");
+ await received.Task.TimeoutAfter(interval);
// Force a RST
client.LingerState = new LingerOption(true, 0);
}
- aborted.Set();
- Assert.True(canceled.WaitOne(interval), "canceled");
+ aborted.SetResult(0);
+ await canceled.Task.TimeoutAfter(interval);
}
}
[ConditionalFact]
public async Task Server_Abort_CallCanceled()
{
- TimeSpan interval = TimeSpan.FromSeconds(100);
- ManualResetEvent received = new ManualResetEvent(false);
- ManualResetEvent aborted = new ManualResetEvent(false);
- ManualResetEvent canceled = new ManualResetEvent(false);
+ var interval = TimeSpan.FromSeconds(10);
+ var received = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var canceled = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
- string address;
- using (Utilities.CreateHttpServer(out address, httpContext =>
+ using (Utilities.CreateHttpServer(out var address, async httpContext =>
{
CancellationToken ct = httpContext.RequestAborted;
Assert.True(ct.CanBeCanceled, "CanBeCanceled");
Assert.False(ct.IsCancellationRequested, "IsCancellationRequested");
- ct.Register(() => canceled.Set());
- received.Set();
+ ct.Register(() => canceled.SetResult(0));
+ received.SetResult(0);
httpContext.Abort();
- Assert.True(canceled.WaitOne(interval), "Aborted");
+ await canceled.Task.TimeoutAfter(interval);
Assert.True(ct.IsCancellationRequested, "IsCancellationRequested");
- return Task.FromResult(0);
}))
{
using (var client = await SendHungRequestAsync("GET", address))
{
- Assert.True(received.WaitOne(interval), "Receive Timeout");
+ await received.Task.TimeoutAfter(interval);
Assert.Throws(() => client.GetStream().Read(new byte[10], 0, 10));
}
}
@@ -423,19 +413,18 @@ namespace Microsoft.AspNetCore.Server.HttpSys
public async Task Server_MultipleStopAsyncCallsWaitForRequestsToDrain_Success()
{
Task responseTask;
- ManualResetEvent received = new ManualResetEvent(false);
- ManualResetEvent run = new ManualResetEvent(false);
- string address;
- using (var server = Utilities.CreateHttpServer(out address, httpContext =>
+ var received = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var run = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (var server = Utilities.CreateHttpServer(out var address, async httpContext =>
{
- received.Set();
- Assert.True(run.WaitOne(TimeSpan.FromSeconds(10)));
+ received.SetResult(0);
+ await run.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
httpContext.Response.ContentLength = 11;
- return httpContext.Response.WriteAsync("Hello World");
+ await httpContext.Response.WriteAsync("Hello World");
}))
{
responseTask = SendRequestAsync(address);
- Assert.True(received.WaitOne(TimeSpan.FromSeconds(10)));
+ await received.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
var stopTask1 = server.StopAsync(cts.Token);
@@ -446,11 +435,11 @@ namespace Microsoft.AspNetCore.Server.HttpSys
Assert.False(stopTask2.IsCompleted);
Assert.False(stopTask3.IsCompleted);
- run.Set();
+ run.SetResult(0);
await Task.WhenAll(stopTask1, stopTask2, stopTask3).TimeoutAfter(TimeSpan.FromSeconds(10));
}
- string response = await responseTask;
+ var response = await responseTask;
Assert.Equal("Hello World", response);
}
@@ -458,19 +447,18 @@ namespace Microsoft.AspNetCore.Server.HttpSys
public async Task Server_MultipleStopAsyncCallsCompleteOnCancellation_SameToken_Success()
{
Task responseTask;
- ManualResetEvent received = new ManualResetEvent(false);
- ManualResetEvent run = new ManualResetEvent(false);
- string address;
- using (var server = Utilities.CreateHttpServer(out address, httpContext =>
+ var received = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var run = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (var server = Utilities.CreateHttpServer(out var address, async httpContext =>
{
- received.Set();
- Assert.True(run.WaitOne(TimeSpan.FromSeconds(10)));
+ received.SetResult(0);
+ await run.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
httpContext.Response.ContentLength = 11;
- return httpContext.Response.WriteAsync("Hello World");
+ await httpContext.Response.WriteAsync("Hello World");
}))
{
responseTask = SendRequestAsync(address);
- Assert.True(received.WaitOne(TimeSpan.FromSeconds(10)));
+ await received.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
var cts = new CancellationTokenSource();
var stopTask1 = server.StopAsync(cts.Token);
@@ -485,7 +473,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
await Task.WhenAll(stopTask1, stopTask2, stopTask3).TimeoutAfter(TimeSpan.FromSeconds(10));
- run.Set();
+ run.SetResult(0);
string response = await responseTask;
Assert.Equal("Hello World", response);
@@ -496,19 +484,18 @@ namespace Microsoft.AspNetCore.Server.HttpSys
public async Task Server_MultipleStopAsyncCallsCompleteOnSingleCancellation_FirstToken_Success()
{
Task responseTask;
- ManualResetEvent received = new ManualResetEvent(false);
- ManualResetEvent run = new ManualResetEvent(false);
- string address;
- using (var server = Utilities.CreateHttpServer(out address, httpContext =>
+ var received = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var run = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (var server = Utilities.CreateHttpServer(out var address, async httpContext =>
{
- received.Set();
- Assert.True(run.WaitOne(TimeSpan.FromSeconds(10)));
+ received.SetResult(0);
+ await run.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
httpContext.Response.ContentLength = 11;
- return httpContext.Response.WriteAsync("Hello World");
+ await httpContext.Response.WriteAsync("Hello World");
}))
{
responseTask = SendRequestAsync(address);
- Assert.True(received.WaitOne(TimeSpan.FromSeconds(10)));
+ await received.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
var cts = new CancellationTokenSource();
var stopTask1 = server.StopAsync(cts.Token);
@@ -523,7 +510,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
await Task.WhenAll(stopTask1, stopTask2, stopTask3).TimeoutAfter(TimeSpan.FromSeconds(10));
- run.Set();
+ run.SetResult(0);
string response = await responseTask;
Assert.Equal("Hello World", response);
@@ -534,19 +521,18 @@ namespace Microsoft.AspNetCore.Server.HttpSys
public async Task Server_MultipleStopAsyncCallsCompleteOnSingleCancellation_SubsequentToken_Success()
{
Task responseTask;
- ManualResetEvent received = new ManualResetEvent(false);
- ManualResetEvent run = new ManualResetEvent(false);
- string address;
- using (var server = Utilities.CreateHttpServer(out address, httpContext =>
+ var received = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var run = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (var server = Utilities.CreateHttpServer(out var address, async httpContext =>
{
- received.Set();
- Assert.True(run.WaitOne(TimeSpan.FromSeconds(10)));
+ received.SetResult(0);
+ await run.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
httpContext.Response.ContentLength = 11;
- return httpContext.Response.WriteAsync("Hello World");
+ await httpContext.Response.WriteAsync("Hello World");
}))
{
responseTask = SendRequestAsync(address);
- Assert.True(received.WaitOne(10000));
+ await received.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
var cts = new CancellationTokenSource();
var stopTask1 = server.StopAsync(new CancellationTokenSource().Token);
@@ -561,7 +547,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
await Task.WhenAll(stopTask1, stopTask2, stopTask3).TimeoutAfter(TimeSpan.FromSeconds(10));
- run.Set();
+ run.SetResult(0);
string response = await responseTask;
Assert.Equal("Hello World", response);
@@ -572,21 +558,20 @@ namespace Microsoft.AspNetCore.Server.HttpSys
public async Task Server_DisposeContinuesPendingStopAsyncCalls()
{
Task responseTask;
- ManualResetEvent received = new ManualResetEvent(false);
- ManualResetEvent run = new ManualResetEvent(false);
- string address;
+ var received = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var run = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
Task stopTask1;
Task stopTask2;
- using (var server = Utilities.CreateHttpServer(out address, httpContext =>
+ using (var server = Utilities.CreateHttpServer(out var address, async httpContext =>
{
- received.Set();
- Assert.True(run.WaitOne(TimeSpan.FromSeconds(10)));
+ received.SetResult(0);
+ await run.Task.TimeoutAfter(TimeSpan.FromSeconds(15));
httpContext.Response.ContentLength = 11;
- return httpContext.Response.WriteAsync("Hello World");
+ await httpContext.Response.WriteAsync("Hello World");
}))
{
responseTask = SendRequestAsync(address);
- Assert.True(received.WaitOne(TimeSpan.FromSeconds(10)));
+ await received.Task.TimeoutAfter(TimeSpan.FromSeconds(10));
stopTask1 = server.StopAsync(new CancellationTokenSource().Token);
stopTask2 = server.StopAsync(new CancellationTokenSource().Token);
@@ -596,6 +581,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
}
await Task.WhenAll(stopTask1, stopTask2).TimeoutAfter(TimeSpan.FromSeconds(10));
+ run.SetResult(0);
}
[ConditionalFact]
diff --git a/src/Servers/HttpSys/test/FunctionalTests/Utilities.cs b/src/Servers/HttpSys/test/FunctionalTests/Utilities.cs
index eeaf0faa95..bd38eafd81 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/Utilities.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/Utilities.cs
@@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
@@ -160,37 +161,8 @@ namespace Microsoft.AspNetCore.Server.HttpSys
return server;
}
- internal static Task WithTimeout(this Task task) => task.WithTimeout(DefaultTimeout);
+ internal static Task WithTimeout(this Task task) => task.TimeoutAfter(DefaultTimeout);
- internal static async Task WithTimeout(this Task task, TimeSpan timeout)
- {
- var completedTask = await Task.WhenAny(task, Task.Delay(timeout));
-
- if (completedTask == task)
- {
- await task;
- return;
- }
- else
- {
- throw new TimeoutException("The task has timed out.");
- }
- }
-
- internal static Task WithTimeout(this Task task) => task.WithTimeout(DefaultTimeout);
-
- internal static async Task WithTimeout(this Task task, TimeSpan timeout)
- {
- var completedTask = await Task.WhenAny(task, Task.Delay(timeout));
-
- if (completedTask == task)
- {
- return await task;
- }
- else
- {
- throw new TimeoutException("The task has timed out.");
- }
- }
+ internal static Task WithTimeout(this Task task) => task.TimeoutAfter(DefaultTimeout);
}
}
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj
deleted file mode 100644
index cca8115bad..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj
+++ /dev/null
@@ -1,279 +0,0 @@
-
-
-
-
-
- Debug
- Win32
-
-
- Debug
- x64
-
-
- Release
- Win32
-
-
- Release
- x64
-
-
-
- {439824F9-1455-4CC4-BD79-B44FA0A16552}
- Win32Proj
- AspNetCoreModule
- AspNetCore
- aspnetcore
- false
- 10.0.17134.0
-
-
-
- DynamicLibrary
- true
- v141
- Unicode
-
-
- DynamicLibrary
- true
- v141
- Unicode
-
-
- DynamicLibrary
- false
- v141
- true
- Unicode
-
-
- DynamicLibrary
- false
- v141
- true
- Unicode
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\
-
-
-
- NotUsing
- Level4
- Disabled
- WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)
- precomp.hxx
- $(IntDir)$(TargetName).pch
- ..\IISLib;inc\
- ProgramDatabase
- MultiThreadedDebug
- true
- true
- true
- false
- SyncCThrow
- 8Bytes
- true
- false
- true
- CompileAsCpp
- true
- true
-
-
- Windows
- true
- kernel32.lib;user32.lib;advapi32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ahadmin.lib;rpcrt4.lib;winhttp.lib;pdh.lib;ws2_32.lib;wbemuuid.lib;iphlpapi.lib;%(AdditionalDependencies)
- Source.def
-
-
- ..\Commonlib
-
-
-
-
- NotUsing
- Level4
- Disabled
- WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)
- precomp.hxx
- $(IntDir)$(TargetName).pch
- ..\IISLib;inc\
- ProgramDatabase
- MultiThreadedDebug
- true
- true
- true
- false
- SyncCThrow
- 8Bytes
- true
- false
- true
- CompileAsCpp
- true
- true
-
-
- Windows
- true
- kernel32.lib;user32.lib;advapi32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ahadmin.lib;rpcrt4.lib;winhttp.lib;pdh.lib;ws2_32.lib;wbemuuid.lib;iphlpapi.lib;%(AdditionalDependencies)
- Source.def
-
-
- ..\Commonlib
-
-
-
-
- Level4
- NotUsing
- MaxSpeed
- true
- true
- WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)
- ..\IISLib;inc\
- precomp.hxx
- MultiThreaded
- true
- true
- true
- false
- SyncCThrow
- 8Bytes
- true
- false
- true
- CompileAsCpp
- true
- true
-
-
- Windows
- false
- true
- true
- Source.def
- kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;winhttp.lib;odbc32.lib;ws2_32.lib;odbccp32.lib;wbemuuid.lib;iphlpapi.lib;pdh.lib;rpcrt4.lib;%(AdditionalDependencies)
-
-
- ..\Commonlib
-
-
-
-
- Level4
- NotUsing
- MaxSpeed
- true
- true
- WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)
- precomp.hxx
- ..\IISLib;inc\
- MultiThreaded
- true
- true
- true
- false
- SyncCThrow
- 8Bytes
- true
- false
- true
- CompileAsCpp
- true
- true
-
-
- Windows
- false
- true
- true
- Source.def
- kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;rpcrt4.lib;winhttp.lib;pdh.lib;ws2_32.lib;wbemuuid.lib;iphlpapi.lib;%(AdditionalDependencies)
-
-
- ..\Commonlib
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {4787a64f-9a3e-4867-a55a-70cb4b2b2ffe}
-
-
-
-
-
-
-
-
- Document
- mc %(FullPath)
- Compiling Event Messages ...
- %(Filename).rc;%(Filename).h;MSG0409.bin
-
-
-
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/application.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/application.h
deleted file mode 100644
index e0ef14ec9c..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/application.h
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-//
-// The key used for hash-table lookups, consists of the port on which the http process is created.
-//
-class APPLICATION_KEY
-{
-public:
-
- APPLICATION_KEY(
- VOID
- ) : INLINE_STRU_INIT(m_struKey)
- {
- }
-
- HRESULT
- Initialize(
- _In_ LPCWSTR pszKey
- )
- {
- return m_struKey.Copy(pszKey);
- }
-
- BOOL
- GetIsEqual(
- const APPLICATION_KEY * key2
- ) const
- {
- return m_struKey.Equals(key2->m_struKey);
- }
-
- DWORD CalcKeyHash() const
- {
- return Hash(m_struKey.QueryStr());
- }
-
-private:
-
- INLINE_STRU(m_struKey, 1024);
-};
-
-class APP_OFFLINE_HTM
-{
-public:
- APP_OFFLINE_HTM(LPCWSTR pszPath) : m_cRefs(1)
- {
- m_Path.Copy( pszPath );
- }
-
- VOID
- ReferenceAppOfflineHtm() const
- {
- InterlockedIncrement(&m_cRefs);
- }
-
- VOID
- DereferenceAppOfflineHtm() const
- {
- if (InterlockedDecrement(&m_cRefs) == 0)
- {
- delete this;
- }
- }
-
- BOOL
- Load(
- VOID
- )
- {
- BOOL fResult = TRUE;
- LARGE_INTEGER li = {0};
- CHAR *pszBuff = NULL;
- HANDLE handle = INVALID_HANDLE_VALUE;
-
- handle = CreateFile( m_Path.QueryStr(),
- GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL );
-
- if( handle == INVALID_HANDLE_VALUE )
- {
- if ( GetLastError() == ERROR_FILE_NOT_FOUND )
- {
- fResult = FALSE;
- }
-
- // This Load() member function is supposed be called only when the change notification event of file creation or file modification happens.
- // If file is currenlty locked exclusively by other processes, we might get INVALID_HANDLE_VALUE even though the file exists. In that case, we should return TRUE here.
- goto Finished;
- }
-
- if(!GetFileSizeEx( handle, &li ))
- {
- goto Finished;
- }
-
- if( li.HighPart != 0 )
- {
- // > 4gb file size not supported
- // todo: log a warning at event log
- goto Finished;
- }
-
- DWORD bytesRead = 0;
-
- if(li.LowPart > 0)
- {
- pszBuff = new CHAR[ li.LowPart + 1 ];
-
- if( ReadFile( handle, pszBuff, li.LowPart, &bytesRead, NULL ) )
- {
- m_Contents.Copy( pszBuff, bytesRead );
- }
- }
-
-Finished:
- if( handle != INVALID_HANDLE_VALUE )
- {
- CloseHandle(handle);
- handle = INVALID_HANDLE_VALUE;
- }
-
- if( pszBuff != NULL )
- {
- delete[] pszBuff;
- pszBuff = NULL;
- }
-
- return fResult;
- }
-
- mutable LONG m_cRefs;
- STRA m_Contents;
- STRU m_Path;
-};
-
-class APPLICATION_MANAGER;
-
-class APPLICATION
-{
-public:
-
- APPLICATION() : m_pProcessManager(NULL), m_pApplicationManager(NULL), m_cRefs(1),
- m_fAppOfflineFound(FALSE), m_pAppOfflineHtm(NULL), m_pFileWatcherEntry(NULL)
- {
- }
-
- APPLICATION_KEY *
- QueryApplicationKey()
- {
- return &m_applicationKey;
- }
-
- VOID
- SetAppOfflineFound(
- BOOL found
- )
- {
- m_fAppOfflineFound = found;
- }
-
- BOOL
- AppOfflineFound()
- {
- return m_fAppOfflineFound;
- }
-
- HRESULT
- GetProcess(
- _In_ IHttpContext *context,
- _In_ ASPNETCORE_CONFIG *pConfig,
- _Out_ SERVER_PROCESS **ppServerProcess
- )
- {
- return m_pProcessManager->GetProcess( context, pConfig, ppServerProcess );
- }
-
- HRESULT
- Recycle()
- {
- HRESULT hr = S_OK;
- m_pProcessManager->ShutdownAllProcesses();
- return hr;
- }
-
- VOID
- ReferenceApplication() const
- {
- InterlockedIncrement(&m_cRefs);
- }
-
- VOID
- DereferenceApplication() const
- {
- if (InterlockedDecrement(&m_cRefs) == 0)
- {
- delete this;
- }
- }
-
- APP_OFFLINE_HTM* QueryAppOfflineHtm()
- {
- return m_pAppOfflineHtm;
- }
-
- ~APPLICATION();
-
- HRESULT
- Initialize(
- _In_ APPLICATION_MANAGER *pApplicationManager,
- _In_ LPCWSTR pszApplication,
- _In_ LPCWSTR pszPhysicalPath
- );
-
- VOID
- UpdateAppOfflineFileHandle();
-
- HRESULT
- StartMonitoringAppOffline();
-
-private:
-
- STRU m_strAppPhysicalPath;
- mutable LONG m_cRefs;
- APPLICATION_KEY m_applicationKey;
- PROCESS_MANAGER* m_pProcessManager;
- APPLICATION_MANAGER *m_pApplicationManager;
- BOOL m_fAppOfflineFound;
- APP_OFFLINE_HTM *m_pAppOfflineHtm;
- FILE_WATCHER_ENTRY *m_pFileWatcherEntry;
-};
-
-class APPLICATION_HASH :
- public HASH_TABLE
-{
-
-public:
-
- APPLICATION_HASH()
- {}
-
- APPLICATION_KEY *
- ExtractKey(
- APPLICATION *pApplication
- )
- {
- return pApplication->QueryApplicationKey();
- }
-
- DWORD
- CalcKeyHash(
- APPLICATION_KEY *key
- )
- {
- return key->CalcKeyHash();
- }
-
- BOOL
- EqualKeys(
- APPLICATION_KEY *key1,
- APPLICATION_KEY *key2
- )
- {
- return key1->GetIsEqual(key2);
- }
-
- VOID
- ReferenceRecord(
- APPLICATION *pApplication
- )
- {
- pApplication->ReferenceApplication();
- }
-
- VOID
- DereferenceRecord(
- APPLICATION *pApplication
- )
- {
- pApplication->DereferenceApplication();
- }
-
-private:
-
- APPLICATION_HASH(const APPLICATION_HASH &);
- void operator=(const APPLICATION_HASH &);
-};
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h
deleted file mode 100644
index d9e626262d..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-#define DEFAULT_HASH_BUCKETS 293
-
-class APPLICATION_MANAGER
-{
-public:
-
- static
- APPLICATION_MANAGER*
- GetInstance(
- VOID
- )
- {
- if( sm_pApplicationManager == NULL )
- {
- sm_pApplicationManager = new APPLICATION_MANAGER();
- }
-
- return sm_pApplicationManager;
- }
-
- static
- VOID
- Cleanup(
- VOID
- )
- {
- if(sm_pApplicationManager != NULL)
- {
- delete sm_pApplicationManager;
- sm_pApplicationManager = NULL;
- }
- }
-
- HRESULT
- GetApplication(
- _In_ IHttpContext* pContext,
- _Out_ APPLICATION ** ppApplication
- );
-
- HRESULT
- RecycleApplication(
- _In_ LPCWSTR pszApplication
- );
-
- HRESULT
- Get502ErrorPage(
- _Out_ HTTP_DATA_CHUNK** ppErrorPage
- );
-
- ~APPLICATION_MANAGER()
- {
- if(m_pApplicationHash != NULL)
- {
- m_pApplicationHash->Clear();
- delete m_pApplicationHash;
- m_pApplicationHash = NULL;
- }
-
- if( m_pFileWatcher!= NULL )
- {
- delete m_pFileWatcher;
- m_pFileWatcher = NULL;
- }
-
- if(m_pHttp502ErrorPage != NULL)
- {
- delete m_pHttp502ErrorPage;
- m_pHttp502ErrorPage = NULL;
- }
-
- }
-
- FILE_WATCHER*
- GetFileWatcher()
- {
- return m_pFileWatcher;
- }
-
- HRESULT Initialize()
- {
- HRESULT hr = S_OK;
-
- if(m_pApplicationHash == NULL)
- {
- m_pApplicationHash = new APPLICATION_HASH();
- if(m_pApplicationHash == NULL)
- {
- hr = E_OUTOFMEMORY;
- goto Finished;
- }
-
- hr = m_pApplicationHash->Initialize(DEFAULT_HASH_BUCKETS);
- if(FAILED(hr))
- {
- goto Finished;
- }
- }
-
- if( m_pFileWatcher == NULL )
- {
- m_pFileWatcher = new FILE_WATCHER;
- if(m_pFileWatcher == NULL)
- {
- hr = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
- goto Finished;
- }
-
- m_pFileWatcher->Create();
- }
-
- Finished:
- return hr;
- }
-
-private:
- //
- // we currently limit the size of m_pstrErrorInfo to 5000, be careful if you want to change its payload
- //
- APPLICATION_MANAGER() : m_pApplicationHash(NULL), m_pFileWatcher(NULL), m_pHttp502ErrorPage(NULL), m_pstrErrorInfo(
- " \
- \
- \
- \
- IIS 502.5 Error \
- \
-
HTTP Error 502.5 - Process Failure \
-
\
-
Common causes of this issue: \
- The application process failed to start \
- The application process started but then stopped \
- The application process started but failed to listen on the configured port \
-
\
-
\
-
Troubleshooting steps: \
- Check the system event log for error messages \
- Enable logging the application process' stdout messages \
- Attach a debugger to the application process and inspect \
-
\
- \
-
\
-
")
- {
- InitializeSRWLock(&m_srwLock);
- }
-
- FILE_WATCHER *m_pFileWatcher;
- APPLICATION_HASH *m_pApplicationHash;
- static APPLICATION_MANAGER *sm_pApplicationManager;
- SRWLOCK m_srwLock;
- HTTP_DATA_CHUNK *m_pHttp502ErrorPage;
- LPSTR m_pstrErrorInfo;
-};
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h
deleted file mode 100644
index 95b4303cee..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-#define CS_ROOTWEB_CONFIG L"MACHINE/WEBROOT/APPHOST/"
-#define CS_ROOTWEB_CONFIG_LEN _countof(CS_ROOTWEB_CONFIG)-1
-#define CS_ASPNETCORE_SECTION L"system.webServer/aspNetCore"
-#define CS_WINDOWS_AUTHENTICATION_SECTION L"system.webServer/security/authentication/windowsAuthentication"
-#define CS_BASIC_AUTHENTICATION_SECTION L"system.webServer/security/authentication/basicAuthentication"
-#define CS_ANONYMOUS_AUTHENTICATION_SECTION L"system.webServer/security/authentication/anonymousAuthentication"
-#define CS_AUTHENTICATION_ENABLED L"enabled"
-#define CS_ASPNETCORE_PROCESS_EXE_PATH L"processPath"
-#define CS_ASPNETCORE_PROCESS_ARGUMENTS L"arguments"
-#define CS_ASPNETCORE_PROCESS_STARTUP_TIME_LIMIT L"startupTimeLimit"
-#define CS_ASPNETCORE_PROCESS_SHUTDOWN_TIME_LIMIT L"shutdownTimeLimit"
-#define CS_ASPNETCORE_WINHTTP_REQUEST_TIMEOUT L"requestTimeout"
-#define CS_ASPNETCORE_RAPID_FAILS_PER_MINUTE L"rapidFailsPerMinute"
-#define CS_ASPNETCORE_STDOUT_LOG_ENABLED L"stdoutLogEnabled"
-#define CS_ASPNETCORE_STDOUT_LOG_FILE L"stdoutLogFile"
-#define CS_ASPNETCORE_ENVIRONMENT_VARIABLES L"environmentVariables"
-#define CS_ASPNETCORE_ENVIRONMENT_VARIABLE L"environmentVariable"
-#define CS_ASPNETCORE_ENVIRONMENT_VARIABLE_NAME L"name"
-#define CS_ASPNETCORE_ENVIRONMENT_VARIABLE_VALUE L"value"
-#define CS_ASPNETCORE_PROCESSES_PER_APPLICATION L"processesPerApplication"
-#define CS_ASPNETCORE_FORWARD_WINDOWS_AUTH_TOKEN L"forwardWindowsAuthToken"
-#define CS_ASPNETCORE_DISABLE_START_UP_ERROR_PAGE L"disableStartUpErrorPage"
-#define CS_ASPNETCORE_RECYCLE_ON_FILE_CHANGE L"recycleOnFileChange"
-#define CS_ASPNETCORE_RECYCLE_ON_FILE_CHANGE_FILE L"file"
-#define CS_ASPNETCORE_RECYCLE_ON_FILE_CHANGE_FILE_PATH L"path"
-
-#define MAX_RAPID_FAILS_PER_MINUTE 100
-#define MILLISECONDS_IN_ONE_SECOND 1000
-#define MIN_PORT 1025
-#define MAX_PORT 48000
-
-#define HEX_TO_ASCII(c) ((CHAR)(((c) < 10) ? ((c) + '0') : ((c) + 'a' - 10)))
-
-extern HTTP_MODULE_ID g_pModuleId;
-extern IHttpServer * g_pHttpServer;
-
-class ASPNETCORE_CONFIG : IHttpStoredContext
-{
-public:
-
- virtual
- ~ASPNETCORE_CONFIG();
-
- VOID
- CleanupStoredContext()
- {
- delete this;
- }
-
- static
- HRESULT
- GetConfig(
- _In_ IHttpContext *pHttpContext,
- _Out_ ASPNETCORE_CONFIG **ppAspNetCoreConfig
- );
-
- ENVIRONMENT_VAR_HASH*
- QueryEnvironmentVariables(
- VOID
- )
- {
- return m_pEnvironmentVariables;
- }
-
- DWORD
- QueryRapidFailsPerMinute(
- VOID
- )
- {
- return m_dwRapidFailsPerMinute;
- }
-
- DWORD
- QueryStartupTimeLimitInMS(
- VOID
- )
- {
- return m_dwStartupTimeLimitInMS;
- }
-
- DWORD
- QueryShutdownTimeLimitInMS(
- VOID
- )
- {
- return m_dwShutdownTimeLimitInMS;
- }
-
- DWORD
- QueryProcessesPerApplication(
- VOID
- )
- {
- return m_dwProcessesPerApplication;
- }
-
- DWORD
- QueryRequestTimeoutInMS(
- VOID
- )
- {
- return m_dwRequestTimeoutInMS;
- }
-
- STRU*
- QueryArguments(
- VOID
- )
- {
- return &m_struArguments;
- }
-
- STRU*
- QueryApplicationPath(
- VOID
- )
- {
- return &m_struApplication;
- }
-
- STRU*
- QueryProcessPath(
- VOID
- )
- {
- return &m_struProcessPath;
- }
-
- BOOL
- QueryStdoutLogEnabled()
- {
- return m_fStdoutLogEnabled;
- }
-
- BOOL
- QueryForwardWindowsAuthToken()
- {
- return m_fForwardWindowsAuthToken;
- }
-
- BOOL
- QueryWindowsAuthEnabled()
- {
- return m_fWindowsAuthEnabled;
- }
-
- BOOL
- QueryBasicAuthEnabled()
- {
- return m_fBasicAuthEnabled;
- }
-
- BOOL
- QueryAnonymousAuthEnabled()
- {
- return m_fAnonymousAuthEnabled;
- }
-
- BOOL
- QueryDisableStartUpErrorPage()
- {
- return m_fDisableStartUpErrorPage;
- }
-
- STRU*
- QueryStdoutLogFile()
- {
- return &m_struStdoutLogFile;
- }
-
-private:
-
- //
- // private constructor
- //
- ASPNETCORE_CONFIG():
- m_fStdoutLogEnabled( FALSE ),
- m_pEnvironmentVariables( NULL )
- {
- }
-
- HRESULT
- Populate(
- IHttpContext *pHttpContext
- );
-
- DWORD m_dwRequestTimeoutInMS;
- DWORD m_dwStartupTimeLimitInMS;
- DWORD m_dwShutdownTimeLimitInMS;
- DWORD m_dwRapidFailsPerMinute;
- DWORD m_dwProcessesPerApplication;
- STRU m_struApplication;
- STRU m_struArguments;
- STRU m_struProcessPath;
- STRU m_struStdoutLogFile;
- BOOL m_fStdoutLogEnabled;
- BOOL m_fForwardWindowsAuthToken;
- BOOL m_fDisableStartUpErrorPage;
- BOOL m_fWindowsAuthEnabled;
- BOOL m_fBasicAuthEnabled;
- BOOL m_fAnonymousAuthEnabled;
- ENVIRONMENT_VAR_HASH* m_pEnvironmentVariables;
-};
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h
deleted file mode 100644
index 7378462efb..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-#define ASPNETCORE_DEBUG_FLAG_INFO 0x00000001
-#define ASPNETCORE_DEBUG_FLAG_WARNING 0x00000002
-#define ASPNETCORE_DEBUG_FLAG_ERROR 0x00000004
-
-extern DWORD g_dwAspNetCoreDebugFlags;
-
-static
-BOOL
-IfDebug(
- DWORD dwFlag
- )
-{
- return ( dwFlag & g_dwAspNetCoreDebugFlags );
-}
-
-static
-VOID
-DebugPrint(
- DWORD dwFlag,
- LPCSTR szString
- )
-{
- STACK_STRA (strOutput, 256);
- HRESULT hr = S_OK;
-
- if ( IfDebug( dwFlag ) )
- {
- hr = strOutput.SafeSnprintf(
- "[aspnetcore.dll] %s\r\n",
- szString );
-
- if (FAILED (hr))
- {
- goto Finished;
- }
-
- OutputDebugStringA( strOutput.QueryStr() );
- }
-
-Finished:
-
- return;
-}
-
-static
-VOID
-DebugPrintf(
-DWORD dwFlag,
-LPCSTR szFormat,
-...
-)
-{
- STACK_STRA (strCooked,256);
-
- va_list args;
- HRESULT hr = S_OK;
-
- if ( IfDebug( dwFlag ) )
- {
- va_start( args, szFormat );
-
- hr = strCooked.SafeVsnprintf(szFormat, args );
-
- va_end( args );
-
- if (FAILED (hr))
- {
- goto Finished;
- }
-
- DebugPrint( dwFlag, strCooked.QueryStr() );
- }
-
-Finished:
- return;
-}
-
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h
deleted file mode 100644
index 062090ac17..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-//
-// The key used for hash-table lookups, consists of the port on which the http process is created.
-//
-
-class ENVIRONMENT_VAR_ENTRY
-{
-public:
- ENVIRONMENT_VAR_ENTRY():
- _cRefs(1)
- {
- }
-
- HRESULT
- Initialize(
- PCWSTR pszName,
- PCWSTR pszValue
- )
- {
- HRESULT hr = S_OK;
- if (FAILED(hr = _strName.Copy(pszName)) ||
- FAILED(hr = _strValue.Copy(pszValue)))
- {
- }
- return hr;
- }
-
- VOID
- Reference() const
- {
- InterlockedIncrement(&_cRefs);
- }
-
- VOID
- Dereference() const
- {
- if (InterlockedDecrement(&_cRefs) == 0)
- {
- delete this;
- }
- }
-
- PWSTR const
- QueryName()
- {
- return _strName.QueryStr();
- }
-
- PWSTR const
- QueryValue()
- {
- return _strValue.QueryStr();
- }
-
-private:
- ~ENVIRONMENT_VAR_ENTRY()
- {
- }
-
- STRU _strName;
- STRU _strValue;
- mutable LONG _cRefs;
-};
-
-class ENVIRONMENT_VAR_HASH : public HASH_TABLE
-{
-public:
- ENVIRONMENT_VAR_HASH()
- {}
-
- PWSTR
- ExtractKey(
- ENVIRONMENT_VAR_ENTRY * pEntry
- )
- {
- return pEntry->QueryName();
- }
-
- DWORD
- CalcKeyHash(
- PWSTR pszName
- )
- {
- return HashStringNoCase(pszName);
- }
-
- BOOL
- EqualKeys(
- PWSTR pszName1,
- PWSTR pszName2
- )
- {
- return (_wcsicmp(pszName1, pszName2) == 0);
- }
-
- VOID
- ReferenceRecord(
- ENVIRONMENT_VAR_ENTRY * pEntry
- )
- {
- pEntry->Reference();
- }
-
- VOID
- DereferenceRecord(
- ENVIRONMENT_VAR_ENTRY * pEntry
- )
- {
- pEntry->Dereference();
- }
-
- static
- VOID
- CopyToMultiSz(
- ENVIRONMENT_VAR_ENTRY * pEntry,
- PVOID pvData
- )
- {
- STRU strTemp;
- MULTISZ *pMultiSz = static_cast(pvData);
- DBG_ASSERT(pMultiSz);
- DBG_ASSERT(pEntry);
- strTemp.Copy(pEntry->QueryName());
- strTemp.Append(pEntry->QueryValue());
- pMultiSz->Append(strTemp.QueryStr());
- }
-
- static
- VOID
- CopyToTable(
- ENVIRONMENT_VAR_ENTRY * pEntry,
- PVOID pvData
- )
- {
- // best effort copy, ignore the failure
- ENVIRONMENT_VAR_ENTRY * pNewEntry = new ENVIRONMENT_VAR_ENTRY();
- if (pNewEntry != NULL)
- {
- pNewEntry->Initialize(pEntry->QueryName(), pEntry->QueryValue());
- ENVIRONMENT_VAR_HASH *pHash = static_cast(pvData);
- DBG_ASSERT(pHash);
- pHash->InsertRecord(pNewEntry);
- // Need to dereference as InsertRecord references it now
- pNewEntry->Dereference();
- }
- }
-
-private:
- ENVIRONMENT_VAR_HASH(const ENVIRONMENT_VAR_HASH &);
- void operator=(const ENVIRONMENT_VAR_HASH &);
-};
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h
deleted file mode 100644
index 16d3942a2f..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-#define FILE_WATCHER_SHUTDOWN_KEY (ULONG_PTR)(-1)
-#define FILE_WATCHER_ENTRY_BUFFER_SIZE 4096
-#ifndef CONTAINING_RECORD
-//
-// Calculate the address of the base of the structure given its type, and an
-// address of a field within the structure.
-//
-
-#define CONTAINING_RECORD(address, type, field) \
- ((type *)((PCHAR)(address)-(ULONG_PTR)(&((type *)0)->field)))
-
-#endif // !CONTAINING_RECORD
-#define FILE_NOTIFY_VALID_MASK 0x00000fff
-#define FILE_WATCHER_ENTRY_SIGNATURE ((DWORD) 'FWES')
-#define FILE_WATCHER_ENTRY_SIGNATURE_FREE ((DWORD) 'sewf')
-
-class APPLICATION;
-
-class FILE_WATCHER{
-public:
-
- FILE_WATCHER();
-
- ~FILE_WATCHER();
-
- HRESULT Create();
-
- HANDLE
- QueryCompletionPort(
- VOID
- ) const
- {
- return m_hCompletionPort;
- }
-
- static
- DWORD
- WINAPI ChangeNotificationThread(LPVOID);
-
- static
- void
- WINAPI FileWatcherCompletionRoutine
- (
- DWORD dwCompletionStatus,
- DWORD cbCompletion,
- OVERLAPPED * pOverlapped
- );
-
-private:
- HANDLE m_hCompletionPort;
- HANDLE m_hChangeNotificationThread;
-};
-
-class FILE_WATCHER_ENTRY
-{
-public:
- FILE_WATCHER_ENTRY(FILE_WATCHER * pFileMonitor);
-
- OVERLAPPED _overlapped;
-
- HRESULT
- Create(
- _In_ PCWSTR pszDirectoryToMonitor,
- _In_ PCWSTR pszFileNameToMonitor,
- _In_ APPLICATION* pApplication,
- _In_ HANDLE hImpersonationToken
- );
-
- VOID
- ReferenceFileWatcherEntry() const
- {
- InterlockedIncrement(&_cRefs);
- }
-
- VOID
- DereferenceFileWatcherEntry() const
- {
- if (InterlockedDecrement(&_cRefs) == 0)
- {
- delete this;
- }
- }
-
- BOOL
- QueryIsValid() const
- {
- return _fIsValid;
- }
-
- VOID
- MarkEntryInValid()
- {
- _fIsValid = FALSE;
- }
-
- HRESULT Monitor();
-
- VOID StopMonitor();
-
- HRESULT
- HandleChangeCompletion(
- _In_ DWORD dwCompletionStatus,
- _In_ DWORD cbCompletion
- );
-
-private:
- virtual ~FILE_WATCHER_ENTRY();
-
- DWORD _dwSignature;
- BUFFER _buffDirectoryChanges;
- HANDLE _hImpersonationToken;
- HANDLE _hDirectory;
- FILE_WATCHER* _pFileMonitor;
- APPLICATION* _pApplication;
- STRU _strFileName;
- STRU _strDirectoryName;
- LONG _lStopMonitorCalled;
- mutable LONG _cRefs;
- BOOL _fIsValid;
- SRWLOCK _srwLock;
-};
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h
deleted file mode 100644
index a3f5dfdabe..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-//
-// The key used for hash-table lookups, consists of the port on which the http process is created.
-//
-class FORWARDER_CONNECTION_KEY
-{
-public:
-
- FORWARDER_CONNECTION_KEY(
- VOID
- )
- {
- }
-
- HRESULT
- Initialize(
- _In_ DWORD dwPort
- )
- {
- m_dwPort = dwPort;
- return S_OK;
- }
-
- BOOL
- GetIsEqual(
- const FORWARDER_CONNECTION_KEY * key2
- ) const
- {
- return m_dwPort == key2->m_dwPort;
- }
-
- DWORD CalcKeyHash() const
- {
- // TODO: Review hash distribution.
- return Hash(m_dwPort);
- }
-
-private:
-
- DWORD m_dwPort;
-};
-
-class FORWARDER_CONNECTION
-{
-public:
-
- FORWARDER_CONNECTION(
- VOID
- );
-
- HRESULT
- Initialize(
- DWORD dwPort
- );
-
- HINTERNET
- QueryHandle() const
- {
- return m_hConnection;
- }
-
- VOID
- ReferenceForwarderConnection() const
- {
- InterlockedIncrement(&m_cRefs);
- }
-
- VOID
- DereferenceForwarderConnection() const
- {
- if (InterlockedDecrement(&m_cRefs) == 0)
- {
- delete this;
- }
- }
-
- FORWARDER_CONNECTION_KEY *
- QueryConnectionKey()
- {
- return &m_ConnectionKey;
- }
-
-private:
-
- ~FORWARDER_CONNECTION()
- {
- if (m_hConnection != NULL)
- {
- WinHttpCloseHandle(m_hConnection);
- m_hConnection = NULL;
- }
- }
-
- mutable LONG m_cRefs;
- FORWARDER_CONNECTION_KEY m_ConnectionKey;
- HINTERNET m_hConnection;
-};
-
-class FORWARDER_CONNECTION_HASH :
- public HASH_TABLE
-{
-
-public:
-
- FORWARDER_CONNECTION_HASH()
- {}
-
- FORWARDER_CONNECTION_KEY *
- ExtractKey(
- FORWARDER_CONNECTION *pConnection
- )
- {
- return pConnection->QueryConnectionKey();
- }
-
- DWORD
- CalcKeyHash(
- FORWARDER_CONNECTION_KEY *key
- )
- {
- return key->CalcKeyHash();
- }
-
- BOOL
- EqualKeys(
- FORWARDER_CONNECTION_KEY *key1,
- FORWARDER_CONNECTION_KEY *key2
- )
- {
- return key1->GetIsEqual(key2);
- }
-
- VOID
- ReferenceRecord(
- FORWARDER_CONNECTION *pConnection
- )
- {
- pConnection->ReferenceForwarderConnection();
- }
-
- VOID
- DereferenceRecord(
- FORWARDER_CONNECTION *pConnection
- )
- {
- pConnection->DereferenceForwarderConnection();
- }
-
-private:
-
- FORWARDER_CONNECTION_HASH(const FORWARDER_CONNECTION_HASH &);
- void operator=(const FORWARDER_CONNECTION_HASH &);
-};
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h
deleted file mode 100644
index dcd8531dac..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h
+++ /dev/null
@@ -1,468 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-#include "forwarderconnection.h"
-#include "protocolconfig.h"
-#include "serverprocess.h"
-#include "application.h"
-#include "tracelog.h"
-#include "websockethandler.h"
-
-#define ASPNETCORE_DEBUG_STRU_BUFFER_SIZE 100
-#define ASPNETCORE_DEBUG_STRU_ARRAY_SIZE 100
-
-enum FORWARDING_REQUEST_STATUS
-{
- FORWARDER_START,
- FORWARDER_SENDING_REQUEST,
- FORWARDER_RECEIVING_RESPONSE,
- FORWARDER_RECEIVED_WEBSOCKET_RESPONSE,
- FORWARDER_RESET_CONNECTION,
- FORWARDER_DONE
-};
-
-extern HTTP_MODULE_ID g_pModuleId;
-extern IHttpServer * g_pHttpServer;
-extern BOOL g_fAsyncDisconnectAvailable;
-extern PCWSTR g_pszModuleName;
-extern HMODULE g_hModule;
-extern HMODULE g_hWinHttpModule;
-extern DWORD g_dwTlsIndex;
-extern DWORD g_OptionalWinHttpFlags;
-
-#ifdef DEBUG
-extern STRA g_strLogs[ASPNETCORE_DEBUG_STRU_ARRAY_SIZE];
-extern DWORD g_dwLogCounter;
-#endif // DEBUG
-
-enum MULTI_PART_POSITION
-{
- MULTI_PART_IN_BOUNDARY,
- MULTI_PART_IN_HEADER,
- MULTI_PART_IN_CHUNK,
- MULTI_PART_IN_CHUNK_END
-};
-
-class ASYNC_DISCONNECT_CONTEXT;
-
-#define FORWARDING_HANDLER_SIGNATURE ((DWORD)'FHLR')
-#define FORWARDING_HANDLER_SIGNATURE_FREE ((DWORD)'fhlr')
-
-class FORWARDING_HANDLER
-{
-public:
-
- FORWARDING_HANDLER(
- __in IHttpContext * pW3Context
- );
-
- static void * operator new(size_t size);
-
- static void operator delete(void * pMemory);
-
- VOID
- ReferenceForwardingHandler(
- VOID
- ) const;
-
- VOID
- DereferenceForwardingHandler(
- VOID
- ) const;
-
- REQUEST_NOTIFICATION_STATUS
- OnExecuteRequestHandler();
-
- REQUEST_NOTIFICATION_STATUS
- OnAsyncCompletion(
- DWORD cbCompletion,
- HRESULT hrCompletionStatus
- );
-
- IHttpTraceContext *
- QueryTraceContext()
- {
- return m_pW3Context->GetTraceContext();
- }
-
- IHttpContext *
- QueryHttpContext(
- VOID
- )
- {
- return m_pW3Context;
- }
-
- static
- VOID
- CALLBACK
- OnWinHttpCompletion(
- HINTERNET hRequest,
- DWORD_PTR dwContext,
- DWORD dwInternetStatus,
- LPVOID lpvStatusInformation,
- DWORD dwStatusInformationLength
- )
- {
-
- FORWARDING_HANDLER * pThis = static_cast(reinterpret_cast(dwContext));
- if (pThis == NULL)
- {
- //error happened, nothing can be done here
- return;
- }
- DBG_ASSERT(pThis->m_Signature == FORWARDING_HANDLER_SIGNATURE);
- pThis->OnWinHttpCompletionInternal(hRequest,
- dwInternetStatus,
- lpvStatusInformation,
- dwStatusInformationLength);
- }
-
- static
- HRESULT
- StaticInitialize(
- BOOL fEnableReferenceCountTracing
- );
-
- static
- VOID
- StaticTerminate();
-
- static
- PCWSTR
- QueryErrorFormat()
- {
- return sm_strErrorFormat.QueryStr();
- }
-
- static
- HANDLE
- QueryEventLog()
- {
- return sm_hEventLog;
- }
-
- VOID
- TerminateRequest(
- BOOL fClientInitiated
- );
-
- static HINTERNET sm_hSession;
-
- HRESULT
- SetStatusAndHeaders(
- PCSTR pszHeaders,
- DWORD cchHeaders
- );
-
- HRESULT
- OnSharedRequestEntity(
- ULONGLONG ulOffset,
- LPCBYTE pvBuffer,
- DWORD cbBuffer
- );
-
- VOID
- SetStatus(
- FORWARDING_REQUEST_STATUS status
- )
- {
- m_RequestStatus = status;
- }
-
- virtual
- ~FORWARDING_HANDLER(
- VOID
- );
-
-private:
-
- //
- // Begin OnMapRequestHandler phases.
- //
-
- HRESULT
- CreateWinHttpRequest(
- __in const IHttpRequest * pRequest,
- __in const PROTOCOL_CONFIG * pProtocol,
- __in HINTERNET hConnect,
- __inout STRU * pstrUrl,
- ASPNETCORE_CONFIG* pAspNetCoreConfig,
- SERVER_PROCESS* pServerProcess
- );
-
- //
- // End OnMapRequestHandler phases.
- //
-
- VOID
- RemoveRequest();
-
- HRESULT
- GetHeaders(
- const PROTOCOL_CONFIG * pProtocol,
- PCWSTR * ppszHeaders,
- DWORD * pcchHeaders,
- ASPNETCORE_CONFIG* pAspNetCoreConfig,
- SERVER_PROCESS* pServerProcess
- );
-
- HRESULT
- DoReverseRewrite(
- __in IHttpResponse *pResponse
- );
-
- BYTE *
- GetNewResponseBuffer(
- DWORD dwBufferSize
- );
-
- VOID
- FreeResponseBuffers();
-
- VOID
- OnWinHttpCompletionInternal(
- HINTERNET hRequest,
- DWORD dwInternetStatus,
- LPVOID lpvStatusInformation,
- DWORD dwStatusInformationLength
- );
-
- HRESULT
- OnWinHttpCompletionSendRequestOrWriteComplete(
- HINTERNET hRequest,
- DWORD dwInternetStatus,
- __out BOOL * pfClientError,
- __out BOOL * pfAnotherCompletionExpected
- );
-
- HRESULT
- OnWinHttpCompletionStatusHeadersAvailable(
- HINTERNET hRequest,
- __out BOOL * pfAnotherCompletionExpected
- );
-
- HRESULT
- OnWinHttpCompletionStatusDataAvailable(
- HINTERNET hRequest,
- DWORD dwBytes,
- __out BOOL * pfAnotherCompletionExpected
- );
-
- HRESULT
- OnWinHttpCompletionStatusReadComplete(
- __in IHttpResponse * pResponse,
- DWORD dwStatusInformationLength,
- __out BOOL * pfAnotherCompletionExpected
- );
-
- HRESULT
- OnSendingRequest(
- DWORD cbCompletion,
- HRESULT hrCompletionStatus,
- __out BOOL * pfClientError
- );
-
- HRESULT
- OnReceivingResponse();
-
- HRESULT
- OnWebSocketWinHttpSendComplete(
- HINTERNET hRequest,
- LPVOID pvStatus,
- DWORD hrCompletion,
- DWORD cbCompletion,
- BOOL * pfAnotherCompletionExpected
- );
-
- HRESULT
- OnWebSocketWinHttpReceiveComplete(
- HINTERNET hRequest,
- LPVOID pvStatus,
- DWORD hrCompletion,
- DWORD cbCompletion,
- BOOL * pfAnotherCompletionExpected
- );
-
- HRESULT
- OnWebSocketIisSendComplete(
- DWORD hrCompletion,
- DWORD cbCompletion
- );
-
- HRESULT
- OnWebSocketIisReceiveComplete(
- DWORD hrCompletion,
- DWORD cbCompletion
- );
-
- HRESULT
- DoIisWebSocketReceive(
- VOID
- );
-
- VOID
- TerminateWebsocket(
- VOID
- );
-
- DWORD m_Signature;
- mutable LONG m_cRefs;
-
- IHttpContext * m_pW3Context;
-
- //
- // WinHTTP request handle is protected using a read-write lock.
- //
- SRWLOCK m_RequestLock;
- HINTERNET m_hRequest;
-
- APP_OFFLINE_HTM *m_pAppOfflineHtm;
- APPLICATION *m_pApplication;
-
- BOOL m_fResponseHeadersReceivedAndSet;
- volatile BOOL m_fClientDisconnected;
- //
- // A safety guard flag indicating no more IIS PostCompletion is allowed
- //
- volatile BOOL m_fFinishRequest;
- //
- // A safety guard flag to prevent from unexpect callback which may signal IIS pipeline
- // more than once with non-pending status
- //
- volatile BOOL m_fDoneAsyncCompletion;
- volatile BOOL m_fHasError;
- //
- // WinHttp may hit AV under race if handle got closed more than once simultaneously
- // Use two bool variables to guard
- //
- volatile BOOL m_fHttpHandleInClose;
- volatile BOOL m_fWebSocketHandleInClose;
- //
- // Record the number of winhttp handles in use
- // release IIS pipeline only after all handles got closed
- //
- volatile LONG m_dwHandlers;
-
- BOOL m_fDoReverseRewriteHeaders;
- BOOL m_fServerResetConn;
- DWORD m_msStartTime;
- DWORD m_BytesToReceive;
- DWORD m_BytesToSend;
-
- BYTE * m_pEntityBuffer;
- DWORD m_cchLastSend;
-
- static const SIZE_T INLINE_ENTITY_BUFFERS = 8;
- DWORD m_cEntityBuffers;
- BUFFER_T m_buffEntityBuffers;
-
- DWORD m_cBytesBuffered;
- DWORD m_cMinBufferLimit;
-
- PCSTR m_pszOriginalHostHeader;
-
- volatile FORWARDING_REQUEST_STATUS m_RequestStatus;
-
- ASYNC_DISCONNECT_CONTEXT * m_pDisconnect;
-
- PCWSTR m_pszHeaders;
- DWORD m_cchHeaders;
-
- BOOL m_fWebSocketEnabled;
-
- STRU m_strFullUri;
-
- ULONGLONG m_cContentLength;
-
- WEBSOCKET_HANDLER * m_pWebSocket;
-
- static PROTOCOL_CONFIG sm_ProtocolConfig;
-
- static STRU sm_strErrorFormat;
-
- static HANDLE sm_hEventLog;
-
- static ALLOC_CACHE_HANDLER * sm_pAlloc;
-
- //
- // Reference cout tracing for debugging purposes.
- //
- static TRACE_LOG * sm_pTraceLog;
-};
-
-class ASYNC_DISCONNECT_CONTEXT : public IHttpConnectionStoredContext
-{
- public:
- ASYNC_DISCONNECT_CONTEXT()
- {
- m_pHandler = NULL;
- }
-
- VOID
- CleanupStoredContext()
- {
- DBG_ASSERT(m_pHandler == NULL);
- delete this;
- }
-
- VOID
- NotifyDisconnect()
- {
- FORWARDING_HANDLER *pInitialValue = (FORWARDING_HANDLER*)
- InterlockedExchangePointer((PVOID*) &m_pHandler, NULL);
-
- if (pInitialValue != NULL)
- {
- pInitialValue->TerminateRequest(TRUE);
- pInitialValue->DereferenceForwardingHandler();
- }
- }
-
- VOID
- SetHandler(
- FORWARDING_HANDLER *pHandler
- )
- {
- //
- // Take a reference on the forwarding handler.
- // This reference will be released on either of two conditions:
- //
- // 1. When the request processing ends, in which case a ResetHandler()
- // is called.
- //
- // 2. When a disconnect notification arrives.
- //
- // We need to make sure that only one of them ends up dereferencing
- // the object.
- //
-
- DBG_ASSERT (pHandler != NULL);
- DBG_ASSERT (m_pHandler == NULL);
-
- pHandler->ReferenceForwardingHandler();
- InterlockedExchangePointer((PVOID*)&m_pHandler, pHandler);
- }
-
- VOID
- ResetHandler(
- VOID
- )
- {
- FORWARDING_HANDLER *pInitialValue = (FORWARDING_HANDLER*)
- InterlockedExchangePointer( (PVOID*)&m_pHandler, NULL);
-
- if (pInitialValue != NULL)
- {
- pInitialValue->DereferenceForwardingHandler();
- }
- }
-
- private:
- ~ASYNC_DISCONNECT_CONTEXT()
- {}
-
- FORWARDING_HANDLER * m_pHandler;
-};
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/path.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/path.h
deleted file mode 100644
index 05545acfd5..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/path.h
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-class PATH
-{
-public:
-
- static
- HRESULT
- SplitUrl(
- PCWSTR pszDestinationUrl,
- BOOL *pfSecure,
- STRU *pstrDestination,
- STRU *pstrUrl
- );
-
- static
- HRESULT
- UnEscapeUrl(
- PCWSTR pszUrl,
- DWORD cchUrl,
- bool fCopyQuery,
- STRA * pstrResult
- );
-
- static
- HRESULT
- UnEscapeUrl(
- PCWSTR pszUrl,
- DWORD cchUrl,
- STRU * pstrResult
- );
-
- static HRESULT
- EscapeAbsPath(
- IHttpRequest * pRequest,
- STRU * strEscapedUrl
- );
-
- static
- bool
- IsValidAttributeNameChar(
- WCHAR ch
- );
-
- static
- bool
- IsValidQueryStringName(
- PCWSTR pszName
- );
-
- static
- bool
- IsValidHeaderName(
- PCWSTR pszName
- );
-
- static
- bool
- FindInMultiString(
- PCWSTR pszMultiString,
- PCWSTR pszStringToFind
- );
-
- static
- HRESULT
- IsPathUnc(
- __in LPCWSTR pszPath,
- __out BOOL * pfIsUnc
- );
-
- static
- HRESULT
- ConvertPathToFullPath(
- _In_ LPCWSTR pszPath,
- _In_ LPCWSTR pszRootPath,
- _Out_ STRU* pStrFullPath
- );
-
-private:
-
- PATH() {}
- ~PATH() {}
-
- static
- CHAR
- ToHexDigit(
- UINT nDigit
- )
- {
- return static_cast(nDigit > 9 ? nDigit - 10 + 'A' : nDigit + '0');
- }
-};
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h
deleted file mode 100644
index b91e8e6bfb..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-#define ONE_MINUTE_IN_MILLISECONDS 60000
-
-class PROCESS_MANAGER
-{
-public:
-
- virtual
- ~PROCESS_MANAGER();
-
- VOID
- ReferenceProcessManager() const
- {
- InterlockedIncrement(&m_cRefs);
- }
-
- VOID
- DereferenceProcessManager() const
- {
- if (InterlockedDecrement(&m_cRefs) == 0)
- {
- delete this;
- }
- }
-
- HRESULT
- GetProcess(
- _In_ IHttpContext *context,
- _In_ ASPNETCORE_CONFIG *pConfig,
- _Out_ SERVER_PROCESS **ppServerProcess
- );
-
- HANDLE
- QueryNULHandle()
- {
- return m_hNULHandle;
- }
-
- HRESULT
- Initialize(
- VOID
- );
-
- VOID
- SendShutdownSignal()
- {
- AcquireSRWLockExclusive( &m_srwLock );
-
- for(DWORD i = 0; i < m_dwProcessesPerApplication; ++i )
- {
- if( m_ppServerProcessList != NULL &&
- m_ppServerProcessList[i] != NULL )
- {
- m_ppServerProcessList[i]->SendSignal();
- m_ppServerProcessList[i]->DereferenceServerProcess();
- m_ppServerProcessList[i] = NULL;
- }
- }
-
- ReleaseSRWLockExclusive( &m_srwLock );
- }
-
- VOID
- ShutdownProcess(
- SERVER_PROCESS* pServerProcess
- )
- {
- AcquireSRWLockExclusive( &m_srwLock );
-
- ShutdownProcessNoLock( pServerProcess );
-
- ReleaseSRWLockExclusive( &m_srwLock );
- }
-
- VOID
- ShutdownAllProcesses(
- )
- {
- AcquireSRWLockExclusive( &m_srwLock );
-
- ShutdownAllProcessesNoLock();
-
- ReleaseSRWLockExclusive( &m_srwLock );
- }
-
- VOID
- IncrementRapidFailCount(
- VOID
- )
- {
- InterlockedIncrement(&m_cRapidFailCount);
- }
-
- PROCESS_MANAGER() :
- m_ppServerProcessList( NULL ),
- m_hNULHandle( NULL ),
- m_cRapidFailCount( 0 ),
- m_dwProcessesPerApplication( 1 ),
- m_dwRouteToProcessIndex( 0 ),
- m_fServerProcessListReady(FALSE),
- m_cRefs( 1 )
- {
- InitializeSRWLock( &m_srwLock );
- }
-
-private:
-
- BOOL
- RapidFailsPerMinuteExceeded(
- LONG dwRapidFailsPerMinute
- )
- {
- DWORD dwCurrentTickCount = GetTickCount();
-
- if( (dwCurrentTickCount - m_dwRapidFailTickStart)
- >= ONE_MINUTE_IN_MILLISECONDS )
- {
- //
- // reset counters every minute.
- //
-
- InterlockedExchange(&m_cRapidFailCount, 0);
- m_dwRapidFailTickStart = dwCurrentTickCount;
- }
-
- return m_cRapidFailCount > dwRapidFailsPerMinute;
- }
-
- VOID
- ShutdownProcessNoLock(
- SERVER_PROCESS* pServerProcess
- )
- {
- for(DWORD i = 0; i < m_dwProcessesPerApplication; ++i )
- {
- if( m_ppServerProcessList != NULL &&
- m_ppServerProcessList[i] != NULL &&
- m_ppServerProcessList[i]->GetPort() == pServerProcess->GetPort() )
- {
- // shutdown pServerProcess if not already shutdown.
- m_ppServerProcessList[i]->StopProcess();
- m_ppServerProcessList[i]->DereferenceServerProcess();
- m_ppServerProcessList[i] = NULL;
- }
- }
- }
-
- VOID
- ShutdownAllProcessesNoLock(
- VOID
- )
- {
- for(DWORD i = 0; i < m_dwProcessesPerApplication; ++i )
- {
- if( m_ppServerProcessList != NULL &&
- m_ppServerProcessList[i] != NULL )
- {
- // shutdown pServerProcess if not already shutdown.
- m_ppServerProcessList[i]->SendSignal();
- m_ppServerProcessList[i]->DereferenceServerProcess();
- m_ppServerProcessList[i] = NULL;
- }
- }
- }
-
- volatile LONG m_cRapidFailCount;
- DWORD m_dwRapidFailTickStart;
- DWORD m_dwProcessesPerApplication;
- volatile DWORD m_dwRouteToProcessIndex;
-
- SRWLOCK m_srwLock;
- SERVER_PROCESS **m_ppServerProcessList;
-
- //
- // m_hNULHandle is used to redirect stdout/stderr to NUL.
- // If Createprocess is called to launch a batch file for example,
- // it tries to write to the console buffer by default. It fails to
- // start if the console buffer is owned by the parent process i.e
- // in our case w3wp.exe. So we have to redirect the stdout/stderr
- // of the child process to NUL or to a file (anything other than
- // the console buffer of the parent process).
- //
-
- HANDLE m_hNULHandle;
- mutable LONG m_cRefs;
-
- volatile static BOOL sm_fWSAStartupDone;
- volatile BOOL m_fServerProcessListReady;
-};
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h
deleted file mode 100644
index d9d730c544..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-#include "aspnetcoreconfig.h"
-
-class PROTOCOL_CONFIG
-{
- public:
-
- PROTOCOL_CONFIG()
- {
- }
-
- HRESULT
- Initialize();
-
- VOID
- OverrideConfig(
- ASPNETCORE_CONFIG *pAspNetCoreConfig
- );
-
- BOOL
- QueryDoKeepAlive() const
- {
- return m_fKeepAlive;
- }
-
- DWORD
- QueryTimeout() const
- {
- return m_msTimeout;
- }
-
- BOOL
- QueryPreserveHostHeader() const
- {
- return m_fPreserveHostHeader;
- }
-
- BOOL
- QueryReverseRewriteHeaders() const
- {
- return m_fReverseRewriteHeaders;
- }
-
- const STRA *
- QueryXForwardedForName() const
- {
- return &m_strXForwardedForName;
- }
-
- BOOL
- QueryIncludePortInXForwardedFor() const
- {
- return m_fIncludePortInXForwardedFor;
- }
-
- DWORD
- QueryMinResponseBuffer() const
- {
- return m_dwMinResponseBuffer;
- }
-
- DWORD
- QueryResponseBufferLimit() const
- {
- return m_dwResponseBufferLimit;
- }
-
- DWORD
- QueryMaxResponseHeaderSize() const
- {
- return m_dwMaxResponseHeaderSize;
- }
-
- const STRA*
- QuerySslHeaderName() const
- {
- return &m_strSslHeaderName;
- }
-
- const STRA *
- QueryClientCertName() const
- {
- return &m_strClientCertName;
- }
-
- private:
-
- BOOL m_fKeepAlive;
- BOOL m_fPreserveHostHeader;
- BOOL m_fReverseRewriteHeaders;
- BOOL m_fIncludePortInXForwardedFor;
-
- DWORD m_msTimeout;
- DWORD m_dwMinResponseBuffer;
- DWORD m_dwResponseBufferLimit;
- DWORD m_dwMaxResponseHeaderSize;
-
- STRA m_strXForwardedForName;
- STRA m_strSslHeaderName;
- STRA m_strClientCertName;
-};
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h
deleted file mode 100644
index 1adbcffae8..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-#include "forwardinghandler.h"
-
-class CProxyModule : public CHttpModule
-{
-public:
-
- CProxyModule();
-
- ~CProxyModule();
-
- void * operator new(size_t size, IModuleAllocator * pPlacement)
- {
- return pPlacement->AllocateMemory(static_cast(size));
- }
-
- VOID
- operator delete(
- void *
- )
- {
- }
-
- __override
- REQUEST_NOTIFICATION_STATUS
- OnExecuteRequestHandler(
- IHttpContext * pHttpContext,
- IHttpEventProvider * pProvider
- );
-
- __override
- REQUEST_NOTIFICATION_STATUS
- OnAsyncCompletion(
- IHttpContext * pHttpContext,
- DWORD dwNotification,
- BOOL fPostNotification,
- IHttpEventProvider * pProvider,
- IHttpCompletionInfo * pCompletionInfo
- );
-
-private:
-
- FORWARDING_HANDLER * m_pHandler;
-};
-
-class CProxyModuleFactory : public IHttpModuleFactory
-{
-public:
- HRESULT
- GetHttpModule(
- CHttpModule ** ppModule,
- IModuleAllocator * pAllocator
- );
-
- VOID
- Terminate();
-};
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/resource.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/resource.h
deleted file mode 100644
index 26ae89c7ba..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/resource.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-#define IDS_INVALID_PROPERTY 1000
-#define IDS_SERVER_ERROR 1001
-
-#define ASPNETCORE_EVENT_MSG_BUFFER_SIZE 256
-#define ASPNETCORE_EVENT_PROCESS_START_SUCCESS_MSG L"Application '%s' started process '%d' successfully and is listening on port '%d'."
-#define ASPNETCORE_EVENT_RAPID_FAIL_COUNT_EXCEEDED_MSG L"Maximum rapid fail count per minute of '%d' exceeded."
-#define ASPNETCORE_EVENT_PROCESS_START_INTERNAL_ERROR_MSG L"Application '%s' failed to parse processPath and arguments due to internal error, ErrorCode = '0x%x'."
-#define ASPNETCORE_EVENT_PROCESS_START_POSTCREATE_ERROR_MSG L"Application '%s' with physical root '%s' created process with commandline '%s'but failed to get its status, ErrorCode = '0x%x'."
-#define ASPNETCORE_EVENT_PROCESS_START_ERROR_MSG L"Application '%s' with physical root '%s' failed to start process with commandline '%s', ErrorCode = '0x%x' : %x."
-#define ASPNETCORE_EVENT_PROCESS_START_WRONGPORT_ERROR_MSG L"Application '%s' with physical root '%s' created process with commandline '%s' but failed to listen on the given port '%d'"
-#define ASPNETCORE_EVENT_PROCESS_START_NOTREADY_ERROR_MSG L"Application '%s' with physical root '%s' created process with commandline '%s' but either crashed or did not respond or did not listen on the given port '%d', ErrorCode = '0x%x'"
-#define ASPNETCORE_EVENT_INVALID_STDOUT_LOG_FILE_MSG L"Warning: Could not create stdoutLogFile %s, ErrorCode = %d."
-#define ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE_MSG L"Failed to gracefully shutdown process '%d'."
-#define ASPNETCORE_EVENT_SENT_SHUTDOWN_HTTP_REQUEST_MSG L"Sent shutdown HTTP message to process '%d' and received http status '%d'."
-#define ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_MSG L"App_offline file '%s' was detected."
-#define ASPNETCORE_EVENT_PROCESS_SHUTDOWN_MSG L"Application '%s' with physical root '%s' shut down process with Id '%d' listening on port '%d'"
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h
deleted file mode 100644
index 7ef127366b..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-//
-// *_HEADER_HASH maps strings to UlHeader* values
-//
-
-#define UNKNOWN_INDEX (0xFFFFFFFF)
-
-struct HEADER_RECORD
-{
- PCSTR _pszName;
- ULONG _ulHeaderIndex;
-};
-
-class RESPONSE_HEADER_HASH: public HASH_TABLE
-{
-public:
- RESPONSE_HEADER_HASH()
- {}
-
- VOID
- ReferenceRecord(
- HEADER_RECORD *
- )
- {}
-
- VOID
- DereferenceRecord(
- HEADER_RECORD *
- )
- {}
-
- PCSTR
- ExtractKey(
- HEADER_RECORD * pRecord
- )
- {
- return pRecord->_pszName;
- }
-
- DWORD
- CalcKeyHash(
- PCSTR key
- )
- {
- return HashStringNoCase(key);
- }
-
- BOOL
- EqualKeys(
- PCSTR key1,
- PCSTR key2
- )
- {
- return (_stricmp(key1, key2) == 0);
- }
-
- HRESULT
- Initialize(
- VOID
- );
-
- VOID
- Terminate(
- VOID
- );
-
- DWORD
- GetIndex(
- PCSTR pszName
- )
- {
- HEADER_RECORD * pRecord = NULL;
-
- FindKey(pszName, &pRecord);
- if (pRecord != NULL)
- {
- return pRecord->_ulHeaderIndex;
- }
-
- return UNKNOWN_INDEX;
- }
-
- static
- PCSTR
- GetString(
- ULONG ulIndex
- )
- {
- if (ulIndex < HttpHeaderResponseMaximum)
- {
- DBG_ASSERT(sm_rgHeaders[ulIndex]._ulHeaderIndex == ulIndex);
- return sm_rgHeaders[ulIndex]._pszName;
- }
-
- return NULL;
- }
-
-private:
-
- static HEADER_RECORD sm_rgHeaders[];
-
- RESPONSE_HEADER_HASH(const RESPONSE_HEADER_HASH &);
- void operator=(const RESPONSE_HEADER_HASH &);
-};
-
-extern RESPONSE_HEADER_HASH * g_pResponseHeaderHash;
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h
deleted file mode 100644
index 94b65bad54..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h
+++ /dev/null
@@ -1,338 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-#include
-
-#define MIN_PORT 1025
-#define MAX_PORT 48000
-#define MAX_RETRY 10
-#define MAX_ACTIVE_CHILD_PROCESSES 16
-#define LOCALHOST "127.0.0.1"
-#define ASPNETCORE_PORT_STR L"ASPNETCORE_PORT"
-#define ASPNETCORE_PORT_ENV_STR L"ASPNETCORE_PORT="
-#define ASPNETCORE_APP_PATH_ENV_STR L"ASPNETCORE_APPL_PATH="
-#define ASPNETCORE_APP_TOKEN_ENV_STR L"ASPNETCORE_TOKEN="
-#define ASPNETCORE_APP_PATH_ENV_STR L"ASPNETCORE_APPL_PATH="
-#define HOSTING_STARTUP_ASSEMBLIES_ENV_STR L"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES"
-#define HOSTING_STARTUP_ASSEMBLIES_NAME L"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES="
-#define HOSTING_STARTUP_ASSEMBLIES_VALUE L"Microsoft.AspNetCore.Server.IISIntegration"
-#define ASPNETCORE_IIS_AUTH_ENV_STR L"ASPNETCORE_IIS_HTTPAUTH="
-#define ASPNETCORE_IIS_AUTH_WINDOWS L"windows;"
-#define ASPNETCORE_IIS_AUTH_BASIC L"basic;"
-#define ASPNETCORE_IIS_AUTH_ANONYMOUS L"anonymous;"
-#define ASPNETCORE_IIS_AUTH_NONE L"none"
-
-class PROCESS_MANAGER;
-class FORWARDER_CONNECTION;
-
-class SERVER_PROCESS
-{
-public:
- SERVER_PROCESS();
-
- HRESULT
- Initialize(
- _In_ PROCESS_MANAGER *pProcessManager,
- _In_ STRU *pszProcessExePath,
- _In_ STRU *pszArguments,
- _In_ DWORD dwStartupTimeLimitInMS,
- _In_ DWORD dwShtudownTimeLimitInMS,
- _In_ BOOL fWindowsAuthEnabled,
- _In_ BOOL fBasicAuthEnabled,
- _In_ BOOL fAnonymousAuthEnabled,
- _In_ ENVIRONMENT_VAR_HASH* pEnvironmentVariables,
- _In_ BOOL fStdoutLogEnabled,
- _In_ STRU *pstruStdoutLogFile
- );
-
-
- HRESULT
- StartProcess(
- _In_ IHttpContext *context
- );
-
- HRESULT
- SetWindowsAuthToken(
- _In_ HANDLE hToken,
- _Out_ LPHANDLE pTargeTokenHandle
- );
-
- BOOL
- IsReady(
- VOID
- )
- {
- return m_fReady;
- }
-
- BOOL
- IsDebuggerAttached(
- VOID
- )
- {
- return m_fDebuggerAttached;
- }
-
- VOID
- StopProcess(
- VOID
- );
-
- DWORD
- GetPort()
- {
- return m_dwPort;
- }
-
- VOID
- ReferenceServerProcess(
- VOID
- )
- {
- InterlockedIncrement(&m_cRefs);
- }
-
- VOID
- DereferenceServerProcess(
- VOID
- )
- {
- _ASSERT(m_cRefs != 0 );
-
- if (InterlockedDecrement(&m_cRefs) == 0)
- {
- delete this;
- }
- }
-
- virtual
- ~SERVER_PROCESS();
-
- HRESULT
- HandleProcessExit(
- VOID
- );
-
- FORWARDER_CONNECTION*
- QueryWinHttpConnection(
- VOID
- )
- {
- return m_pForwarderConnection;
- }
-
- static
- VOID
- CALLBACK
- TimerCallback(
- _In_ PTP_CALLBACK_INSTANCE Instance,
- _In_ PVOID Context,
- _In_ PTP_TIMER Timer
- );
-
- LPCWSTR
- QueryPortStr()
- {
- return m_struPort.QueryStr();
- }
-
- LPCWSTR
- QueryFullLogPath()
- {
- return m_struFullLogFile.QueryStr();
- }
-
- LPCSTR
- QueryGuid()
- {
- return m_straGuid.QueryStr();
- }
-
- DWORD
- QueryProcessGroupId()
- {
- return m_dwProcessId;
- }
-
- VOID
- SendSignal(
- VOID
- );
-
-private:
-
- BOOL
- IsDebuggerIsAttached(
- VOID
- );
-
- HRESULT
- StopAllProcessesInJobObject(
- VOID
- );
-
- HRESULT
- SetupStdHandles(
- _In_ IHttpContext *context,
- _In_ LPSTARTUPINFOW pStartupInfo
- );
-
- HRESULT
- CheckIfServerIsUp(
- _In_ DWORD dwPort,
- _Out_ DWORD * pdwProcessId,
- _Out_ BOOL * pfReady
- );
-
- HRESULT
- RegisterProcessWait(
- _In_ PHANDLE phWaitHandle,
- _In_ HANDLE hProcessToWaitOn
- );
-
- HRESULT
- GetChildProcessHandles(
- );
-
- HRESULT
- SetupListenPort(
- ENVIRONMENT_VAR_HASH *pEnvironmentVarTable
- );
-
- HRESULT
- SetupAppPath(
- IHttpContext* pContext,
- ENVIRONMENT_VAR_HASH* pEnvironmentVarTable
- );
-
- HRESULT
- SetupAppToken(
- ENVIRONMENT_VAR_HASH* pEnvironmentVarTable
- );
-
- HRESULT
- InitEnvironmentVariablesTable(
- ENVIRONMENT_VAR_HASH** pEnvironmentVarTable
- );
-
- HRESULT
- OutputEnvironmentVariables(
- MULTISZ* pmszOutput,
- ENVIRONMENT_VAR_HASH* pEnvironmentVarTable
- );
-
- HRESULT
- SetupCommandLine(
- STRU* pstrCommandLine
- );
-
- HRESULT
- PostStartCheck(
- const STRU* const pStruCommandline,
- STRU* pStruErrorMessage
- );
-
- HRESULT
- GetRandomPort(
- DWORD* pdwPickedPort,
- DWORD dwExcludedPort
- );
-
- DWORD
- GetNumberOfDigits(
- _In_ DWORD dwNumber
- )
- {
- DWORD digits = 0;
-
- if( dwNumber == 0 )
- {
- digits = 1;
- goto Finished;
- }
-
- while( dwNumber > 0)
- {
- dwNumber = dwNumber / 10;
- digits ++;
- }
- Finished:
- return digits;
- }
-
- static
- VOID
- SendShutDownSignal(
- LPVOID lpParam
- );
-
- VOID
- SendShutDownSignalInternal(
- VOID
- );
-
- HRESULT
- SendShutdownHttpMessage(
- VOID
- );
-
- VOID
- TerminateBackendProcess(
- VOID
- );
-
- FORWARDER_CONNECTION *m_pForwarderConnection;
- BOOL m_fStdoutLogEnabled;
- BOOL m_fWindowsAuthEnabled;
- BOOL m_fBasicAuthEnabled;
- BOOL m_fAnonymousAuthEnabled;
- BOOL m_fDebuggerAttached;
-
- STTIMER m_Timer;
- SOCKET m_socket;
-
- STRU m_struLogFile;
- STRU m_struFullLogFile;
- STRU m_ProcessPath;
- STRU m_Arguments;
- STRU m_struAppPath;
- STRU m_struAppFullPath;
- STRU m_struPort;
- STRU m_pszRootApplicationPath;
- volatile LONG m_lStopping;
- volatile BOOL m_fReady;
- mutable LONG m_cRefs;
-
- std::mt19937 m_randomGenerator;
-
- DWORD m_dwPort;
- DWORD m_dwStartupTimeLimitInMS;
- DWORD m_dwShutdownTimeLimitInMS;
- DWORD m_cChildProcess;
- DWORD m_dwChildProcessIds[MAX_ACTIVE_CHILD_PROCESSES];
- DWORD m_dwProcessId;
- DWORD m_dwListeningProcessId;
-
- STRA m_straGuid;
-
- HANDLE m_hJobObject;
- HANDLE m_hStdoutHandle;
- //
- // m_hProcessHandle is the handle to process this object creates.
- //
- HANDLE m_hProcessHandle;
- HANDLE m_hListeningProcessHandle;
- HANDLE m_hProcessWaitHandle;
- HANDLE m_hShutdownHandle;
- //
- // m_hChildProcessHandle is the handle to process created by
- // m_hProcessHandle process if it does.
- //
- HANDLE m_hChildProcessHandles[MAX_ACTIVE_CHILD_PROCESSES];
- HANDLE m_hChildProcessWaitHandles[MAX_ACTIVE_CHILD_PROCESSES];
-
- PROCESS_MANAGER *m_pProcessManager;
- ENVIRONMENT_VAR_HASH *m_pEnvironmentVarTable ;
-};
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h
deleted file mode 100644
index dfb79e7a6a..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-#ifndef _STTIMER_H
-#define _STTIMER_H
-
-class STTIMER
-{
-public:
-
- STTIMER()
- : _pTimer( NULL )
- {
- fInCanel = FALSE;
- }
-
- virtual
- ~STTIMER()
- {
- if ( _pTimer )
- {
- CancelTimer();
- CloseThreadpoolTimer( _pTimer );
- _pTimer = NULL;
- }
- }
-
- HRESULT
- InitializeTimer(
- PTP_TIMER_CALLBACK pfnCallback,
- VOID * pContext,
- DWORD dwInitialWait = 0,
- DWORD dwPeriod = 0
- )
- {
- _pTimer = CreateThreadpoolTimer( pfnCallback,
- pContext,
- NULL );
-
- if ( !_pTimer )
- {
- return HRESULT_FROM_WIN32( GetLastError() );
- }
-
- if ( dwInitialWait )
- {
- SetTimer( dwInitialWait,
- dwPeriod );
- }
-
- return S_OK;
- }
-
- VOID
- SetTimer(
- DWORD dwInitialWait,
- DWORD dwPeriod = 0
- )
- {
- FILETIME ftInitialWait;
-
- if ( dwInitialWait == 0 && dwPeriod == 0 )
- {
- //
- // Special case. We are preventing new callbacks
- // from being queued. Any existing callbacks in the
- // queue will still run.
- //
- // This effectively disables the timer. It can be
- // re-enabled by setting non-zero initial wait or
- // period values.
- //
- if (_pTimer != NULL)
- {
- SetThreadpoolTimer(_pTimer, NULL, 0, 0);
- }
-
- return;
- }
-
- InitializeRelativeFileTime( &ftInitialWait, dwInitialWait );
-
- SetThreadpoolTimer( _pTimer,
- &ftInitialWait,
- dwPeriod,
- 0 );
- }
-
- VOID
- CancelTimer()
- {
- //
- // Disable the timer
- //
- if (fInCanel)
- return;
-
- fInCanel = TRUE;
- SetTimer( 0 );
-
- //
- // Wait until any callbacks queued prior to disabling
- // have completed.
- //
- if (_pTimer != NULL)
- {
- WaitForThreadpoolTimerCallbacks(_pTimer, TRUE);
- }
-
- fInCanel = FALSE;
- }
-
- static
- VOID
- CALLBACK
- TimerCallback(
- _In_ PTP_CALLBACK_INSTANCE Instance,
- _In_ PVOID Context,
- _In_ PTP_TIMER Timer
- )
- {
- Instance;
- Timer;
- STRU* pstruLogFilePath = (STRU*)Context;
- HANDLE hStdoutHandle = NULL;
- SECURITY_ATTRIBUTES saAttr = { 0 };
- HRESULT hr = S_OK;
-
- saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
- saAttr.bInheritHandle = TRUE;
- saAttr.lpSecurityDescriptor = NULL;
-
- hStdoutHandle = CreateFileW(pstruLogFilePath->QueryStr(),
- FILE_READ_DATA,
- FILE_SHARE_WRITE,
- &saAttr,
- OPEN_ALWAYS,
- FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (hStdoutHandle == INVALID_HANDLE_VALUE)
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- }
-
- CloseHandle(hStdoutHandle);
- }
-
-private:
-
- VOID
- InitializeRelativeFileTime(
- FILETIME * pft,
- DWORD dwMilliseconds
- )
- {
- LARGE_INTEGER li;
-
- //
- // The pftDueTime parameter expects the time to be
- // expressed as the number of 100 nanosecond intervals
- // times -1.
- //
- // To convert from milliseconds, we'll multiply by
- // -10000
- //
-
- li.QuadPart = (LONGLONG)dwMilliseconds * -10000;
-
- pft->dwHighDateTime = li.HighPart;
- pft->dwLowDateTime = li.LowPart;
- };
-
- TP_TIMER * _pTimer;
- BOOL fInCanel;
-};
-
-class STELAPSED
-{
-public:
-
- STELAPSED()
- : _dwInitTime( 0 ),
- _dwInitTickCount( 0 ),
- _dwPerfCountsPerMillisecond( 0 ),
- _fUsingHighResolution( FALSE )
- {
- LARGE_INTEGER li;
- BOOL fResult;
-
- _dwInitTickCount = GetTickCount64();
-
- fResult = QueryPerformanceFrequency( &li );
-
- if ( !fResult )
- {
- goto Finished;
- }
-
- _dwPerfCountsPerMillisecond = li.QuadPart / 1000;
-
- fResult = QueryPerformanceCounter( &li );
-
- if ( !fResult )
- {
- goto Finished;
- }
-
- _dwInitTime = li.QuadPart / _dwPerfCountsPerMillisecond;
-
- _fUsingHighResolution = TRUE;
-
-Finished:
-
- return;
- }
-
- virtual
- ~STELAPSED()
- {
- }
-
- LONGLONG
- QueryElapsedTime()
- {
- LARGE_INTEGER li;
-
- if ( _fUsingHighResolution && QueryPerformanceCounter( &li ) )
- {
- DWORD64 dwCurrentTime = li.QuadPart / _dwPerfCountsPerMillisecond;
-
- if ( dwCurrentTime < _dwInitTime )
- {
- //
- // It's theoretically possible that QueryPerformanceCounter
- // may return slightly different values on different CPUs.
- // In this case, we don't want to return an unexpected value
- // so we'll return zero. This is acceptable because
- // presumably such a case would only happen for a very short
- // time window.
- //
- // It would be possible to prevent this by ensuring processor
- // affinity for all calls to QueryPerformanceCounter, but that
- // would be undesirable in the general case because it could
- // introduce unnecessary context switches and potentially a
- // CPU bottleneck.
- //
- // Note that this issue also applies to callers doing rapid
- // calls to this function. If a caller wants to mitigate
- // that, they could enforce the affinitization, or they
- // could implement a similar sanity check when comparing
- // returned values from this function.
- //
-
- return 0;
- }
-
- return dwCurrentTime - _dwInitTime;
- }
-
- return GetTickCount64() - _dwInitTickCount;
- }
-
- BOOL
- QueryUsingHighResolution()
- {
- return _fUsingHighResolution;
- }
-
-private:
-
- DWORD64 _dwInitTime;
- DWORD64 _dwInitTickCount;
- DWORD64 _dwPerfCountsPerMillisecond;
- BOOL _fUsingHighResolution;
-};
-
-#endif // _STTIMER_H
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h
deleted file mode 100644
index aadfcb6884..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-class FORWARDING_HANDLER;
-
-class WEBSOCKET_HANDLER
-{
-public:
- WEBSOCKET_HANDLER();
-
- virtual
- ~WEBSOCKET_HANDLER();
-
- static
- HRESULT
- StaticInitialize(
- BOOL fEnableReferenceTraceLogging
- );
-
- static
- VOID
- StaticTerminate(
- VOID
- );
-
- VOID
- Terminate(
- VOID
- );
-
- VOID
- TerminateRequest(
- VOID
- )
- {
- Cleanup(ServerStateUnavailable);
- }
-
- HRESULT
- ProcessRequest(
- FORWARDING_HANDLER *pHandler,
- IHttpContext * pHttpContext,
- HINTERNET hRequest,
- BOOL* fHandleCreated
- );
-
- REQUEST_NOTIFICATION_STATUS
- OnAsyncCompletion(
- VOID
- );
-
- HRESULT
- OnWinHttpSendComplete(
- WINHTTP_WEB_SOCKET_STATUS * pCompletionStatus
- );
-
- HRESULT
- OnWinHttpShutdownComplete(
- VOID
- );
-
- HRESULT
- OnWinHttpReceiveComplete(
- WINHTTP_WEB_SOCKET_STATUS * pCompletionStatus
- );
-
- HRESULT
- OnWinHttpIoError(
- WINHTTP_WEB_SOCKET_ASYNC_RESULT *pCompletionStatus
- );
-
-private:
- enum CleanupReason
- {
- CleanupReasonUnknown = 0,
- IdleTimeout = 1,
- ConnectFailed = 2,
- ClientDisconnect = 3,
- ServerDisconnect = 4,
- ServerStateUnavailable = 5
- };
-
- WEBSOCKET_HANDLER(const WEBSOCKET_HANDLER &);
- void operator=(const WEBSOCKET_HANDLER &);
-
- VOID
- InsertRequest(
- VOID
- );
-
- VOID
- RemoveRequest(
- VOID
- );
-
- static
- VOID
- WINAPI
- OnReadIoCompletion(
- HRESULT hrError,
- VOID * pvCompletionContext,
- DWORD cbIO,
- BOOL fUTF8Encoded,
- BOOL fFinalFragment,
- BOOL fClose
- );
-
- static
- VOID
- WINAPI
- OnWriteIoCompletion(
- HRESULT hrError,
- VOID * pvCompletionContext,
- DWORD cbIO,
- BOOL fUTF8Encoded,
- BOOL fFinalFragment,
- BOOL fClose
- );
-
- VOID
- Cleanup(
- CleanupReason reason
- );
-
- HRESULT
- DoIisWebSocketReceive(
- VOID
- );
-
- HRESULT
- DoWinHttpWebSocketReceive(
- VOID
- );
-
- HRESULT
- DoIisWebSocketSend(
- DWORD cbData,
- WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType
- );
-
- HRESULT
- DoWinHttpWebSocketSend(
- DWORD cbData,
- WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType
- );
-
- HRESULT
- OnIisSendComplete(
- HRESULT hrError,
- DWORD cbIO
- );
-
- HRESULT
- OnIisReceiveComplete(
- HRESULT hrError,
- DWORD cbIO,
- BOOL fUTF8Encoded,
- BOOL fFinalFragment,
- BOOL fClose
- );
-
- VOID
- IncrementOutstandingIo(
- VOID
- );
-
- VOID
- DecrementOutstandingIo(
- VOID
- );
-
- VOID
- IndicateCompletionToIIS(
- VOID
- );
-
-private:
- static const
- DWORD RECEIVE_BUFFER_SIZE = 4*1024;
-
- LIST_ENTRY _listEntry;
-
- IHttpContext3 * _pHttpContext;
-
- IWebSocketContext * _pWebSocketContext;
-
- FORWARDING_HANDLER *_pHandler;
-
- HINTERNET _hWebSocketRequest;
-
- BYTE _WinHttpReceiveBuffer[RECEIVE_BUFFER_SIZE];
-
- BYTE _IisReceiveBuffer[RECEIVE_BUFFER_SIZE];
-
- CRITICAL_SECTION _RequestLock;
-
- LONG _dwOutstandingIo;
-
- volatile
- BOOL _fHandleClosed;
-
- volatile
- BOOL _fCleanupInProgress;
-
- volatile
- BOOL _fIndicateCompletionToIis;
-
- volatile
- BOOL _fReceivedCloseMsg;
-
- static
- LIST_ENTRY sm_RequestsListHead;
-
- static
- SRWLOCK sm_RequestsListLock;
-
- static
- TRACE_LOG * sm_pTraceLog;
-};
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h
deleted file mode 100644
index b301a76cf2..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-typedef
-HINTERNET
-(WINAPI * PFN_WINHTTP_WEBSOCKET_COMPLETE_UPGRADE)(
- _In_ HINTERNET hRequest,
- _In_opt_ DWORD_PTR pContext
-);
-
-
-typedef
-DWORD
-(WINAPI * PFN_WINHTTP_WEBSOCKET_SEND)(
- _In_ HINTERNET hWebSocket,
- _In_ WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType,
- _In_reads_opt_(dwBufferLength) PVOID pvBuffer,
- _In_ DWORD dwBufferLength
-);
-
-typedef
-DWORD
-(WINAPI * PFN_WINHTTP_WEBSOCKET_RECEIVE)(
- _In_ HINTERNET hWebSocket,
- _Out_writes_bytes_to_(dwBufferLength, *pdwBytesRead) PVOID pvBuffer,
- _In_ DWORD dwBufferLength,
- _Out_range_(0, dwBufferLength) DWORD *pdwBytesRead,
- _Out_ WINHTTP_WEB_SOCKET_BUFFER_TYPE *peBufferType
-);
-
-typedef
-DWORD
-(WINAPI * PFN_WINHTTP_WEBSOCKET_SHUTDOWN)(
- _In_ HINTERNET hWebSocket,
- _In_ USHORT usStatus,
- _In_reads_bytes_opt_(dwReasonLength) PVOID pvReason,
- _In_range_(0, WINHTTP_WEB_SOCKET_MAX_CLOSE_REASON_LENGTH) DWORD dwReasonLength
-);
-
-typedef
-DWORD
-(WINAPI * PFN_WINHTTP_WEBSOCKET_QUERY_CLOSE_STATUS)(
- _In_ HINTERNET hWebSocket,
- _Out_ USHORT *pusStatus,
- _Out_writes_bytes_to_opt_(dwReasonLength, *pdwReasonLengthConsumed) PVOID pvReason,
- _In_range_(0, WINHTTP_WEB_SOCKET_MAX_CLOSE_REASON_LENGTH) DWORD dwReasonLength,
- _Out_range_(0, WINHTTP_WEB_SOCKET_MAX_CLOSE_REASON_LENGTH) DWORD *pdwReasonLengthConsumed
-);
-
-class WINHTTP_HELPER
-{
-public:
- static
- HRESULT
- StaticInitialize();
-
- static
- VOID
- GetFlagsFromBufferType(
- __in WINHTTP_WEB_SOCKET_BUFFER_TYPE BufferType,
- __out BOOL * pfUtf8Encoded,
- __out BOOL * pfFinalFragment,
- __out BOOL * pfClose
- );
-
- static
- VOID
- GetBufferTypeFromFlags(
- __in BOOL fUtf8Encoded,
- __in BOOL fFinalFragment,
- __in BOOL fClose,
- __out WINHTTP_WEB_SOCKET_BUFFER_TYPE* pBufferType
- );
-
- static
- PFN_WINHTTP_WEBSOCKET_COMPLETE_UPGRADE sm_pfnWinHttpWebSocketCompleteUpgrade;
-
- static
- PFN_WINHTTP_WEBSOCKET_SEND sm_pfnWinHttpWebSocketSend;
-
- static
- PFN_WINHTTP_WEBSOCKET_RECEIVE sm_pfnWinHttpWebSocketReceive;
-
- static
- PFN_WINHTTP_WEBSOCKET_SHUTDOWN sm_pfnWinHttpWebSocketShutdown;
-
- static
- PFN_WINHTTP_WEBSOCKET_QUERY_CLOSE_STATUS sm_pfnWinHttpWebSocketQueryCloseStatus;
-};
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Source.def b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Source.def
deleted file mode 100644
index 9aae10ab5d..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/Source.def
+++ /dev/null
@@ -1,4 +0,0 @@
-LIBRARY aspnetcore
-
-EXPORTS
- RegisterModule
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc
deleted file mode 100644
index 73eb713f1c..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc
+++ /dev/null
@@ -1,85 +0,0 @@
-;/*++
-;
-; Copyright (c) .NET Foundation. All rights reserved.
-; Licensed under the MIT License. See License.txt in the project root for license information.
-;
-;Module Name:
-;
-; aspnetcore_msg.mc
-;
-;Abstract:
-;
-; Asp.Net Core Module localizable messages.
-;
-;--*/
-;
-;
-;#ifndef _ASPNETCORE_MSG_H_
-;#define _ASPNETCORE_MSG_H_
-;
-
-SeverityNames=(Success=0x0
- Informational=0x1
- Warning=0x2
- Error=0x3
- )
-
-MessageIdTypedef=DWORD
-
-Messageid=1000
-SymbolicName=ASPNETCORE_EVENT_PROCESS_START_ERROR
-Language=English
-%1
-.
-
-Messageid=1001
-SymbolicName=ASPNETCORE_EVENT_PROCESS_START_SUCCESS
-Language=English
-%1
-.
-
-Messageid=1002
-SymbolicName=ASPNETCORE_EVENT_PROCESS_CRASH
-Language=English
-%1
-.
-
-Messageid=1003
-SymbolicName=ASPNETCORE_EVENT_RAPID_FAIL_COUNT_EXCEEDED
-Language=English
-%1
-.
-
-Messageid=1004
-SymbolicName=ASPNETCORE_EVENT_CONFIG_ERROR
-Language=English
-%1
-.
-
-Messageid=1005
-SymbolicName=ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE
-Language=English
-%1
-.
-
-Messageid=1006
-SymbolicName=ASPNETCORE_EVENT_SENT_SHUTDOWN_HTTP_REQUEST
-Language=English
-%1
-.
-
-Messageid=1012
-SymbolicName=ASPNETCORE_EVENT_RECYCLE_APPOFFLINE
-Language=English
-%1
-.
-
-Messageid=1030
-SymbolicName=ASPNETCORE_EVENT_PROCESS_SHUTDOWN
-Language=English
-%1
-.
-
-;
-;#endif // _ASPNETCORE_MODULE_MSG_H_
-;
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc
deleted file mode 100644
index 4bd467538f..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc
+++ /dev/null
@@ -1,120 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include
-#include "version.h"
-#include "resource.h"
-#include "aspnetcore_msg.rc"
-/////////////////////////////////////////////////////////////////////////////
-// English (United States) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-
-#define FileDescription "IIS ASP.NET Core Module. Commit: " CommitHash
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// 11
-//
-
-//1 11
-//BEGIN
-// 0x0001, 0x0000, 0x03e8, 0x0000, 0x03ed, 0x0000, 0x0010, 0x0000, 0x0010,
-// 0x0001, 0x0025, 0x0031, 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001,
-// 0x0025, 0x0031, 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025,
-// 0x0031, 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025, 0x0031,
-// 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025, 0x0031, 0x000d,
-// 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025, 0x0031, 0x000d, 0x000a,
-// 0x0000, 0x0000
-//END
-
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION FileVersion
- PRODUCTVERSION ProductVersion
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x40004L
- FILETYPE 0x2L
- FILESUBTYPE 0x0L
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "040904b0"
- BEGIN
- VALUE "CompanyName", "Microsoft Corporation"
- VALUE "FileDescription", FileDescription
- VALUE "FileVersion", FileVersionStr
- VALUE "InternalName", "aspnetcore"
- VALUE "LegalCopyright", "Copyright (C) Microsoft Corporation"
- VALUE "OriginalFilename", "aspnetcore.dll"
- VALUE "ProductName", "ASP.NET Core Module"
- VALUE "ProductVersion", ProductVersionStr
- END
- END
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x409, 1200
- END
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// String Table
-//
-
-STRINGTABLE
-BEGIN
- IDS_INVALID_PROPERTY "Property name '%s' in system.webServer/aspNetCore section has invalid value '%s' which does not conform to the prescribed format"
- IDS_SERVER_ERROR "There was a connection error while trying to route the request."
-END
-
-#endif // English (United States) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/resource.h b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/resource.h
deleted file mode 100644
index 493c3e2797..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/resource.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by aspnetcoremodule.rc
-//
-#define ASPNETCORE_EVENT_MSG_BUFFER_SIZE 256
-#define IDS_INVALID_PROPERTY 1000
-#define IDS_SERVER_ERROR 1001
-
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 101
-#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1000
-#define _APS_NEXT_SYMED_VALUE 101
-#endif
-#endif
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/application.cxx b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/application.cxx
deleted file mode 100644
index f80435cfbb..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/application.cxx
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#include "precomp.hxx"
-
-APPLICATION::~APPLICATION()
-{
- if (m_pAppOfflineHtm != NULL)
- {
- m_pAppOfflineHtm->DereferenceAppOfflineHtm();
- m_pAppOfflineHtm = NULL;
- }
-
- if (m_pFileWatcherEntry != NULL)
- {
- // Mark the entry as invalid,
- // StopMonitor will close the file handle and trigger a FCN
- // the entry will delete itself when processing this FCN
- m_pFileWatcherEntry->MarkEntryInValid();
- m_pFileWatcherEntry->StopMonitor();
- m_pFileWatcherEntry = NULL;
- }
-
- if (m_pProcessManager != NULL)
- {
- m_pProcessManager->ShutdownAllProcesses();
- m_pProcessManager->DereferenceProcessManager();
- m_pProcessManager = NULL;
- }
-}
-
-HRESULT
-APPLICATION::Initialize(
- _In_ APPLICATION_MANAGER* pApplicationManager,
- _In_ LPCWSTR pszApplication,
- _In_ LPCWSTR pszPhysicalPath
-)
-{
- HRESULT hr = S_OK;
-
- DBG_ASSERT(pszPhysicalPath != NULL);
- DBG_ASSERT(pApplicationManager != NULL);
- DBG_ASSERT(pszPhysicalPath != NULL);
- m_strAppPhysicalPath.Copy(pszPhysicalPath);
-
- m_pApplicationManager = pApplicationManager;
-
- hr = m_applicationKey.Initialize(pszApplication);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- if (m_pProcessManager == NULL)
- {
- m_pProcessManager = new PROCESS_MANAGER;
- if (m_pProcessManager == NULL)
- {
- hr = E_OUTOFMEMORY;
- goto Finished;
- }
-
- hr = m_pProcessManager->Initialize();
- if (FAILED(hr))
- {
- goto Finished;
- }
- }
-
- if (m_pFileWatcherEntry == NULL)
- {
- m_pFileWatcherEntry = new FILE_WATCHER_ENTRY(pApplicationManager->GetFileWatcher());
- if (m_pFileWatcherEntry == NULL)
- {
- hr = E_OUTOFMEMORY;
- goto Finished;
- }
- }
-
- UpdateAppOfflineFileHandle();
-
-Finished:
-
- if (FAILED(hr))
- {
- if (m_pFileWatcherEntry != NULL)
- {
- m_pFileWatcherEntry->DereferenceFileWatcherEntry();
- m_pFileWatcherEntry = NULL;
- }
-
- if (m_pProcessManager != NULL)
- {
- m_pProcessManager->DereferenceProcessManager();
- m_pProcessManager = NULL;
- }
- }
-
- return hr;
-}
-
-HRESULT
-APPLICATION::StartMonitoringAppOffline()
-{
- HRESULT hr = S_OK;
-
- hr = m_pFileWatcherEntry->Create(m_strAppPhysicalPath.QueryStr(), L"app_offline.htm", this, NULL);
-
- return hr;
-}
-
-VOID
-APPLICATION::UpdateAppOfflineFileHandle()
-{
- STRU strFilePath;
- PATH::ConvertPathToFullPath(L".\\app_offline.htm", m_strAppPhysicalPath.QueryStr(), &strFilePath);
- APP_OFFLINE_HTM *pOldAppOfflineHtm = NULL;
- APP_OFFLINE_HTM *pNewAppOfflineHtm = NULL;
-
- if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(strFilePath.QueryStr()) && GetLastError() == ERROR_FILE_NOT_FOUND)
- {
- m_fAppOfflineFound = FALSE;
- }
- else
- {
- m_fAppOfflineFound = TRUE;
-
- //
- // send shutdown signal
- //
-
- // The reason why we send the shutdown signal before loading the new app_offline file is because we want to make some delay
- // before reading the appoffline.htm so that the file change can be done on time.
- if (m_pProcessManager != NULL)
- {
- m_pProcessManager->SendShutdownSignal();
- }
-
- pNewAppOfflineHtm = new APP_OFFLINE_HTM(strFilePath.QueryStr());
-
- if ( pNewAppOfflineHtm != NULL )
- {
- if (pNewAppOfflineHtm->Load())
- {
- //
- // loaded the new app_offline.htm
- //
- pOldAppOfflineHtm = (APP_OFFLINE_HTM *)InterlockedExchangePointer((VOID**)&m_pAppOfflineHtm, pNewAppOfflineHtm);
-
- if (pOldAppOfflineHtm != NULL)
- {
- pOldAppOfflineHtm->DereferenceAppOfflineHtm();
- pOldAppOfflineHtm = NULL;
- }
- }
- else
- {
- // ignored the new app_offline file because the file does not exist.
- pNewAppOfflineHtm->DereferenceAppOfflineHtm();
- pNewAppOfflineHtm = NULL;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx
deleted file mode 100644
index 41f20013b7..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#include "precomp.hxx"
-
-APPLICATION_MANAGER* APPLICATION_MANAGER::sm_pApplicationManager = NULL;
-
-HRESULT
-APPLICATION_MANAGER::GetApplication(
- _In_ IHttpContext* pContext,
- _Out_ APPLICATION ** ppApplication
-)
-{
- HRESULT hr = S_OK;
- APPLICATION *pApplication = NULL;
- APPLICATION_KEY key;
- BOOL fExclusiveLock = FALSE;
- PCWSTR pszApplicationId = NULL;
-
- *ppApplication = NULL;
-
- DBG_ASSERT(pContext != NULL);
- DBG_ASSERT(pContext->GetApplication() != NULL);
- pszApplicationId = pContext->GetApplication()->GetApplicationId();
-
- hr = key.Initialize(pszApplicationId);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- m_pApplicationHash->FindKey(&key, ppApplication);
-
- if (*ppApplication == NULL)
- {
-
- pApplication = new APPLICATION();
- if (pApplication == NULL)
- {
- hr = E_OUTOFMEMORY;
- goto Finished;
- }
-
- AcquireSRWLockExclusive(&m_srwLock);
- fExclusiveLock = TRUE;
- m_pApplicationHash->FindKey(&key, ppApplication);
-
- if (*ppApplication != NULL)
- {
- // someone else created the application
- delete pApplication;
- pApplication = NULL;
- goto Finished;
- }
-
- hr = pApplication->Initialize(this, pszApplicationId, pContext->GetApplication()->GetApplicationPhysicalPath());
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = m_pApplicationHash->InsertRecord( pApplication );
-
- if (FAILED(hr))
- {
- goto Finished;
- }
- ReleaseSRWLockExclusive(&m_srwLock);
- fExclusiveLock = FALSE;
-
- pApplication->StartMonitoringAppOffline();
-
- *ppApplication = pApplication;
- pApplication = NULL;
- }
-
-Finished:
-
- if (fExclusiveLock == TRUE)
- ReleaseSRWLockExclusive(&m_srwLock);
-
- if (FAILED(hr))
- {
- if (pApplication != NULL)
- {
- pApplication->DereferenceApplication();
- pApplication = NULL;
- }
- }
-
- return hr;
-}
-
-
-HRESULT
-APPLICATION_MANAGER::RecycleApplication(
- _In_ LPCWSTR pszApplication
-)
-{
- HRESULT hr = S_OK;
- APPLICATION_KEY key;
-
- hr = key.Initialize(pszApplication);
- if (FAILED(hr))
- {
- goto Finished;
- }
- AcquireSRWLockExclusive(&m_srwLock);
- m_pApplicationHash->DeleteKey(&key);
- ReleaseSRWLockExclusive(&m_srwLock);
-
-Finished:
-
- return hr;
-}
-
-HRESULT
-APPLICATION_MANAGER::Get502ErrorPage(
- _Out_ HTTP_DATA_CHUNK** ppErrorPage
-)
-{
- HRESULT hr = S_OK;
- BOOL fExclusiveLock = FALSE;
- HTTP_DATA_CHUNK *pHttp502ErrorPage = NULL;
-
- DBG_ASSERT(ppErrorPage != NULL);
-
- //on-demand create the error page
- if (m_pHttp502ErrorPage != NULL)
- {
- *ppErrorPage = m_pHttp502ErrorPage;
- }
- else
- {
- AcquireSRWLockExclusive(&m_srwLock);
- fExclusiveLock = TRUE;
- if (m_pHttp502ErrorPage != NULL)
- {
- *ppErrorPage = m_pHttp502ErrorPage;
- }
- else
- {
- size_t maxsize = 5000;
- pHttp502ErrorPage = new HTTP_DATA_CHUNK();
- if (pHttp502ErrorPage == NULL)
- {
- hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
- goto Finished;
- }
- pHttp502ErrorPage->DataChunkType = HttpDataChunkFromMemory;
- pHttp502ErrorPage->FromMemory.pBuffer = (PVOID)m_pstrErrorInfo;
-
- pHttp502ErrorPage->FromMemory.BufferLength = (ULONG)strnlen(m_pstrErrorInfo, maxsize); //(ULONG)(wcslen(m_pstrErrorInfo)); // *sizeof(WCHAR);
- if(m_pHttp502ErrorPage != NULL)
- {
- delete m_pHttp502ErrorPage;
- }
- m_pHttp502ErrorPage = pHttp502ErrorPage;
- *ppErrorPage = m_pHttp502ErrorPage;
- }
- }
-
-Finished:
- if (fExclusiveLock)
- {
- ReleaseSRWLockExclusive(&m_srwLock);
- }
-
- if (FAILED(hr))
- {
- if (pHttp502ErrorPage != NULL)
- {
- delete pHttp502ErrorPage;
- }
- }
-
- return hr;
-}
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx
deleted file mode 100644
index d8bcd8d777..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx
+++ /dev/null
@@ -1,416 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#include "precomp.hxx"
-
-ASPNETCORE_CONFIG::~ASPNETCORE_CONFIG()
-{
- //
- // the destructor will be called once IIS decides to recycle the module context (i.e., application)
- //
- if (!m_struApplication.IsEmpty())
- {
- APPLICATION_MANAGER::GetInstance()->RecycleApplication(m_struApplication.QueryStr());
- }
- if(m_pEnvironmentVariables != NULL)
- {
- m_pEnvironmentVariables->Clear();
- delete m_pEnvironmentVariables;
- m_pEnvironmentVariables = NULL;
- }
-}
-
-HRESULT
-ASPNETCORE_CONFIG::GetConfig(
- _In_ IHttpContext *pHttpContext,
- _Out_ ASPNETCORE_CONFIG **ppAspNetCoreConfig
-)
-{
- HRESULT hr = S_OK;
- IHttpApplication *pHttpApplication = pHttpContext->GetApplication();
- ASPNETCORE_CONFIG *pAspNetCoreConfig = NULL;
-
- if (ppAspNetCoreConfig == NULL)
- {
- hr = E_INVALIDARG;
- goto Finished;
- }
-
- *ppAspNetCoreConfig = NULL;
-
- // potential bug if user sepcific config at virtual dir level
- pAspNetCoreConfig = (ASPNETCORE_CONFIG*)
- pHttpApplication->GetModuleContextContainer()->GetModuleContext(g_pModuleId);
-
- if (pAspNetCoreConfig != NULL)
- {
- *ppAspNetCoreConfig = pAspNetCoreConfig;
- pAspNetCoreConfig = NULL;
- goto Finished;
- }
-
- pAspNetCoreConfig = new ASPNETCORE_CONFIG;
- if (pAspNetCoreConfig == NULL)
- {
- hr = E_OUTOFMEMORY;
- goto Finished;
- }
-
- hr = pAspNetCoreConfig->Populate(pHttpContext);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = pHttpApplication->GetModuleContextContainer()->
- SetModuleContext(pAspNetCoreConfig, g_pModuleId);
- if (FAILED(hr))
- {
- if (hr == HRESULT_FROM_WIN32(ERROR_ALREADY_ASSIGNED))
- {
- delete pAspNetCoreConfig;
-
- pAspNetCoreConfig = (ASPNETCORE_CONFIG*)pHttpApplication->
- GetModuleContextContainer()->
- GetModuleContext(g_pModuleId);
-
- _ASSERT(pAspNetCoreConfig != NULL);
-
- hr = S_OK;
- }
- else
- {
- goto Finished;
- }
- }
- else
- {
- // set appliction info here instead of inside Populate()
- // as the destructor will delete the backend process
- hr = pAspNetCoreConfig->QueryApplicationPath()->Copy(pHttpApplication->GetApplicationId());
- if (FAILED(hr))
- {
- goto Finished;
- }
- }
-
- *ppAspNetCoreConfig = pAspNetCoreConfig;
- pAspNetCoreConfig = NULL;
-
-Finished:
-
- if (pAspNetCoreConfig != NULL)
- {
- delete pAspNetCoreConfig;
- pAspNetCoreConfig = NULL;
- }
-
- return hr;
-}
-
-HRESULT
-ASPNETCORE_CONFIG::Populate(
- IHttpContext *pHttpContext
-)
-{
- HRESULT hr = S_OK;
- STACK_STRU(strSiteConfigPath, 256);
- STRU strEnvName;
- STRU strEnvValue;
- STRU strExpandedEnvValue;
- IAppHostAdminManager *pAdminManager = NULL;
- IAppHostElement *pAspNetCoreElement = NULL;
- IAppHostElement *pWindowsAuthenticationElement = NULL;
- IAppHostElement *pBasicAuthenticationElement = NULL;
- IAppHostElement *pAnonymousAuthenticationElement = NULL;
- IAppHostElement *pEnvVarList = NULL;
- IAppHostElement *pEnvVar = NULL;
- IAppHostElementCollection *pEnvVarCollection = NULL;
- ULONGLONG ullRawTimeSpan = 0;
- ENUM_INDEX index;
- ENVIRONMENT_VAR_ENTRY* pEntry = NULL;
-
- m_pEnvironmentVariables = new ENVIRONMENT_VAR_HASH();
- if (m_pEnvironmentVariables == NULL)
- {
- hr = E_OUTOFMEMORY;
- goto Finished;
- }
- if (FAILED(hr = m_pEnvironmentVariables->Initialize(37 /*prime*/)))
- {
- delete m_pEnvironmentVariables;
- m_pEnvironmentVariables = NULL;
- goto Finished;
- }
-
- pAdminManager = g_pHttpServer->GetAdminManager();
-
- hr = strSiteConfigPath.Copy(pHttpContext->GetApplication()->GetAppConfigPath());
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = pAdminManager->GetAdminSection(CS_WINDOWS_AUTHENTICATION_SECTION,
- strSiteConfigPath.QueryStr(),
- &pWindowsAuthenticationElement);
- if (FAILED(hr))
- {
- // assume the corresponding authen was not enabled
- // as the section may get deleted by user in some HWC case
- // ToDo: log a warning to event log
- m_fWindowsAuthEnabled = FALSE;
- }
- else
- {
- hr = GetElementBoolProperty(pWindowsAuthenticationElement,
- CS_AUTHENTICATION_ENABLED,
- &m_fWindowsAuthEnabled);
- if (FAILED(hr))
- {
- goto Finished;
- }
- }
-
- hr = pAdminManager->GetAdminSection(CS_BASIC_AUTHENTICATION_SECTION,
- strSiteConfigPath.QueryStr(),
- &pBasicAuthenticationElement);
- if (FAILED(hr))
- {
- m_fBasicAuthEnabled = FALSE;
- }
- else
- {
- hr = GetElementBoolProperty(pBasicAuthenticationElement,
- CS_AUTHENTICATION_ENABLED,
- &m_fBasicAuthEnabled);
- if (FAILED(hr))
- {
- goto Finished;
- }
- }
-
- hr = pAdminManager->GetAdminSection(CS_ANONYMOUS_AUTHENTICATION_SECTION,
- strSiteConfigPath.QueryStr(),
- &pAnonymousAuthenticationElement);
- if (FAILED(hr))
- {
- m_fAnonymousAuthEnabled = FALSE;
- }
- else
- {
- hr = GetElementBoolProperty(pAnonymousAuthenticationElement,
- CS_AUTHENTICATION_ENABLED,
- &m_fAnonymousAuthEnabled);
- if (FAILED(hr))
- {
- goto Finished;
- }
- }
-
- hr = pAdminManager->GetAdminSection(CS_ASPNETCORE_SECTION,
- strSiteConfigPath.QueryStr(),
- &pAspNetCoreElement);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = GetElementStringProperty(pAspNetCoreElement,
- CS_ASPNETCORE_PROCESS_EXE_PATH,
- &m_struProcessPath);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = GetElementStringProperty(pAspNetCoreElement,
- CS_ASPNETCORE_PROCESS_ARGUMENTS,
- &m_struArguments);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = GetElementDWORDProperty(pAspNetCoreElement,
- CS_ASPNETCORE_RAPID_FAILS_PER_MINUTE,
- &m_dwRapidFailsPerMinute);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- //
- // rapidFailsPerMinute cannot be greater than 100.
- //
- if (m_dwRapidFailsPerMinute > MAX_RAPID_FAILS_PER_MINUTE)
- {
- m_dwRapidFailsPerMinute = MAX_RAPID_FAILS_PER_MINUTE;
- }
-
- hr = GetElementDWORDProperty(pAspNetCoreElement,
- CS_ASPNETCORE_PROCESSES_PER_APPLICATION,
- &m_dwProcessesPerApplication);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = GetElementDWORDProperty(
- pAspNetCoreElement,
- CS_ASPNETCORE_PROCESS_STARTUP_TIME_LIMIT,
- &m_dwStartupTimeLimitInMS
- );
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- m_dwStartupTimeLimitInMS *= MILLISECONDS_IN_ONE_SECOND;
-
- hr = GetElementDWORDProperty(
- pAspNetCoreElement,
- CS_ASPNETCORE_PROCESS_SHUTDOWN_TIME_LIMIT,
- &m_dwShutdownTimeLimitInMS
- );
- if (FAILED(hr))
- {
- goto Finished;
- }
- m_dwShutdownTimeLimitInMS *= MILLISECONDS_IN_ONE_SECOND;
-
- hr = GetElementBoolProperty(pAspNetCoreElement,
- CS_ASPNETCORE_FORWARD_WINDOWS_AUTH_TOKEN,
- &m_fForwardWindowsAuthToken);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = GetElementBoolProperty(pAspNetCoreElement,
- CS_ASPNETCORE_DISABLE_START_UP_ERROR_PAGE,
- &m_fDisableStartUpErrorPage);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = GetElementRawTimeSpanProperty(
- pAspNetCoreElement,
- CS_ASPNETCORE_WINHTTP_REQUEST_TIMEOUT,
- &ullRawTimeSpan
- );
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- m_dwRequestTimeoutInMS = (DWORD)TIMESPAN_IN_MILLISECONDS(ullRawTimeSpan);
-
- hr = GetElementBoolProperty(pAspNetCoreElement,
- CS_ASPNETCORE_STDOUT_LOG_ENABLED,
- &m_fStdoutLogEnabled);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = GetElementStringProperty(pAspNetCoreElement,
- CS_ASPNETCORE_STDOUT_LOG_FILE,
- &m_struStdoutLogFile);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = GetElementChildByName(pAspNetCoreElement,
- CS_ASPNETCORE_ENVIRONMENT_VARIABLES,
- &pEnvVarList);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = pEnvVarList->get_Collection(&pEnvVarCollection);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- for (hr = FindFirstElement(pEnvVarCollection, &index, &pEnvVar);
- SUCCEEDED(hr);
- hr = FindNextElement(pEnvVarCollection, &index, &pEnvVar))
- {
- if (hr == S_FALSE)
- {
- hr = S_OK;
- break;
- }
-
- if (FAILED(hr = GetElementStringProperty(pEnvVar,
- CS_ASPNETCORE_ENVIRONMENT_VARIABLE_NAME,
- &strEnvName)) ||
- FAILED(hr = GetElementStringProperty(pEnvVar,
- CS_ASPNETCORE_ENVIRONMENT_VARIABLE_VALUE,
- &strEnvValue)) ||
- FAILED(hr = strEnvName.Append(L"=")) ||
- FAILED(hr = STRU::ExpandEnvironmentVariables(strEnvValue.QueryStr(), &strExpandedEnvValue)))
- {
- goto Finished;
- }
-
- pEntry = new ENVIRONMENT_VAR_ENTRY();
- if (pEntry == NULL)
- {
- hr = E_OUTOFMEMORY;
- goto Finished;
- }
-
- if (FAILED(hr = pEntry->Initialize(strEnvName.QueryStr(), strExpandedEnvValue.QueryStr())) ||
- FAILED(hr = m_pEnvironmentVariables->InsertRecord(pEntry)))
- {
- goto Finished;
- }
- strEnvName.Reset();
- strEnvValue.Reset();
- strExpandedEnvValue.Reset();
- pEnvVar->Release();
- pEnvVar = NULL;
- pEntry->Dereference();
- pEntry = NULL;
- }
-
-Finished:
-
- if (pAspNetCoreElement != NULL)
- {
- pAspNetCoreElement->Release();
- pAspNetCoreElement = NULL;
- }
-
- if (pEnvVarList != NULL)
- {
- pEnvVarList->Release();
- pEnvVarList = NULL;
- }
-
- if (pEnvVar != NULL)
- {
- pEnvVar->Release();
- pEnvVar = NULL;
- }
-
- if (pEnvVarCollection != NULL)
- {
- pEnvVarCollection->Release();
- pEnvVarCollection = NULL;
- }
-
- if (pEntry != NULL)
- {
- pEntry->Dereference();
- pEntry = NULL;
- }
-
- return hr;
-}
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx
deleted file mode 100644
index c3fd9f1882..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx
+++ /dev/null
@@ -1,481 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#include "precomp.hxx"
-
-FILE_WATCHER::FILE_WATCHER() :
- m_hCompletionPort(NULL),
- m_hChangeNotificationThread(NULL)
-{
-}
-
-FILE_WATCHER::~FILE_WATCHER()
-{
- if (m_hChangeNotificationThread != NULL)
- {
- CloseHandle(m_hChangeNotificationThread);
- m_hChangeNotificationThread = NULL;
- }
-}
-
-HRESULT
-FILE_WATCHER::Create(
- VOID
-)
-{
- HRESULT hr = S_OK;
-
- m_hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,
- NULL,
- 0,
- 0);
-
- if (m_hCompletionPort == NULL)
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
- m_hChangeNotificationThread = CreateThread(NULL,
- 0,
- (LPTHREAD_START_ROUTINE)ChangeNotificationThread,
- this,
- 0,
- NULL);
-
- if (m_hChangeNotificationThread == NULL)
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
-
- CloseHandle(m_hCompletionPort);
- m_hCompletionPort = NULL;
-
- goto Finished;
- }
-
-Finished:
- return hr;
-}
-
-DWORD
-WINAPI
-FILE_WATCHER::ChangeNotificationThread(
- LPVOID pvArg
-)
-/*++
-
-Routine Description:
-
-IO completion thread
-
-Arguments:
-
-None
-
-Return Value:
-
-Win32 error
-
---*/
-{
- FILE_WATCHER * pFileMonitor;
- BOOL fSuccess = FALSE;
- DWORD cbCompletion = 0;
- OVERLAPPED * pOverlapped = NULL;
- DWORD dwErrorStatus;
- ULONG_PTR completionKey;
-
- pFileMonitor = (FILE_WATCHER*)pvArg;
- DBG_ASSERT(pFileMonitor != NULL);
-
- while (TRUE)
- {
- fSuccess = GetQueuedCompletionStatus(
- pFileMonitor->m_hCompletionPort,
- &cbCompletion,
- &completionKey,
- &pOverlapped,
- INFINITE);
-
- DBG_ASSERT(fSuccess);
- DebugPrint(1, "FILE_WATCHER::ChangeNotificationThread");
- dwErrorStatus = fSuccess ? ERROR_SUCCESS : GetLastError();
-
- if (completionKey == FILE_WATCHER_SHUTDOWN_KEY)
- {
- continue;
- }
-
- DBG_ASSERT(pOverlapped != NULL);
- if (pOverlapped != NULL)
- {
- FileWatcherCompletionRoutine(
- dwErrorStatus,
- cbCompletion,
- pOverlapped);
- }
- pOverlapped = NULL;
- cbCompletion = 0;
- }
-}
-
-VOID
-WINAPI
-FILE_WATCHER::FileWatcherCompletionRoutine(
- DWORD dwCompletionStatus,
- DWORD cbCompletion,
- OVERLAPPED * pOverlapped
-)
-/*++
-
-Routine Description:
-
-Called when ReadDirectoryChangesW() completes
-
-Arguments:
-
-dwCompletionStatus - Error of completion
-cbCompletion - Bytes of completion
-pOverlapped - State of completion
-
-Return Value:
-
-None
-
---*/
-{
- FILE_WATCHER_ENTRY * pMonitorEntry;
- pMonitorEntry = CONTAINING_RECORD(pOverlapped, FILE_WATCHER_ENTRY, _overlapped);
- pMonitorEntry->DereferenceFileWatcherEntry();
- DBG_ASSERT(pMonitorEntry != NULL);
-
- pMonitorEntry->HandleChangeCompletion(dwCompletionStatus, cbCompletion);
-
- if (pMonitorEntry->QueryIsValid())
- {
- //
- // Continue monitoring
- //
- pMonitorEntry->Monitor();
- }
- else
- {
- //
- // Marked by application distructor
- // Deference the entry to delete it
- //
- pMonitorEntry->DereferenceFileWatcherEntry();
- }
-}
-
-
-FILE_WATCHER_ENTRY::FILE_WATCHER_ENTRY(FILE_WATCHER * pFileMonitor) :
- _pFileMonitor(pFileMonitor),
- _hDirectory(INVALID_HANDLE_VALUE),
- _hImpersonationToken(NULL),
- _pApplication(NULL),
- _lStopMonitorCalled(0),
- _cRefs(1),
- _fIsValid(TRUE)
-{
- _dwSignature = FILE_WATCHER_ENTRY_SIGNATURE;
- InitializeSRWLock(&_srwLock);
-}
-
-FILE_WATCHER_ENTRY::~FILE_WATCHER_ENTRY()
-{
- _dwSignature = FILE_WATCHER_ENTRY_SIGNATURE_FREE;
-
- if (_hDirectory != INVALID_HANDLE_VALUE)
- {
- CloseHandle(_hDirectory);
- _hDirectory = INVALID_HANDLE_VALUE;
- }
-
- if (_hImpersonationToken != NULL)
- {
- CloseHandle(_hImpersonationToken);
- _hImpersonationToken = NULL;
- }
-}
-
-#pragma warning(disable:4100)
-
-HRESULT
-FILE_WATCHER_ENTRY::HandleChangeCompletion(
- _In_ DWORD dwCompletionStatus,
- _In_ DWORD cbCompletion
-)
-/*++
-
-Routine Description:
-
-Handle change notification (see if any of associated config files
-need to be flushed)
-
-Arguments:
-
-dwCompletionStatus - Completion status
-cbCompletion - Bytes of completion
-
-Return Value:
-
-HRESULT
-
---*/
-{
- HRESULT hr = S_OK;
- FILE_NOTIFY_INFORMATION * pNotificationInfo;
- BOOL fFileChanged = FALSE;
- STRU strEventMsg;
-
- AcquireSRWLockExclusive(&_srwLock);
- if (!_fIsValid)
- {
- goto Finished;
- }
-
- // When directory handle is closed then HandleChangeCompletion
- // happens with cbCompletion = 0 and dwCompletionStatus = 0
- // From documentation it is not clear if that combination
- // of return values is specific to closing handles or whether
- // it could also mean an error condition. Hence we will maintain
- // explicit flag that will help us determine if entry
- // is being shutdown (StopMonitor() called)
- //
- if (_lStopMonitorCalled)
- {
- goto Finished;
- }
-
- //
- // There could be a FCN overflow
- // Let assume the file got changed instead of checking files
- // Othersie we have to cache the file info
- //
- if (cbCompletion == 0)
- {
- fFileChanged = TRUE;
- }
- else
- {
- pNotificationInfo = (FILE_NOTIFY_INFORMATION*)_buffDirectoryChanges.QueryPtr();
- DBG_ASSERT(pNotificationInfo != NULL);
-
- while (pNotificationInfo != NULL)
- {
- //
- // check whether the monitored file got changed
- //
- if (_wcsnicmp(pNotificationInfo->FileName,
- _strFileName.QueryStr(),
- pNotificationInfo->FileNameLength/sizeof(WCHAR)) == 0)
- {
- fFileChanged = TRUE;
- break;
- }
- //
- // Advance to next notification
- //
- if (pNotificationInfo->NextEntryOffset == 0)
- {
- pNotificationInfo = NULL;
- }
- else
- {
- pNotificationInfo = (FILE_NOTIFY_INFORMATION*)
- ((PBYTE)pNotificationInfo +
- pNotificationInfo->NextEntryOffset);
- }
- }
- }
-
- if (fFileChanged)
- {
- LPCWSTR apsz[1];
- if (SUCCEEDED(strEventMsg.SafeSnwprintf(
- ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_MSG,
- _strFileName.QueryStr())))
- {
- apsz[0] = strEventMsg.QueryStr();
-
- //
- // not checking return code because if ReportEvent
- // fails, we cannot do anything.
- //
- if (FORWARDING_HANDLER::QueryEventLog() != NULL)
- {
- ReportEventW(FORWARDING_HANDLER::QueryEventLog(),
- EVENTLOG_INFORMATION_TYPE,
- 0,
- ASPNETCORE_EVENT_RECYCLE_APPOFFLINE,
- NULL,
- 1,
- 0,
- apsz,
- NULL);
- }
- }
- //
- // so far we only monitoring app_offline
- //
- _pApplication->UpdateAppOfflineFileHandle();
- }
-
-Finished:
- ReleaseSRWLockExclusive(&_srwLock);
- return hr;
-}
-
-#pragma warning( error : 4100 )
-
-HRESULT
-FILE_WATCHER_ENTRY::Monitor(VOID)
-{
- HRESULT hr = S_OK;
- DWORD cbRead;
-
- AcquireSRWLockExclusive(&_srwLock);
- ReferenceFileWatcherEntry();
- ZeroMemory(&_overlapped, sizeof(_overlapped));
-
- if(!ReadDirectoryChangesW(_hDirectory,
- _buffDirectoryChanges.QueryPtr(),
- _buffDirectoryChanges.QuerySize(),
- FALSE, // Watching sub dirs. Set to False now as only monitoring app_offline
- FILE_NOTIFY_VALID_MASK & ~FILE_NOTIFY_CHANGE_LAST_ACCESS,
- &cbRead,
- &_overlapped,
- NULL))
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- }
-
- ReleaseSRWLockExclusive(&_srwLock);
- return hr;
-}
-
-VOID
-FILE_WATCHER_ENTRY::StopMonitor(VOID)
-{
- //
- // Flag that monitoring is being stopped so that
- // we know that HandleChangeCompletion() call
- // can be ignored
- //
- InterlockedExchange(&_lStopMonitorCalled, 1);
-
- AcquireSRWLockExclusive(&_srwLock);
-
- if (_hDirectory != INVALID_HANDLE_VALUE)
- {
- CloseHandle(_hDirectory);
- _hDirectory = INVALID_HANDLE_VALUE;
- }
-
- ReleaseSRWLockExclusive(&_srwLock);
-}
-
-HRESULT
-FILE_WATCHER_ENTRY::Create(
- _In_ PCWSTR pszDirectoryToMonitor,
- _In_ PCWSTR pszFileNameToMonitor,
- _In_ APPLICATION* pApplication,
- _In_ HANDLE hImpersonationToken
-)
-{
- HRESULT hr = S_OK;
- BOOL fRet = FALSE;
-
- if (pszDirectoryToMonitor == NULL ||
- pszFileNameToMonitor == NULL ||
- pApplication == NULL)
- {
- DBG_ASSERT(FALSE);
- hr = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
- goto Finished;
- }
-
- //
- //remember the application
- //
- _pApplication = pApplication;
-
- if (FAILED(hr = _strFileName.Copy(pszFileNameToMonitor)))
- {
- goto Finished;
- }
-
- if (FAILED(hr = _strDirectoryName.Copy(pszDirectoryToMonitor)))
- {
- goto Finished;
- }
-
- //
- // Resize change buffer to something "reasonable"
- //
- if (!_buffDirectoryChanges.Resize(FILE_WATCHER_ENTRY_BUFFER_SIZE))
- {
- hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
- goto Finished;
- }
-
- if (hImpersonationToken != NULL)
- {
- fRet = DuplicateHandle(GetCurrentProcess(),
- hImpersonationToken,
- GetCurrentProcess(),
- &_hImpersonationToken,
- 0,
- FALSE,
- DUPLICATE_SAME_ACCESS);
-
- if (!fRet)
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
- }
- else
- {
- if (_hImpersonationToken != NULL)
- {
- CloseHandle(_hImpersonationToken);
- _hImpersonationToken = NULL;
- }
- }
-
- _hDirectory = CreateFileW(
- _strDirectoryName.QueryStr(),
- FILE_LIST_DIRECTORY,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- NULL,
- OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
- NULL);
-
- if (_hDirectory == INVALID_HANDLE_VALUE)
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
- if (CreateIoCompletionPort(
- _hDirectory,
- _pFileMonitor->QueryCompletionPort(),
- NULL,
- 0) == NULL)
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
- //
- // Start monitoring
- //
- hr = Monitor();
-
-Finished:
-
- return hr;
-}
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx
deleted file mode 100644
index ed1e29aadd..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#include "precomp.hxx"
-
-FORWARDER_CONNECTION::FORWARDER_CONNECTION(
- VOID
-) : m_cRefs (1),
- m_hConnection (NULL)
-{
-}
-
-HRESULT
-FORWARDER_CONNECTION::Initialize(
- DWORD dwPort
-)
-{
- HRESULT hr = S_OK;
-
- hr = m_ConnectionKey.Initialize( dwPort );
- if ( FAILED( hr ) )
- {
- goto Finished;
- }
-
- m_hConnection = WinHttpConnect(FORWARDING_HANDLER::sm_hSession,
- L"127.0.0.1",
- (USHORT) dwPort,
- 0);
- if (m_hConnection == NULL)
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
- //
- // Since WinHttp will not emit WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING
- // when closing WebSocket handle on Win8. Register callback at Connect level as a workaround
- //
- if (WinHttpSetStatusCallback(m_hConnection,
- FORWARDING_HANDLER::OnWinHttpCompletion,
- WINHTTP_CALLBACK_FLAG_HANDLES,
- NULL) == WINHTTP_INVALID_STATUS_CALLBACK)
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
-Finished:
-
- return hr;
-}
\ No newline at end of file
diff --git a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx b/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx
deleted file mode 100644
index 1665539f18..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx
+++ /dev/null
@@ -1,3079 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#include "precomp.hxx"
-#include
-
-// Just to be aware of the FORWARDING_HANDLER object size.
-C_ASSERT(sizeof(FORWARDING_HANDLER) <= 632);
-
-#define DEF_MAX_FORWARDS 32
-#define HEX_TO_ASCII(c) ((CHAR)(((c) < 10) ? ((c) + '0') : ((c) + 'a' - 10)))
-
-#define BUFFER_SIZE (8192UL)
-#define ENTITY_BUFFER_SIZE (6 + BUFFER_SIZE + 2)
-#define STR_ANCM_CHILDREQUEST "ANCM_WasCreateProcessFailure"
-
-HINTERNET FORWARDING_HANDLER::sm_hSession = NULL;
-STRU FORWARDING_HANDLER::sm_strErrorFormat;
-HANDLE FORWARDING_HANDLER::sm_hEventLog = NULL;
-ALLOC_CACHE_HANDLER * FORWARDING_HANDLER::sm_pAlloc = NULL;
-TRACE_LOG * FORWARDING_HANDLER::sm_pTraceLog = NULL;
-PROTOCOL_CONFIG FORWARDING_HANDLER::sm_ProtocolConfig;
-
-FORWARDING_HANDLER::FORWARDING_HANDLER(
- __in IHttpContext * pW3Context
-) : m_Signature(FORWARDING_HANDLER_SIGNATURE),
-m_cRefs(1),
-m_dwHandlers(1),
-m_pW3Context(pW3Context),
-m_hRequest(NULL),
-m_fResponseHeadersReceivedAndSet(FALSE),
-m_fDoReverseRewriteHeaders(FALSE),
-m_msStartTime(0),
-m_BytesToReceive(0),
-m_BytesToSend(0),
-m_pEntityBuffer(NULL),
-m_cchLastSend(0),
-m_cEntityBuffers(0),
-m_cBytesBuffered(0),
-m_cMinBufferLimit(0),
-m_pszOriginalHostHeader(NULL),
-m_RequestStatus(FORWARDER_START),
-m_pDisconnect(NULL),
-m_pszHeaders(NULL),
-m_cchHeaders(0),
-m_fWebSocketEnabled(FALSE),
-m_cContentLength(0),
-m_pWebSocket(NULL),
-m_pApplication(NULL),
-m_pAppOfflineHtm(NULL),
-m_fFinishRequest(FALSE),
-m_fClientDisconnected(FALSE),
-m_fHasError(FALSE),
-m_fServerResetConn(FALSE),
-m_fDoneAsyncCompletion(FALSE),
-m_fHttpHandleInClose(FALSE),
-m_fWebSocketHandleInClose(FALSE)
-{
- DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO,
- "FORWARDING_HANDLER --%p\n", this);
-
- InitializeSRWLock(&m_RequestLock);
-}
-
-FORWARDING_HANDLER::~FORWARDING_HANDLER(
- VOID
-)
-{
- //
- // Destructor has started.
- //
- DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO,
- "~FORWARDING_HANDLER --%p\n", this);
-
- m_Signature = FORWARDING_HANDLER_SIGNATURE_FREE;
-
- //
- // Disconnect notification cleanup would happen first, before
- // the FORWARDING_HANDLER instance got removed from m_pSharedhandler list.
- // The m_pServer cleanup would happen afterwards, since there may be a
- // call pending from SHARED_HANDLER to FORWARDING_HANDLER::SetStatusAndHeaders()
- //
- DBG_ASSERT(m_pDisconnect == NULL);
-
- FreeResponseBuffers();
-
- if (m_hRequest != NULL)
- {
- // m_hRequest should have already been closed and set to NULL
- // if not, we cannot close it as it may callback and cause AV
- // let's do our best job here
- WinHttpSetStatusCallback(m_hRequest,
- NULL, // Callback Function
- WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS,
- NULL);
- WinHttpCloseHandle(m_hRequest);
- m_hRequest = NULL;
- }
-
- if(m_pApplication != NULL)
- {
- m_pApplication->DereferenceApplication();
- m_pApplication = NULL;
- }
-
- if(m_pAppOfflineHtm != NULL)
- {
- m_pAppOfflineHtm->DereferenceAppOfflineHtm();
- m_pAppOfflineHtm = NULL;
- }
-
- m_pW3Context = NULL;
-}
-
-// static
-void * FORWARDING_HANDLER::operator new(size_t)
-{
- DBG_ASSERT(sm_pAlloc != NULL);
- if (sm_pAlloc == NULL)
- {
- return NULL;
- }
- return sm_pAlloc->Alloc();
-}
-
-// static
-void FORWARDING_HANDLER::operator delete(void * pMemory)
-{
- DBG_ASSERT(sm_pAlloc != NULL);
- if (sm_pAlloc != NULL)
- {
- sm_pAlloc->Free(pMemory);
- }
-}
-
-VOID
-FORWARDING_HANDLER::ReferenceForwardingHandler(
- VOID
-) const
-{
- LONG cRefs = InterlockedIncrement(&m_cRefs);
- if (sm_pTraceLog != NULL)
- {
- WriteRefTraceLog(sm_pTraceLog,
- cRefs,
- this);
- }
-}
-
-VOID
-FORWARDING_HANDLER::DereferenceForwardingHandler(
- VOID
-) const
-{
- DBG_ASSERT(m_cRefs != 0);
-
- LONG cRefs = InterlockedDecrement(&m_cRefs);
- if (cRefs == 0)
- {
- delete this;
- }
-
- if (sm_pTraceLog != NULL)
- {
- WriteRefTraceLog(sm_pTraceLog,
- cRefs,
- this);
- }
-}
-
-HRESULT
-FORWARDING_HANDLER::SetStatusAndHeaders(
- PCSTR pszHeaders,
- DWORD
-)
-{
- HRESULT hr;
- IHttpResponse * pResponse = m_pW3Context->GetResponse();
- IHttpRequest * pRequest = m_pW3Context->GetRequest();
- STACK_STRA(strHeaderName, 128);
- STACK_STRA(strHeaderValue, 2048);
- DWORD index = 0;
- PSTR pchNewline;
- PCSTR pchEndofHeaderValue;
- BOOL fServerHeaderPresent = FALSE;
-
- _ASSERT(pszHeaders != NULL);
-
- //
- // The first line is the status line
- //
- PSTR pchStatus = const_cast(strchr(pszHeaders, ' '));
- if (pchStatus == NULL)
- {
- return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
- }
- while (*pchStatus == ' ')
- {
- pchStatus++;
- }
- USHORT uStatus = static_cast(atoi(pchStatus));
-
- if (m_fWebSocketEnabled && uStatus != 101)
- {
- //
- // Expected 101 response.
- //
-
- m_fWebSocketEnabled = FALSE;
- }
-
- pchStatus = strchr(pchStatus, ' ');
- if (pchStatus == NULL)
- {
- return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
- }
- while (*pchStatus == ' ')
- {
- pchStatus++;
- }
- if (*pchStatus == '\r' || *pchStatus == '\n')
- {
- pchStatus--;
- }
-
- pchNewline = strchr(pchStatus, '\n');
- if (pchNewline == NULL)
- {
- return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
- }
-
- if (uStatus != 200)
- {
- //
- // Skip over any spaces before the '\n'
- //
- for (pchEndofHeaderValue = pchNewline - 1;
- (pchEndofHeaderValue > pchStatus) &&
- ((*pchEndofHeaderValue == ' ') ||
- (*pchEndofHeaderValue == '\r'));
- pchEndofHeaderValue--)
- {}
-
- //
- // Copy the status description
- //
- if (FAILED(hr = strHeaderValue.Copy(
- pchStatus,
- (DWORD)(pchEndofHeaderValue - pchStatus) + 1)) ||
- FAILED(hr = pResponse->SetStatus(uStatus,
- strHeaderValue.QueryStr(),
- 0,
- S_OK,
- NULL,
- TRUE)))
- {
- return hr;
- }
- }
-
- for (index = static_cast(pchNewline - pszHeaders) + 1;
- pszHeaders[index] != '\r' && pszHeaders[index] != '\n' && pszHeaders[index] != '\0';
- index = static_cast(pchNewline - pszHeaders) + 1)
- {
- //
- // Find the ':' in Header : Value\r\n
- //
- PCSTR pchColon = strchr(pszHeaders + index, ':');
-
- //
- // Find the '\n' in Header : Value\r\n
- //
- pchNewline = const_cast(strchr(pszHeaders + index, '\n'));
-
- if (pchNewline == NULL)
- {
- return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
- }
-
- //
- // Take care of header continuation
- //
- while (pchNewline[1] == ' ' ||
- pchNewline[1] == '\t')
- {
- pchNewline = strchr(pchNewline + 1, '\n');
- }
-
- DBG_ASSERT(
- (pchColon != NULL) && (pchColon < pchNewline));
- if ((pchColon == NULL) || (pchColon >= pchNewline))
- {
- return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
- }
-
- //
- // Skip over any spaces before the ':'
- //
- PCSTR pchEndofHeaderName;
- for (pchEndofHeaderName = pchColon - 1;
- (pchEndofHeaderName >= pszHeaders + index) &&
- (*pchEndofHeaderName == ' ');
- pchEndofHeaderName--)
- {}
-
- pchEndofHeaderName++;
-
- //
- // Copy the header name
- //
- if (FAILED(hr = strHeaderName.Copy(
- pszHeaders + index,
- (DWORD)(pchEndofHeaderName - pszHeaders) - index)))
- {
- return hr;
- }
-
- //
- // Skip over the ':' and any trailing spaces
- //
- for (index = static_cast(pchColon - pszHeaders) + 1;
- pszHeaders[index] == ' ';
- index++)
- {}
-
-
- //
- // Skip over any spaces before the '\n'
- //
- for (pchEndofHeaderValue = pchNewline - 1;
- (pchEndofHeaderValue >= pszHeaders + index) &&
- ((*pchEndofHeaderValue == ' ') ||
- (*pchEndofHeaderValue == '\r'));
- pchEndofHeaderValue--)
- {}
-
- pchEndofHeaderValue++;
-
- //
- // Copy the header value
- //
- if (pchEndofHeaderValue == pszHeaders + index)
- {
- strHeaderValue.Reset();
- }
- else if (FAILED(hr = strHeaderValue.Copy(
- pszHeaders + index,
- (DWORD)(pchEndofHeaderValue - pszHeaders) - index)))
- {
- return hr;
- }
-
- //
- // Do not pass the transfer-encoding:chunked, Connection, Date or
- // Server headers along
- //
- DWORD headerIndex = g_pResponseHeaderHash->GetIndex(strHeaderName.QueryStr());
- if (headerIndex == UNKNOWN_INDEX)
- {
- hr = pResponse->SetHeader(strHeaderName.QueryStr(),
- strHeaderValue.QueryStr(),
- static_cast(strHeaderValue.QueryCCH()),
- FALSE); // fReplace
- }
- else
- {
- switch (headerIndex)
- {
- case HttpHeaderTransferEncoding:
- if (!strHeaderValue.Equals("chunked", TRUE))
- {
- break;
- }
- __fallthrough;
- case HttpHeaderConnection:
- case HttpHeaderDate:
- continue;
-
- case HttpHeaderServer:
- fServerHeaderPresent = TRUE;
- break;
-
- case HttpHeaderContentLength:
- if (pRequest->GetRawHttpRequest()->Verb != HttpVerbHEAD)
- {
- m_cContentLength = _atoi64(strHeaderValue.QueryStr());
- }
- break;
- }
-
- hr = pResponse->SetHeader(static_cast(headerIndex),
- strHeaderValue.QueryStr(),
- static_cast(strHeaderValue.QueryCCH()),
- TRUE); // fReplace
- }
- if (FAILED(hr))
- {
- return hr;
- }
- }
-
- //
- // Explicitly remove the Server header if the back-end didn't set one.
- //
-
- if (!fServerHeaderPresent)
- {
- pResponse->DeleteHeader("Server");
- }
-
- if (m_fDoReverseRewriteHeaders)
- {
- hr = DoReverseRewrite(pResponse);
- if (FAILED(hr))
- {
- return hr;
- }
- }
-
- m_fResponseHeadersReceivedAndSet = TRUE;
-
- return S_OK;
-}
-
-HRESULT
-FORWARDING_HANDLER::DoReverseRewrite(
- __in IHttpResponse *pResponse
-)
-{
- DBG_ASSERT(pResponse == m_pW3Context->GetResponse());
- BOOL fSecure = (m_pW3Context->GetRequest()->GetRawHttpRequest()->pSslInfo != NULL);
- STRA strTemp;
- PCSTR pszHeader;
- PCSTR pszStartHost;
- PCSTR pszEndHost;
- HTTP_RESPONSE_HEADERS *pHeaders;
- HRESULT hr;
-
- //
- // Content-Location and Location are easy, one known header in
- // http[s]://host/url format
- //
- pszHeader = pResponse->GetHeader(HttpHeaderContentLocation);
- if (pszHeader != NULL)
- {
- if (_strnicmp(pszHeader, "http://", 7) == 0)
- {
- pszStartHost = pszHeader + 7;
- }
- else if (_strnicmp(pszHeader, "https://", 8) == 0)
- {
- pszStartHost = pszHeader + 8;
- }
- else
- {
- goto Location;
- }
-
- pszEndHost = strchr(pszStartHost, '/');
-
- if (FAILED(hr = strTemp.Copy(fSecure ? "https://" : "http://")) ||
- FAILED(hr = strTemp.Append(m_pszOriginalHostHeader)))
- {
- return hr;
- }
- if (pszEndHost != NULL &&
- FAILED(hr = strTemp.Append(pszEndHost)))
- {
- return hr;
- }
- if (FAILED(hr = pResponse->SetHeader(HttpHeaderContentLocation,
- strTemp.QueryStr(),
- static_cast(strTemp.QueryCCH()),
- TRUE)))
- {
- return hr;
- }
- }
-
-Location:
-
- pszHeader = pResponse->GetHeader(HttpHeaderLocation);
- if (pszHeader != NULL)
- {
- if (_strnicmp(pszHeader, "http://", 7) == 0)
- {
- pszStartHost = pszHeader + 7;
- }
- else if (_strnicmp(pszHeader, "https://", 8) == 0)
- {
- pszStartHost = pszHeader + 8;
- }
- else
- {
- goto SetCookie;
- }
-
- pszEndHost = strchr(pszStartHost, '/');
-
- if (FAILED(hr = strTemp.Copy(fSecure ? "https://" : "http://")) ||
- FAILED(hr = strTemp.Append(m_pszOriginalHostHeader)))
- {
- return hr;
- }
- if (pszEndHost != NULL &&
- FAILED(hr = strTemp.Append(pszEndHost)))
- {
- return hr;
- }
- if (FAILED(hr = pResponse->SetHeader(HttpHeaderLocation,
- strTemp.QueryStr(),
- static_cast(strTemp.QueryCCH()),
- TRUE)))
- {
- return hr;
- }
- }
-
-SetCookie:
-
- //
- // Set-Cookie is different - possibly multiple unknown headers with
- // syntax name=value ; ... ; Domain=.host ; ...
- //
- pHeaders = &pResponse->GetRawHttpResponse()->Headers;
- for (DWORD i = 0; iUnknownHeaderCount; i++)
- {
- if (_stricmp(pHeaders->pUnknownHeaders[i].pName, "Set-Cookie") != 0)
- {
- continue;
- }
-
- pszHeader = pHeaders->pUnknownHeaders[i].pRawValue;
- pszStartHost = strchr(pszHeader, ';');
- while (pszStartHost != NULL)
- {
- pszStartHost++;
- while (IsSpace(*pszStartHost))
- {
- pszStartHost++;
- }
-
- if (_strnicmp(pszStartHost, "Domain", 6) != 0)
- {
- pszStartHost = strchr(pszStartHost, ';');
- continue;
- }
- pszStartHost += 6;
-
- while (IsSpace(*pszStartHost))
- {
- pszStartHost++;
- }
- if (*pszStartHost != '=')
- {
- break;
- }
- pszStartHost++;
- while (IsSpace(*pszStartHost))
- {
- pszStartHost++;
- }
- if (*pszStartHost == '.')
- {
- pszStartHost++;
- }
- pszEndHost = pszStartHost;
- while (!IsSpace(*pszEndHost) &&
- *pszEndHost != ';' &&
- *pszEndHost != '\0')
- {
- pszEndHost++;
- }
-
- if (FAILED(hr = strTemp.Copy(pszHeader, static_cast(pszStartHost - pszHeader))) ||
- FAILED(hr = strTemp.Append(m_pszOriginalHostHeader)) ||
- FAILED(hr = strTemp.Append(pszEndHost)))
- {
- return hr;
- }
-
- pszHeader = (PCSTR)m_pW3Context->AllocateRequestMemory(strTemp.QueryCCH() + 1);
- if (pszHeader == NULL)
- {
- return E_OUTOFMEMORY;
- }
- StringCchCopyA(const_cast(pszHeader), strTemp.QueryCCH() + 1, strTemp.QueryStr());
- pHeaders->pUnknownHeaders[i].pRawValue = pszHeader;
- pHeaders->pUnknownHeaders[i].RawValueLength = static_cast(strTemp.QueryCCH());
-
- break;
- }
- }
-
- return S_OK;
-}
-
-HRESULT
-FORWARDING_HANDLER::GetHeaders(
- const PROTOCOL_CONFIG * pProtocol,
- PCWSTR * ppszHeaders,
- DWORD * pcchHeaders,
- ASPNETCORE_CONFIG* pAspNetCoreConfig,
- SERVER_PROCESS* pServerProcess
-)
-{
-
- HRESULT hr = S_OK;
- PCSTR pszCurrentHeader;
- PCSTR ppHeadersToBeRemoved;
- PCSTR pszFinalHeader;
- USHORT cchCurrentHeader;
- DWORD cchFinalHeader;
- BOOL fSecure = FALSE; // dummy. Used in SplitUrl. Value will not be used
- // as ANCM always use http protocol to communicate with backend
- STRU struDestination;
- STRU struUrl;
- STACK_STRA(strTemp, 64);
- HTTP_REQUEST_HEADERS *pHeaders;
- IHttpRequest *pRequest = m_pW3Context->GetRequest();
- MULTISZA mszMsAspNetCoreHeaders;
-
- //
- // We historically set the host section in request url to the new host header
- // this is wrong but Kestrel has dependency on it.
- // should change it in the future
- //
- if (!pProtocol->QueryPreserveHostHeader())
- {
- if (FAILED(hr = PATH::SplitUrl(pRequest->GetRawHttpRequest()->CookedUrl.pFullUrl,
- &fSecure,
- &struDestination,
- &struUrl)) ||
- FAILED(hr = strTemp.CopyW(struDestination.QueryStr())) ||
- FAILED(hr = pRequest->SetHeader(HttpHeaderHost,
- strTemp.QueryStr(),
- static_cast(strTemp.QueryCCH()),
- TRUE))) // fReplace
- {
- return hr;
- }
- }
- //
- // Strip all headers starting with MS-ASPNETCORE.
- // These headers are generated by the asp.net core module and
- // passed to the process it creates.
- //
-
- pHeaders = &m_pW3Context->GetRequest()->GetRawHttpRequest()->Headers;
- for (DWORD i = 0; iUnknownHeaderCount; i++)
- {
- if (_strnicmp(pHeaders->pUnknownHeaders[i].pName, "MS-ASPNETCORE", 13) == 0)
- {
- mszMsAspNetCoreHeaders.Append(pHeaders->pUnknownHeaders[i].pName, (DWORD)pHeaders->pUnknownHeaders[i].NameLength);
- }
- }
-
- ppHeadersToBeRemoved = mszMsAspNetCoreHeaders.First();
-
- //
- // iterate the list of headers to be removed and delete them from the request.
- //
-
- while (ppHeadersToBeRemoved != NULL)
- {
- m_pW3Context->GetRequest()->DeleteHeader(ppHeadersToBeRemoved);
- ppHeadersToBeRemoved = mszMsAspNetCoreHeaders.Next(ppHeadersToBeRemoved);
- }
-
- if (pServerProcess->QueryGuid() != NULL)
- {
- hr = m_pW3Context->GetRequest()->SetHeader("MS-ASPNETCORE-TOKEN",
- pServerProcess->QueryGuid(),
- (USHORT)strlen(pServerProcess->QueryGuid()),
- TRUE);
- if (FAILED(hr))
- {
- return hr;
- }
- }
-
- if (pAspNetCoreConfig->QueryForwardWindowsAuthToken() &&
- (_wcsicmp(m_pW3Context->GetUser()->GetAuthenticationType(), L"negotiate") == 0 ||
- _wcsicmp(m_pW3Context->GetUser()->GetAuthenticationType(), L"ntlm") == 0))
- {
- if (m_pW3Context->GetUser()->GetPrimaryToken() != NULL &&
- m_pW3Context->GetUser()->GetPrimaryToken() != INVALID_HANDLE_VALUE)
- {
- HANDLE hTargetTokenHandle = NULL;
- hr = pServerProcess->SetWindowsAuthToken(m_pW3Context->GetUser()->GetPrimaryToken(),
- &hTargetTokenHandle);
- if (FAILED(hr))
- {
- return hr;
- }
-
- //
- // set request header with target token value
- //
- CHAR pszHandleStr[16] = { 0 };
- if (_ui64toa_s((UINT64)hTargetTokenHandle, pszHandleStr, 16, 16) != 0)
- {
- hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
- return hr;
- }
-
- hr = m_pW3Context->GetRequest()->SetHeader("MS-ASPNETCORE-WINAUTHTOKEN",
- pszHandleStr,
- (USHORT)strlen(pszHandleStr),
- TRUE);
- if (FAILED(hr))
- {
- return hr;
- }
- }
- }
-
- if (!pProtocol->QueryXForwardedForName()->IsEmpty())
- {
- strTemp.Reset();
-
- pszCurrentHeader = pRequest->GetHeader(pProtocol->QueryXForwardedForName()->QueryStr(), &cchCurrentHeader);
- if (pszCurrentHeader != NULL)
- {
- if (FAILED(hr = strTemp.Copy(pszCurrentHeader, cchCurrentHeader)) ||
- FAILED(hr = strTemp.Append(", ", 2)))
- {
- return hr;
- }
- }
-
- if (FAILED(hr = m_pW3Context->GetServerVariable("REMOTE_ADDR",
- &pszFinalHeader,
- &cchFinalHeader)))
- {
- return hr;
- }
-
- if (pRequest->GetRawHttpRequest()->Address.pRemoteAddress->sa_family == AF_INET6)
- {
- if (FAILED(hr = strTemp.Append("[", 1)) ||
- FAILED(hr = strTemp.Append(pszFinalHeader, cchFinalHeader)) ||
- FAILED(hr = strTemp.Append("]", 1)))
- {
- return hr;
- }
- }
- else
- {
- if (FAILED(hr = strTemp.Append(pszFinalHeader, cchFinalHeader)))
- {
- return hr;
- }
- }
-
- if (pProtocol->QueryIncludePortInXForwardedFor())
- {
- if (FAILED(hr = m_pW3Context->GetServerVariable("REMOTE_PORT",
- &pszFinalHeader,
- &cchFinalHeader)))
- {
- return hr;
- }
-
- if (FAILED(hr = strTemp.Append(":", 1)) ||
- FAILED(hr = strTemp.Append(pszFinalHeader, cchFinalHeader)))
- {
- return hr;
- }
- }
-
- if (FAILED(hr = pRequest->SetHeader(pProtocol->QueryXForwardedForName()->QueryStr(),
- strTemp.QueryStr(),
- static_cast(strTemp.QueryCCH()),
- TRUE))) // fReplace
- {
- return hr;
- }
- }
-
- if (!pProtocol->QuerySslHeaderName()->IsEmpty())
- {
- const HTTP_SSL_INFO *pSslInfo = pRequest->GetRawHttpRequest()->pSslInfo;
- LPSTR pszScheme = "http";
- if (pSslInfo != NULL)
- {
- pszScheme = "https";
- }
-
- strTemp.Reset();
-
- pszCurrentHeader = pRequest->GetHeader(pProtocol->QuerySslHeaderName()->QueryStr(), &cchCurrentHeader);
- if (pszCurrentHeader != NULL)
- {
- if (FAILED(hr = strTemp.Copy(pszCurrentHeader, cchCurrentHeader)) ||
- FAILED(hr = strTemp.Append(", ", 2)))
- {
- return hr;
- }
- }
-
- if (FAILED(hr = strTemp.Append(pszScheme)))
- {
- return hr;
- }
-
- if (FAILED(pRequest->SetHeader(pProtocol->QuerySslHeaderName()->QueryStr(),
- strTemp.QueryStr(),
- (USHORT)strTemp.QueryCCH(),
- TRUE)))
- {
- return hr;
- }
- }
-
- if (!pProtocol->QueryClientCertName()->IsEmpty())
- {
- if (pRequest->GetRawHttpRequest()->pSslInfo == NULL ||
- pRequest->GetRawHttpRequest()->pSslInfo->pClientCertInfo == NULL)
- {
- pRequest->DeleteHeader(pProtocol->QueryClientCertName()->QueryStr());
- }
- else
- {
- // Resize the buffer large enough to hold the encoded certificate info
- if (FAILED(hr = strTemp.Resize(
- 1 + (pRequest->GetRawHttpRequest()->pSslInfo->pClientCertInfo->CertEncodedSize + 2) / 3 * 4)))
- {
- return hr;
- }
-
- Base64Encode(
- pRequest->GetRawHttpRequest()->pSslInfo->pClientCertInfo->pCertEncoded,
- pRequest->GetRawHttpRequest()->pSslInfo->pClientCertInfo->CertEncodedSize,
- strTemp.QueryStr(),
- strTemp.QuerySize(),
- NULL);
- strTemp.SyncWithBuffer();
-
- if (FAILED(hr = pRequest->SetHeader(
- pProtocol->QueryClientCertName()->QueryStr(),
- strTemp.QueryStr(),
- static_cast(strTemp.QueryCCH()),
- TRUE))) // fReplace
- {
- return hr;
- }
- }
- }
-
- //
- // Remove the connection header
- //
- if (!m_fWebSocketEnabled)
- {
- pRequest->DeleteHeader(HttpHeaderConnection);
- }
-
- //
- // Get all the headers to send to the client
- //
- hr = m_pW3Context->GetServerVariable("ALL_RAW",
- ppszHeaders,
- pcchHeaders);
- if (FAILED(hr))
- {
- return hr;
- }
-
- return S_OK;
-}
-
-HRESULT
-FORWARDING_HANDLER::CreateWinHttpRequest(
- __in const IHttpRequest * pRequest,
- __in const PROTOCOL_CONFIG * pProtocol,
- __in HINTERNET hConnect,
- __inout STRU * pstrUrl,
- ASPNETCORE_CONFIG* pAspNetCoreConfig,
- SERVER_PROCESS* pServerProcess
-)
-{
- HRESULT hr = S_OK;
- PCWSTR pszVersion = NULL;
- PCSTR pszVerb;
- DWORD dwTimeout = INFINITE;
- STACK_STRU(strVerb, 32);
-
- //
- // Create the request handle for this request (leave some fields blank,
- // we will fill them when sending the request)
- //
- pszVerb = pRequest->GetHttpMethod();
- if (FAILED(hr = strVerb.CopyA(pszVerb)))
- {
- goto Finished;
- }
-
- //pszVersion = pProtocol->QueryVersion();
- if (pszVersion == NULL)
- {
- DWORD cchUnused;
- hr = m_pW3Context->GetServerVariable(
- "HTTP_VERSION",
- &pszVersion,
- &cchUnused);
- if (FAILED(hr))
- {
- goto Finished;
- }
- }
-
- m_hRequest = WinHttpOpenRequest(hConnect,
- strVerb.QueryStr(),
- pstrUrl->QueryStr(),
- pszVersion,
- WINHTTP_NO_REFERER,
- WINHTTP_DEFAULT_ACCEPT_TYPES,
- WINHTTP_FLAG_ESCAPE_DISABLE_QUERY
- | g_OptionalWinHttpFlags);
- if (m_hRequest == NULL)
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
- if (!pServerProcess->IsDebuggerAttached())
- {
- dwTimeout = pProtocol->QueryTimeout();
- }
-
- if (!WinHttpSetTimeouts(m_hRequest,
- dwTimeout, //resolve timeout
- dwTimeout, // connect timeout
- dwTimeout, // send timeout
- dwTimeout)) // receive timeout
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
- DWORD dwResponseBufferLimit = pProtocol->QueryResponseBufferLimit();
- if (!WinHttpSetOption(m_hRequest,
- WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE,
- &dwResponseBufferLimit,
- sizeof(dwResponseBufferLimit)))
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
- DWORD dwMaxHeaderSize = pProtocol->QueryMaxResponseHeaderSize();
- if (!WinHttpSetOption(m_hRequest,
- WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE,
- &dwMaxHeaderSize,
- sizeof(dwMaxHeaderSize)))
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
- DWORD dwOption = WINHTTP_DISABLE_COOKIES;
-
- dwOption |= WINHTTP_DISABLE_AUTHENTICATION;
-
- if (!pProtocol->QueryDoKeepAlive())
- {
- dwOption |= WINHTTP_DISABLE_KEEP_ALIVE;
- }
- if (!WinHttpSetOption(m_hRequest,
- WINHTTP_OPTION_DISABLE_FEATURE,
- &dwOption,
- sizeof(dwOption)))
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
- if (WinHttpSetStatusCallback(m_hRequest,
- FORWARDING_HANDLER::OnWinHttpCompletion,
- (WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS |
- WINHTTP_CALLBACK_FLAG_HANDLES |
- WINHTTP_CALLBACK_STATUS_SENDING_REQUEST),
- NULL) == WINHTTP_INVALID_STATUS_CALLBACK)
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
- hr = GetHeaders(pProtocol,
- &m_pszHeaders,
- &m_cchHeaders,
- pAspNetCoreConfig,
- pServerProcess);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
-Finished:
-
- return hr;
-}
-
-REQUEST_NOTIFICATION_STATUS
-FORWARDING_HANDLER::OnExecuteRequestHandler(
- VOID
-)
-{
- REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_CONTINUE;
- HRESULT hr = S_OK;
- ASPNETCORE_CONFIG *pAspNetCoreConfig = NULL;
- FORWARDER_CONNECTION *pConnection = NULL;
- STACK_STRU(strDestination, 32);
- STACK_STRU(strUrl, 2048);
- STACK_STRU(struEscapedUrl, 2048);
- STACK_STRU(strDescription, 128);
- HINTERNET hConnect = NULL;
- IHttpRequest *pRequest = m_pW3Context->GetRequest();
- IHttpResponse *pResponse = m_pW3Context->GetResponse();
- PROTOCOL_CONFIG *pProtocol = &sm_ProtocolConfig;
- APPLICATION_MANAGER *pApplicationManager = NULL;
- SERVER_PROCESS *pServerProcess = NULL;
- USHORT cchHostName = 0;
- BOOL fSecure = FALSE;
- BOOL fProcessStartFailure = FALSE;
- HTTP_DATA_CHUNK *pDataChunk = NULL;
- IHttpConnection *pClientConnection = NULL;
-
- DBG_ASSERT(m_RequestStatus == FORWARDER_START);
-
- //
- // Take a reference so that object does not go away as a result of
- // async completion.
- //
- ReferenceForwardingHandler();
-
- m_pszOriginalHostHeader = pRequest->GetHeader(HttpHeaderHost, &cchHostName);
-
- // read per site aspNetCore configuration.
- hr = ASPNETCORE_CONFIG::GetConfig(m_pW3Context, &pAspNetCoreConfig);
- if (FAILED(hr))
- {
- // configuration error.
- goto Failure;
- }
-
- // override Protocol related config from aspNetCore config
- pProtocol->OverrideConfig(pAspNetCoreConfig);
-
- //
- // parse original url
- //
- if (FAILED(hr = PATH::SplitUrl(pRequest->GetRawHttpRequest()->CookedUrl.pFullUrl,
- &fSecure,
- &strDestination,
- &strUrl)))
- {
- goto Failure;
- }
-
- if (FAILED(hr = PATH::EscapeAbsPath(pRequest, &struEscapedUrl)))
- {
- goto Failure;
- }
-
- m_fDoReverseRewriteHeaders = pProtocol->QueryReverseRewriteHeaders();
-
- m_cMinBufferLimit = pProtocol->QueryMinResponseBuffer();
-
- pClientConnection = m_pW3Context->GetConnection();
- if (pClientConnection == NULL ||
- !pClientConnection->IsConnected())
- {
- hr = HRESULT_FROM_WIN32(WSAECONNRESET);
- goto Failure;
- }
-
- //
- // Find the application that is supposed to service this request.
- //
- pApplicationManager = APPLICATION_MANAGER::GetInstance();
- if (pApplicationManager == NULL)
- {
- hr = E_OUTOFMEMORY;
- goto Failure;
- }
-
- hr = pApplicationManager->GetApplication(m_pW3Context,
- &m_pApplication);
- if (FAILED(hr))
- {
- goto Failure;
- }
-
- m_pAppOfflineHtm = m_pApplication->QueryAppOfflineHtm();
- if (m_pAppOfflineHtm != NULL)
- {
- m_pAppOfflineHtm->ReferenceAppOfflineHtm();
- }
-
- if (m_pApplication->AppOfflineFound() && m_pAppOfflineHtm != NULL)
- {
- HTTP_DATA_CHUNK DataChunk;
-
- DataChunk.DataChunkType = HttpDataChunkFromMemory;
- DataChunk.FromMemory.pBuffer = (PVOID)m_pAppOfflineHtm->m_Contents.QueryStr();
- DataChunk.FromMemory.BufferLength = m_pAppOfflineHtm->m_Contents.QueryCB();
-
- pResponse->SetStatus(503, "Service Unavailable", 0, hr, NULL, TRUE);
- pResponse->SetHeader("Content-Type",
- "text/html",
- (USHORT)strlen("text/html"),
- FALSE
- ); // no need to check return hresult
-
- pResponse->WriteEntityChunkByReference(&DataChunk);
- goto Finished;
- }
-
- hr = m_pApplication->GetProcess(m_pW3Context,
- pAspNetCoreConfig,
- &pServerProcess);
- if (FAILED(hr))
- {
- fProcessStartFailure = TRUE;
- goto Failure;
- }
-
- if (pServerProcess == NULL)
- {
- hr = HRESULT_FROM_WIN32(ERROR_CREATE_FAILED);
- goto Failure;
- }
-
- if (pServerProcess->QueryWinHttpConnection() == NULL)
- {
- hr = HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE);
- goto Failure;
- }
-
- hConnect = pServerProcess->QueryWinHttpConnection()->QueryHandle();
-
- //
- // Mark request as websocket if upgrade header is present.
- //
-
- if (g_fWebSocketSupported)
- {
- USHORT cchHeader = 0;
- PCSTR pszWebSocketHeader = pRequest->GetHeader("Upgrade", &cchHeader);
-
- if (cchHeader == 9 && _stricmp(pszWebSocketHeader, "websocket") == 0)
- {
- m_fWebSocketEnabled = TRUE;
- }
- }
-
- hr = CreateWinHttpRequest(pRequest,
- pProtocol,
- hConnect,
- &struEscapedUrl,
- pAspNetCoreConfig,
- pServerProcess);
-
- if (FAILED(hr))
- {
- goto Failure;
- }
-
- //
- // Register for connection disconnect notification with http.sys.
- //
- if (g_fAsyncDisconnectAvailable)
- {
- m_pDisconnect = static_cast