diff --git a/AspNetCore.sln b/AspNetCore.sln
index 3196580f8afa..c6e50d96b682 100644
--- a/AspNetCore.sln
+++ b/AspNetCore.sln
@@ -1650,10 +1650,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sandbox", "src\Grpc\JsonTra
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Grpc.JsonTranscoding", "src\Grpc\JsonTranscoding\src\Microsoft.AspNetCore.Grpc.JsonTranscoding\Microsoft.AspNetCore.Grpc.JsonTranscoding.csproj", "{109C702D-DACE-4F82-A490-15E5AFA94005}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Grpc.Swagger", "src\Grpc\JsonTranscoding\src\Microsoft.AspNetCore.Grpc.Swagger\Microsoft.AspNetCore.Grpc.Swagger.csproj", "{E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Grpc.Swagger.Tests", "src\Grpc\JsonTranscoding\test\Microsoft.AspNetCore.Grpc.Swagger.Tests\Microsoft.AspNetCore.Grpc.Swagger.Tests.csproj", "{90CF4DC6-AC53-459F-9EAB-623A11EADAA3}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests", "src\Grpc\JsonTranscoding\test\Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests\Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.csproj", "{F18E97AE-3A3F-424D-8DC2-4D001A167F98}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests", "src\Grpc\JsonTranscoding\test\Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests\Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests.csproj", "{8C3E422A-F281-4B93-A567-88C7A1ED0412}"
@@ -9953,38 +9949,6 @@ Global
{109C702D-DACE-4F82-A490-15E5AFA94005}.Release|x64.Build.0 = Release|Any CPU
{109C702D-DACE-4F82-A490-15E5AFA94005}.Release|x86.ActiveCfg = Release|Any CPU
{109C702D-DACE-4F82-A490-15E5AFA94005}.Release|x86.Build.0 = Release|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Debug|arm64.Build.0 = Debug|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Debug|x64.ActiveCfg = Debug|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Debug|x64.Build.0 = Debug|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Debug|x86.Build.0 = Debug|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Release|Any CPU.Build.0 = Release|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Release|arm64.ActiveCfg = Release|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Release|arm64.Build.0 = Release|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Release|x64.ActiveCfg = Release|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Release|x64.Build.0 = Release|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Release|x86.ActiveCfg = Release|Any CPU
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11}.Release|x86.Build.0 = Release|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Debug|arm64.Build.0 = Debug|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Debug|x64.ActiveCfg = Debug|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Debug|x64.Build.0 = Debug|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Debug|x86.ActiveCfg = Debug|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Debug|x86.Build.0 = Debug|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Release|Any CPU.Build.0 = Release|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Release|arm64.ActiveCfg = Release|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Release|arm64.Build.0 = Release|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Release|x64.ActiveCfg = Release|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Release|x64.Build.0 = Release|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Release|x86.ActiveCfg = Release|Any CPU
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3}.Release|x86.Build.0 = Release|Any CPU
{F18E97AE-3A3F-424D-8DC2-4D001A167F98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F18E97AE-3A3F-424D-8DC2-4D001A167F98}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F18E97AE-3A3F-424D-8DC2-4D001A167F98}.Debug|arm64.ActiveCfg = Debug|Any CPU
@@ -11570,8 +11534,6 @@ Global
{2E28881D-A188-47AF-800A-B5877AD8C288} = {9A8AE587-A3DB-4211-8354-430C4CCBEB9B}
{A53696E8-6065-41BA-84FB-E89E0DACFF6C} = {9A8AE587-A3DB-4211-8354-430C4CCBEB9B}
{109C702D-DACE-4F82-A490-15E5AFA94005} = {151E6F9E-107B-4DDC-A2B1-95115801FD14}
- {E3C5FAD2-8AB7-47C8-AAFD-8262551A5D11} = {151E6F9E-107B-4DDC-A2B1-95115801FD14}
- {90CF4DC6-AC53-459F-9EAB-623A11EADAA3} = {B43BE3EB-9846-4484-88D8-05165202A0FC}
{F18E97AE-3A3F-424D-8DC2-4D001A167F98} = {B43BE3EB-9846-4484-88D8-05165202A0FC}
{8C3E422A-F281-4B93-A567-88C7A1ED0412} = {B43BE3EB-9846-4484-88D8-05165202A0FC}
{EB14F068-AD55-4970-B9B4-1FBE33704243} = {5CDB8ABC-9DD0-4A9F-8948-EED5FFE89F67}
diff --git a/eng/ProjectReferences.props b/eng/ProjectReferences.props
index 002b4ffdc5e0..c62163d86db2 100644
--- a/eng/ProjectReferences.props
+++ b/eng/ProjectReferences.props
@@ -165,7 +165,6 @@
-
diff --git a/eng/RequiresDelayedBuildProjects.props b/eng/RequiresDelayedBuildProjects.props
index eee64beec6cd..d3cfd72b05d2 100644
--- a/eng/RequiresDelayedBuildProjects.props
+++ b/eng/RequiresDelayedBuildProjects.props
@@ -14,10 +14,8 @@
-
-
diff --git a/eng/ShippingAssemblies.props b/eng/ShippingAssemblies.props
index bd06923b2454..1a6d2c8bfbea 100644
--- a/eng/ShippingAssemblies.props
+++ b/eng/ShippingAssemblies.props
@@ -158,7 +158,6 @@
-
diff --git a/src/Grpc/Grpc.slnf b/src/Grpc/Grpc.slnf
index dc2d96a23df3..e499126f1cd0 100644
--- a/src/Grpc/Grpc.slnf
+++ b/src/Grpc/Grpc.slnf
@@ -8,10 +8,8 @@
"src\\Grpc\\Interop\\test\\testassets\\InteropWebsite\\InteropWebsite.csproj",
"src\\Grpc\\JsonTranscoding\\perf\\Microsoft.AspNetCore.Grpc.Microbenchmarks\\Microsoft.AspNetCore.Grpc.Microbenchmarks.csproj",
"src\\Grpc\\JsonTranscoding\\src\\Microsoft.AspNetCore.Grpc.JsonTranscoding\\Microsoft.AspNetCore.Grpc.JsonTranscoding.csproj",
- "src\\Grpc\\JsonTranscoding\\src\\Microsoft.AspNetCore.Grpc.Swagger\\Microsoft.AspNetCore.Grpc.Swagger.csproj",
"src\\Grpc\\JsonTranscoding\\test\\Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests\\Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests.csproj",
"src\\Grpc\\JsonTranscoding\\test\\Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests\\Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.csproj",
- "src\\Grpc\\JsonTranscoding\\test\\Microsoft.AspNetCore.Grpc.Swagger.Tests\\Microsoft.AspNetCore.Grpc.Swagger.Tests.csproj",
"src\\Grpc\\JsonTranscoding\\test\\testassets\\IntegrationTestsWebsite\\IntegrationTestsWebsite.csproj",
"src\\Grpc\\JsonTranscoding\\test\\testassets\\Sandbox\\Sandbox.csproj",
"src\\Hosting\\Abstractions\\src\\Microsoft.AspNetCore.Hosting.Abstractions.csproj",
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/GrpcSwaggerGenOptionsExtensions.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/GrpcSwaggerGenOptionsExtensions.cs
deleted file mode 100644
index 8c98b75eec33..000000000000
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/GrpcSwaggerGenOptionsExtensions.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Xml.XPath;
-using Microsoft.AspNetCore.Grpc.Swagger.Internal.XmlComments;
-using Swashbuckle.AspNetCore.SwaggerGen;
-
-namespace Microsoft.Extensions.DependencyInjection;
-
-///
-/// Extension methods for the gRPC JSON transcoding services.
-///
-public static class GrpcSwaggerGenOptionsExtensions
-{
- ///
- /// Inject human-friendly descriptions for Operations, Parameters and Schemas based on XML Comment files
- ///
- ///
- /// A factory method that returns XML Comments as an XPathDocument
- public static void IncludeGrpcXmlComments(
- this SwaggerGenOptions swaggerGenOptions,
- Func xmlDocFactory)
- {
- swaggerGenOptions.IncludeGrpcXmlComments(xmlDocFactory, includeControllerXmlComments: false);
- }
-
- ///
- /// Inject human-friendly descriptions for Operations, Parameters and Schemas based on XML Comment files
- ///
- ///
- /// A factory method that returns XML Comments as an XPathDocument
- ///
- /// Flag to indicate if controller XML comments (i.e. summary) should be used to assign Tag descriptions.
- /// Don't set this flag if you're customizing the default tag for operations via TagActionsBy.
- ///
- public static void IncludeGrpcXmlComments(
- this SwaggerGenOptions swaggerGenOptions,
- Func xmlDocFactory,
- bool includeControllerXmlComments)
- {
- var xmlDoc = xmlDocFactory();
- swaggerGenOptions.OperationFilter(xmlDoc);
-
- if (includeControllerXmlComments)
- {
- swaggerGenOptions.DocumentFilter(xmlDoc);
- }
- }
-
- ///
- /// Inject human-friendly descriptions for Operations, Parameters and Schemas based on XML Comment files
- ///
- ///
- /// An absolute path to the file that contains XML Comments
- public static void IncludeGrpcXmlComments(
- this SwaggerGenOptions swaggerGenOptions,
- string filePath)
- {
- swaggerGenOptions.IncludeGrpcXmlComments(() => new XPathDocument(filePath));
- }
-
- ///
- /// Inject human-friendly descriptions for Operations, Parameters and Schemas based on XML Comment files
- ///
- ///
- /// An absolute path to the file that contains XML Comments
- ///
- /// Flag to indicate if controller XML comments (i.e. summary) should be used to assign Tag descriptions.
- /// Don't set this flag if you're customizing the default tag for operations via TagActionsBy.
- ///
- public static void IncludeGrpcXmlComments(
- this SwaggerGenOptions swaggerGenOptions,
- string filePath,
- bool includeControllerXmlComments)
- {
- swaggerGenOptions.IncludeGrpcXmlComments(() => new XPathDocument(filePath), includeControllerXmlComments);
- }
-}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/GrpcSwaggerServiceExtensions.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/GrpcSwaggerServiceExtensions.cs
deleted file mode 100644
index 8fa484bd770f..000000000000
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/GrpcSwaggerServiceExtensions.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Text.Json;
-using Microsoft.AspNetCore.Grpc.Swagger.Internal;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Abstractions;
-using Microsoft.AspNetCore.Mvc.ApiExplorer;
-using Microsoft.AspNetCore.Mvc.Infrastructure;
-using Microsoft.Extensions.DependencyInjection.Extensions;
-using Microsoft.Extensions.Options;
-using Swashbuckle.AspNetCore.SwaggerGen;
-
-namespace Microsoft.Extensions.DependencyInjection;
-
-///
-/// Extension methods for the gRPC JSON transcoding services.
-///
-public static class GrpcSwaggerServiceExtensions
-{
- ///
- /// Adds gRPC JSON transcoding services to the specified .
- ///
- /// The for adding services.
- /// The so that additional calls can be chained.
- public static IServiceCollection AddGrpcSwagger(this IServiceCollection services)
- {
- ArgumentNullException.ThrowIfNull(services);
-
- services.AddGrpc().AddJsonTranscoding();
-
- services.TryAddEnumerable(ServiceDescriptor.Transient());
-
- // Register default description provider in case MVC is not registered
- services.TryAddSingleton(serviceProvider =>
- {
- var actionDescriptorCollectionProvider = serviceProvider.GetService();
- var apiDescriptionProvider = serviceProvider.GetServices();
-
- return new ApiDescriptionGroupCollectionProvider(
- actionDescriptorCollectionProvider ?? new EmptyActionDescriptorCollectionProvider(),
- apiDescriptionProvider);
- });
-
- // Add or replace contract resolver.
- services.Replace(ServiceDescriptor.Transient(s =>
- {
- var serializerOptions = s.GetService>()?.Value?.JsonSerializerOptions ?? new JsonSerializerOptions();
- var innerContractResolver = new JsonSerializerDataContractResolver(serializerOptions);
- return new GrpcDataContractResolver(innerContractResolver);
- }));
-
- return services;
- }
-
- // Dummy type that is only used if MVC is not registered in the app
- private sealed class EmptyActionDescriptorCollectionProvider : IActionDescriptorCollectionProvider
- {
- public ActionDescriptorCollection ActionDescriptors { get; } = new ActionDescriptorCollection(new List(), 1);
- }
-}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcDataContractResolver.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcDataContractResolver.cs
deleted file mode 100644
index 2266e71b1582..000000000000
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcDataContractResolver.cs
+++ /dev/null
@@ -1,161 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Diagnostics.CodeAnalysis;
-using System.Linq;
-using System.Reflection;
-using Google.Protobuf;
-using Google.Protobuf.Reflection;
-using Google.Protobuf.WellKnownTypes;
-using Grpc.Shared;
-using Swashbuckle.AspNetCore.SwaggerGen;
-using Type = System.Type;
-
-namespace Microsoft.AspNetCore.Grpc.Swagger.Internal;
-
-internal sealed class GrpcDataContractResolver : ISerializerDataContractResolver
-{
- private readonly ISerializerDataContractResolver _innerContractResolver;
- private readonly Dictionary _messageTypeMapping;
- private readonly Dictionary _enumTypeMapping;
-
- public GrpcDataContractResolver(ISerializerDataContractResolver innerContractResolver)
- {
- _innerContractResolver = innerContractResolver;
- _messageTypeMapping = new Dictionary();
- _enumTypeMapping = new Dictionary();
- }
-
- public DataContract GetDataContractForType(Type type)
- {
- if (!_messageTypeMapping.TryGetValue(type, out var messageDescriptor))
- {
- if (typeof(IMessage).IsAssignableFrom(type))
- {
- var property = type.GetProperty("Descriptor", BindingFlags.Public | BindingFlags.Static);
- messageDescriptor = property?.GetValue(null) as MessageDescriptor;
-
- if (messageDescriptor == null)
- {
- throw new InvalidOperationException($"Couldn't resolve message descriptor for {type}.");
- }
-
- _messageTypeMapping[type] = messageDescriptor;
- }
- }
-
- if (messageDescriptor != null)
- {
- return ConvertMessage(messageDescriptor);
- }
-
- if (type.IsEnum)
- {
- if (_enumTypeMapping.TryGetValue(type, out var enumDescriptor))
- {
- return DataContract.ForPrimitive(type, DataType.String, dataFormat: null, value =>
- {
- var match = enumDescriptor.Values.SingleOrDefault(v => v.Number == (int)value);
- var name = match?.Name ?? value.ToString();
- return @"""" + name + @"""";
- });
- }
- }
-
- return _innerContractResolver.GetDataContractForType(type);
- }
-
- private bool TryCustomizeMessage(MessageDescriptor messageDescriptor, [NotNullWhen(true)] out DataContract? dataContract)
- {
- // The messages serialized here should be kept in sync with SericeDescriptionHelper.IsCustomType.
- if (ServiceDescriptorHelpers.IsWellKnownType(messageDescriptor))
- {
- if (ServiceDescriptorHelpers.IsWrapperType(messageDescriptor))
- {
- var field = messageDescriptor.Fields[Int32Value.ValueFieldNumber];
-
- dataContract = _innerContractResolver.GetDataContractForType(MessageDescriptorHelpers.ResolveFieldType(field));
- return true;
- }
- if (messageDescriptor.FullName == Timestamp.Descriptor.FullName ||
- messageDescriptor.FullName == Duration.Descriptor.FullName ||
- messageDescriptor.FullName == FieldMask.Descriptor.FullName)
- {
- dataContract = DataContract.ForPrimitive(messageDescriptor.ClrType, DataType.String, dataFormat: null);
- return true;
- }
- if (messageDescriptor.FullName == Struct.Descriptor.FullName)
- {
- dataContract = DataContract.ForObject(messageDescriptor.ClrType, Array.Empty(), extensionDataType: typeof(Value));
- return true;
- }
- if (messageDescriptor.FullName == ListValue.Descriptor.FullName)
- {
- dataContract = DataContract.ForArray(messageDescriptor.ClrType, typeof(Value));
- return true;
- }
- if (messageDescriptor.FullName == Value.Descriptor.FullName)
- {
- dataContract = DataContract.ForPrimitive(messageDescriptor.ClrType, DataType.Unknown, dataFormat: null);
- return true;
- }
- if (messageDescriptor.FullName == Any.Descriptor.FullName)
- {
- var anyProperties = new List
- {
- new DataProperty("@type", typeof(string), isRequired: true)
- };
- dataContract = DataContract.ForObject(messageDescriptor.ClrType, anyProperties, extensionDataType: typeof(Value));
- return true;
- }
- }
-
- dataContract = null;
- return false;
- }
-
- private DataContract ConvertMessage(MessageDescriptor messageDescriptor)
- {
- if (TryCustomizeMessage(messageDescriptor, out var dataContract))
- {
- return dataContract;
- }
-
- var properties = new List();
-
- foreach (var field in messageDescriptor.Fields.InFieldNumberOrder())
- {
- // Enum type will later be used to call this contract resolver.
- // Register the enum type so we know to resolve its names from the descriptor.
- if (field.FieldType == FieldType.Enum)
- {
- _enumTypeMapping.TryAdd(field.EnumType.ClrType, field.EnumType);
- }
-
- Type fieldType;
- if (field.IsMap)
- {
- var mapFields = field.MessageType.Fields.InFieldNumberOrder();
- var valueType = MessageDescriptorHelpers.ResolveFieldType(mapFields[1]);
- fieldType = typeof(IDictionary<,>).MakeGenericType(typeof(string), valueType);
- }
- else if (field.IsRepeated)
- {
- fieldType = typeof(IList<>).MakeGenericType(MessageDescriptorHelpers.ResolveFieldType(field));
- }
- else
- {
- fieldType = MessageDescriptorHelpers.ResolveFieldType(field);
- }
-
- var propertyName = ServiceDescriptorHelpers.FormatUnderscoreName(field.Name, pascalCase: true, preservePeriod: false);
- var propertyInfo = messageDescriptor.ClrType.GetProperty(propertyName);
-
- properties.Add(new DataProperty(field.JsonName, fieldType, memberInfo: propertyInfo));
- }
-
- var schema = DataContract.ForObject(messageDescriptor.ClrType, properties: properties);
-
- return schema;
- }
-}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcJsonTranscodingDescriptionProvider.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcJsonTranscodingDescriptionProvider.cs
deleted file mode 100644
index 270411f73924..000000000000
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcJsonTranscodingDescriptionProvider.cs
+++ /dev/null
@@ -1,197 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Linq;
-using System.Text;
-using Google.Api;
-using Google.Protobuf.Reflection;
-using Grpc.AspNetCore.Server;
-using Grpc.Shared;
-using Microsoft.AspNetCore.Grpc.JsonTranscoding;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Abstractions;
-using Microsoft.AspNetCore.Mvc.ApiExplorer;
-using Microsoft.AspNetCore.Mvc.Controllers;
-using Microsoft.AspNetCore.Mvc.ModelBinding;
-using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
-using Microsoft.AspNetCore.Routing;
-
-namespace Microsoft.AspNetCore.Grpc.Swagger.Internal;
-
-internal sealed class GrpcJsonTranscodingDescriptionProvider : IApiDescriptionProvider
-{
- private readonly EndpointDataSource _endpointDataSource;
-
- public GrpcJsonTranscodingDescriptionProvider(EndpointDataSource endpointDataSource)
- {
- _endpointDataSource = endpointDataSource;
- }
-
- // Executes after ASP.NET Core
- public int Order => -900;
-
- public void OnProvidersExecuting(ApiDescriptionProviderContext context)
- {
- var endpoints = _endpointDataSource.Endpoints;
-
- foreach (var endpoint in endpoints)
- {
- if (endpoint is RouteEndpoint routeEndpoint)
- {
- var grpcMetadata = endpoint.Metadata.GetMetadata();
-
- if (grpcMetadata != null)
- {
- var httpRule = grpcMetadata.HttpRule;
- var methodDescriptor = grpcMetadata.MethodDescriptor;
-
- if (ServiceDescriptorHelpers.TryResolvePattern(grpcMetadata.HttpRule, out var pattern, out var verb))
- {
- var apiDescription = CreateApiDescription(routeEndpoint, httpRule, methodDescriptor, pattern, verb);
-
- context.Results.Add(apiDescription);
- }
- }
- }
- }
- }
-
- private static ApiDescription CreateApiDescription(RouteEndpoint routeEndpoint, HttpRule httpRule, MethodDescriptor methodDescriptor, string pattern, string verb)
- {
- var apiDescription = new ApiDescription();
- apiDescription.HttpMethod = verb;
- apiDescription.ActionDescriptor = new ActionDescriptor
- {
- RouteValues = new Dictionary
- {
- // Swagger uses this to group endpoints together.
- // Group methods together using the service name.
- ["controller"] = methodDescriptor.Service.Name
- },
- EndpointMetadata = routeEndpoint.Metadata.ToList()
- };
- apiDescription.SupportedRequestFormats.Add(new ApiRequestFormat { MediaType = "application/json" });
- apiDescription.SupportedResponseTypes.Add(new ApiResponseType
- {
- ApiResponseFormats = { new ApiResponseFormat { MediaType = "application/json" } },
- ModelMetadata = new GrpcModelMetadata(ModelMetadataIdentity.ForType(methodDescriptor.OutputType.ClrType)),
- StatusCode = 200
- });
- apiDescription.SupportedResponseTypes.Add(new ApiResponseType
- {
- ApiResponseFormats = { new ApiResponseFormat { MediaType = "application/json" } },
- ModelMetadata = new GrpcModelMetadata(ModelMetadataIdentity.ForType(typeof(Google.Rpc.Status))),
- IsDefaultResponse = true
- });
- var explorerSettings = routeEndpoint.Metadata.GetMetadata();
- if (explorerSettings != null)
- {
- apiDescription.GroupName = explorerSettings.GroupName;
- }
-
- var methodMetadata = routeEndpoint.Metadata.GetMetadata()!;
- var httpRoutePattern = HttpRoutePattern.Parse(pattern);
- var routeParameters = ServiceDescriptorHelpers.ResolveRouteParameterDescriptors(httpRoutePattern.Variables, methodDescriptor.InputType);
-
- apiDescription.RelativePath = ResolvePath(httpRoutePattern, routeParameters);
-
- foreach (var routeParameter in routeParameters)
- {
- var field = routeParameter.Value.DescriptorsPath.Last();
- var parameterName = ServiceDescriptorHelpers.FormatUnderscoreName(field.Name, pascalCase: true, preservePeriod: false);
- var propertyInfo = field.ContainingType.ClrType.GetProperty(parameterName);
-
- // If from a property, create model as property to get its XML comments.
- var identity = propertyInfo != null
- ? ModelMetadataIdentity.ForProperty(propertyInfo, MessageDescriptorHelpers.ResolveFieldType(field), field.ContainingType.ClrType)
- : ModelMetadataIdentity.ForType(MessageDescriptorHelpers.ResolveFieldType(field));
-
- apiDescription.ParameterDescriptions.Add(new ApiParameterDescription
- {
- Name = routeParameter.Value.JsonPath,
- ModelMetadata = new GrpcModelMetadata(identity),
- Source = BindingSource.Path,
- DefaultValue = string.Empty
- });
- }
-
- var bodyDescriptor = ServiceDescriptorHelpers.ResolveBodyDescriptor(httpRule.Body, methodMetadata.ServiceType, methodDescriptor);
- if (bodyDescriptor != null)
- {
- // If from a property, create model as property to get its XML comments.
- var identity = bodyDescriptor.PropertyInfo != null
- ? ModelMetadataIdentity.ForProperty(bodyDescriptor.PropertyInfo, bodyDescriptor.PropertyInfo.PropertyType, bodyDescriptor.PropertyInfo.DeclaringType!)
- : ModelMetadataIdentity.ForType(bodyDescriptor.Descriptor.ClrType);
-
- // Or if from a parameter, create model as parameter to get its XML comments.
- var parameterDescriptor = bodyDescriptor.ParameterInfo != null
- ? new ControllerParameterDescriptor { ParameterInfo = bodyDescriptor.ParameterInfo }
- : null;
-
- apiDescription.ParameterDescriptions.Add(new ApiParameterDescription
- {
- Name = "Input",
- ModelMetadata = new GrpcModelMetadata(identity),
- Source = BindingSource.Body,
- ParameterDescriptor = parameterDescriptor!
- });
- }
-
- var queryParameters = ServiceDescriptorHelpers.ResolveQueryParameterDescriptors(routeParameters, methodDescriptor, bodyDescriptor?.Descriptor, bodyDescriptor?.FieldDescriptor);
- foreach (var queryDescription in queryParameters)
- {
- var fieldType = MessageDescriptorHelpers.ResolveFieldType(queryDescription.Value);
- if (queryDescription.Value.IsRepeated)
- {
- fieldType = typeof(List<>).MakeGenericType(fieldType);
- }
-
- apiDescription.ParameterDescriptions.Add(new ApiParameterDescription
- {
- Name = queryDescription.Key,
- ModelMetadata = new GrpcModelMetadata(ModelMetadataIdentity.ForType(fieldType)),
- Source = BindingSource.Query,
- DefaultValue = string.Empty
- });
- }
-
- return apiDescription;
- }
-
- private static string ResolvePath(HttpRoutePattern httpRoutePattern, Dictionary routeParameters)
- {
- var sb = new StringBuilder();
- for (var i = 0; i < httpRoutePattern.Segments.Count; i++)
- {
- if (sb.Length > 0)
- {
- sb.Append('/');
- }
- var routeParameter = routeParameters.SingleOrDefault(kvp => kvp.Value.RouteVariable.StartSegment == i).Value;
- if (routeParameter != null)
- {
- sb.Append('{');
- sb.Append(routeParameter.JsonPath);
- sb.Append('}');
-
- // Skip segments if variable is multiple segment.
- i = routeParameter.RouteVariable.EndSegment - 1;
- }
- else
- {
- sb.Append(httpRoutePattern.Segments[i]);
- }
- }
- if (httpRoutePattern.Verb != null)
- {
- sb.Append(':');
- sb.Append(httpRoutePattern.Verb);
- }
- return sb.ToString();
- }
-
- public void OnProvidersExecuted(ApiDescriptionProviderContext context)
- {
- // no-op
- }
-}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcModelMetadata.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcModelMetadata.cs
deleted file mode 100644
index 243d39fbde5c..000000000000
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcModelMetadata.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Mvc.ModelBinding;
-using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
-
-#nullable disable
-
-namespace Microsoft.AspNetCore.Grpc.Swagger.Internal;
-
-internal sealed class GrpcModelMetadata : ModelMetadata
-{
- public GrpcModelMetadata(ModelMetadataIdentity identity) : base(identity)
- {
- IsBindingAllowed = true;
- }
-
- public override IReadOnlyDictionary