Hi Liang,
The differences are with the following:
I will share a OneDrive link to the full source code to the email you listed.
Thanks,
Suresh
Hello,
Following up to find out if you will be able to provide assistance on this ticket?
Thanks in advance,
Suresh
We have a microservice that has reference to 2 services. When executing endpoints from 1st service, they work. However, when executing endpoints from 2nd service, we get a 404 error. Below are code details:
(Host) Module class from Microservice
=====================================
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options
.ConventionalControllers
.Create(typeof(IntegrationServicesProjectServiceModule).Assembly, opts =>
{
opts.RemoteServiceName = "ProjectService";
opts.RootPath = "project";
});
});
}
(Service 1) Module class from HttpApi project
==============================================
public override void PreConfigureServices(ServiceConfigurationContext context)
{
PreConfigure<IMvcBuilder>(mvcBuilder =>
{
mvcBuilder.AddApplicationPartIfNotExists(typeof(ProjectHttpApiModule).Assembly);
});
PreConfigure<AbpAspNetCoreMvcOptions>(options =>
{
//1.0 Compatibility version
options.ConventionalControllers.Create(typeof(ProjectApplicationModule).Assembly, opts =>
{
opts.TypePredicate = t => t.Namespace == typeof(CapsPay.v1.CapspayprojectAppService).Namespace;
//opts.ApiVersions.Add(new ApiVersion(1, 0));
opts.RootPath = "project/v1";
opts.UrlControllerNameNormalizer = context =>
{
return context.ControllerName.Replace("project", string.Empty, System.StringComparison.InvariantCultureIgnoreCase);
};
});
});
}
(Service 2) - Module class from HttpApi project
===============================================
public override void PreConfigureServices(ServiceConfigurationContext context)
{
PreConfigure<IMvcBuilder>(mvcBuilder =>
{
mvcBuilder.AddApplicationPartIfNotExists(typeof(ClientHttpApiModule).Assembly);
});
PreConfigure<AbpAspNetCoreMvcOptions>(options =>
{
//1.0 Compatibility version
options.ConventionalControllers.Create(typeof(ClientApplicationModule).Assembly, opts =>
{
opts.TypePredicate = t => t.Namespace == typeof(CapsPay.v1.CapspayclientAppService).Namespace;
//opts.ApiVersions.Add(new ApiVersion(1, 0));
opts.RootPath = "client/v1";
opts.UrlControllerNameNormalizer = context =>
{
return context.ControllerName.Replace("client", string.Empty, System.StringComparison.InvariantCultureIgnoreCase);
};
});
});
}
If I change the value, "client/v1" to "project/v1" in service 2, the endpoints from 2nd service work. However, the pathing is not correct and it means that if another microservice has reference to this 2nd service, then we have to change the RootPath value in 2nd service to the new microservice name. This does not seem logical.
Can you please let me know what the issue is? I tried finding articles giving an insight into this implementation but did not find any.
Please let me know if you need any additional information.
Thanks in advance,
Suresh
Hi maliming,
Thanks for your valuable diagnosis. Your recommended suggestion fixed the issue!
Thanks again,
Suresh
hi
Can you share a test project to reproduce your problem?
Thanks
liming.ma@volosoft.com
Hi maliming,
Due to the size of the sample solution, I shared a OneDrive link for the code for your review.
I was able to get past the error from yesterday but now I am getting the following error:
Autofac.Core.DependencyResolutionException: An exception was thrown while activating Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator -> λ:Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorOptions -> Microsoft.Extensions.Options.UnnamedOptionsManager`1[[Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorOptions, Swashbuckle.AspNetCore.SwaggerGen, Version=6.5.0.0, Culture=neutral, PublicKeyToken=d84d99fb0135530a]] -> Microsoft.Extensions.Options.OptionsFactory`1[[Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorOptions, Swashbuckle.AspNetCore.SwaggerGen, Version=6.5.0.0, Culture=neutral, PublicKeyToken=d84d99fb0135530a]] -> λ:Microsoft.Extensions.Options.IConfigureOptions`1[[Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorOptions, Swashbuckle.AspNetCore.SwaggerGen, Version=6.5.0.0, Culture=neutral, PublicKeyToken=d84d99fb0135530a]][] -> Swashbuckle.AspNetCore.SwaggerGen.ConfigureSwaggerGeneratorOptions.
---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(Microsoft.Extensions.Options.IOptions`1[Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenOptions], System.IServiceProvider, Microsoft.AspNetCore.Hosting.IWebHostEnvironment)' on type 'ConfigureSwaggerGeneratorOptions'.
---> System.ArgumentException: An item with the same key has already been added. Key: Volo.Abp.Content.RemoteStreamContent
at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)
at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
at Microsoft.Extensions.DependencyInjection.SwaggerGenOptionsExtensions.MapType(SwaggerGenOptions swaggerGenOptions, Type type, Func`1 schemaFactory)
at Microsoft.Extensions.DependencyInjection.SwaggerGenOptionsExtensions.MapType[T](SwaggerGenOptions swaggerGenOptions, Func`1 schemaFactory)
at Microsoft.Extensions.DependencyInjection.AbpSwaggerGenServiceCollectionExtensions.<>c__DisplayClass0_0.<AddAbpSwaggerGen>b__0(SwaggerGenOptions options)
at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
at Microsoft.Extensions.Options.UnnamedOptionsManager`1.get_Value()
at lambda_method3(Closure, Object[])
at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate()
--- End of inner exception stack trace ---
at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate()
at Autofac.Core.Activators.Reflection.ReflectionActivator.<>c__DisplayClass14_0.<UseSingleConstructorActivation>b__0(ResolveRequestContext context, Action`1 next)
at Autofac.Core.Resolving.Middleware.DelegateMiddleware.Execute(ResolveRequestContext context, Action`1 next)
at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context)
at Autofac.Core.Resolving.Middleware.DisposalTrackingMiddleware.Execute(ResolveRequestContext context, Action`1 next)
at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context)
at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next)
--- End of inner exception stack trace ---
at Autofac.Core.Resolving.Middleware.ActivatorErrorHandlingMiddleware.Execute(ResolveRequestContext context, Action`1 next)
at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context)
at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext context)
at Autofac.Core.Resolving.Middleware.RegistrationPipelineInvokeMiddleware.Execute(ResolveRequestContext context, Action`1 next)
at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context)
at Autofac.Core.Resolving.Middleware.SharingMiddleware.Execute(ResolveRequestContext context, Action`1 next)
at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context)
at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context)
at Autofac.Core.Resolving.Middleware.CircularDependencyDetectorMiddleware.Execute(ResolveRequestContext context, Action`1 next)
at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context)
at Autofac.Extensions.DependencyInjection.KeyedServiceMiddleware.Execute(ResolveRequestContext context, Action`1 next)
at Autofac.Core.Resolving.Pipeline.ResolvePipelineBuilder.<>c__DisplayClass14_0.<BuildPipeline>b__1(ResolveRequestContext context)
at Autofac.Core.Pipeline.ResolvePipeline.Invoke(ResolveRequestContext context)
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest& request)
at Autofac.Core.Resolving.ResolveOperation.ExecuteOperation(ResolveRequest& request)
at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest& request)
at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest& request)
at Autofac.Core.Lifetime.LifetimeScope.Autofac.IComponentContext.ResolveComponent(ResolveRequest& request)
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType)
at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetService(Type serviceType)
at lambda_method1243(Closure, Object, HttpContext, IServiceProvider)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Volo.Abp.AspNetCore.Security.Claims.AbpClaimsMapMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Prometheus.HttpMetrics.HttpRequestDurationMiddleware.Invoke(HttpContext context)
at Prometheus.HttpMetrics.HttpRequestCountMiddleware.Invoke(HttpContext context)
at Prometheus.HttpMetrics.HttpInProgressMiddleware.Invoke(HttpContext context)
at Volo.Abp.Studio.Client.AspNetCore.AbpStudioMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Volo.Abp.Studio.Client.AspNetCore.AbpStudioMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.RequestLocalization.AbpRequestLocalizationMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Volo.Abp.AspNetCore.Tracing.AbpCorrelationIdMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
Please let me know if you need any other information from my side.
Thanks,
Suresh
Hello ,
Can you please check this similar issue if it helps you https://abp.io/support/questions/1894/How-to-use-Swagger-API-versioning-with-tiered-project
Thanks,
Hi Anjali,
I went through the above link and also the details found at: https://github.com/abpframework/abp-samples/tree/master/Api-Versioning
The support link you listed is 3 years old and I was able to sort out some compilation issues by finding details from the above github link.
I am receiving the following error message in the Module class of Micro Services:
Here is the code for this class:
[DependsOn(
typeof(ProjectHttpApiModule),
typeof(ProjectEntityFrameworkCoreModule),
typeof(ProjectApplicationModule),
typeof(ProjectApplicationContractsModule),
typeof(BlobStoringDatabaseEntityFrameworkCoreModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),
typeof(LanguageManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpFeatureManagementEntityFrameworkCoreModule),
typeof(AbpEntityFrameworkCoreSqlServerModule),
typeof(IntegrationServicesProjectServiceContractsModule),
typeof(AbpAutofacModule),
typeof(AbpAspNetCoreSerilogModule),
typeof(AbpSwashbuckleModule),
typeof(AbpAspNetCoreMvcModule),
typeof(AbpEventBusRabbitMqModule),
typeof(AbpBackgroundJobsRabbitMqModule),
typeof(AbpCachingStackExchangeRedisModule),
typeof(AbpDistributedLockingModule),
typeof(AbpStudioClientAspNetCoreModule),
typeof(AbpAuditLoggingEntityFrameworkCoreModule)
)]
public class IntegrationServicesProjectServiceModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
PreConfigure<AbpAspNetCoreMvcOptions>(options =>
{
//2.0 Version
options
.ConventionalControllers
.Create(typeof(IntegrationServicesProjectServiceModule).Assembly, opts =>
{
opts.TypePredicate = t => t.Namespace == typeof(Controllers.ConventionalControllers.v2.TodoAppService).Namespace;
opts.ApiVersions.Add(new ApiVersion(2, 0));
});
//1.0 Compatibility version
options
.ConventionalControllers
.Create(typeof(IntegrationServicesProjectServiceModule).Assembly, opts =>
{
opts.TypePredicate = t => t.Namespace == typeof(Controllers.ConventionalControllers.v1.TodoAppService).Namespace;
opts.ApiVersions.Add(new ApiVersion(1, 0));
});
});
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
var env = context.Services.GetHostingEnvironment();
var redis = CreateRedisConnection(configuration);
ConfigurePII(configuration);
ConfigureJwtBearer(context, configuration);
ConfigureCors(context, configuration);
ConfigureSwagger(context, configuration);
ConfigureDatabase(context);
ConfigureDistributedCache(configuration);
ConfigureDataProtection(context, configuration, redis);
ConfigureDistributedLock(context, redis);
ConfigureDistributedEventBus();
ConfigureIntegrationServices();
ConfigureAntiForgery(env);
ConfigureVirtualFileSystem();
ConfigureObjectMapper();
ConfigureAutoControllers();
ConfigureDynamicClaims(context);
Configure<AbpAuditingOptions>(options =>
{
options.IsEnabled = true;
options.IsEnabledForGetRequests = true;
options.HideErrors = false;
options.IsEnabledForAnonymousUsers = true;
options.AlwaysLogOnException = true;
options.IsEnabledForIntegrationServices = true;
options.ApplicationName = "ProjectService";
});
#region Configure Versioning
////context.Services.AddTransient<IApiControllerFilter, NoControllerFilter>();
////context.Services.AddAbpApiVersioning(options =>
////{
//// options.ReportApiVersions = true;
//// options.AssumeDefaultVersionWhenUnspecified = true;
////});
////Configure<AbpAspNetCoreMvcOptions>(options =>
////{
//// options.ChangeControllerModelApiExplorerGroupName = false;
////});
//context.Services.AddApiVersioning();
#endregion
if (!env.IsDevelopment())
{
Configure<AbpRabbitMqOptions>(options =>
{
options.Connections.Default.UserName = configuration["RabbitMQ:Connections:Default:UserName"];
options.Connections.Default.Password = configuration["RabbitMQ:Connections:Default:Password"];
options.Connections.Default.HostName = configuration["RabbitMQ:Connections:Default:HostName"];
options.Connections.Default.Port = 5671;
options.Connections.Default.Ssl = new RabbitMQ.Client.SslOption
{
Enabled = true,
ServerName = configuration["RabbitMQ:Connections:Default:HostName"]
};
options.Connections.Default.VirtualHost = configuration["RabbitMQ:Connections:Default:VirtualHost"];
});
}
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
var env = context.GetEnvironment();
var configuration = context.GetConfiguration();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCorrelationId();
app.UseAbpRequestLocalization();
app.UseStaticFiles();
app.UseAbpStudioLink();
app.UseCors();
app.UseRouting();
app.UseHttpMetrics();
app.UseAuthentication();
app.UseAbpClaimsMap();
app.UseAuthorization();
if (IsSwaggerEnabled(configuration))
{
app.UseSwagger();
app.UseAbpSwaggerUI(options => { ConfigureSwaggerUI(options, configuration); });
app.UseSwaggerUI(options =>
{
var provider = context.ServiceProvider.GetRequiredService<IApiVersionDescriptionProvider>();
// builds a swagger endpoint for each API version
foreach (var description in provider.ApiVersionDescriptions)
{
options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
}
var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);
});
}
app.UseAbpSerilogEnrichers();
app.UseAuditing();
app.UseUnitOfWork();
app.UseDynamicClaims();
app.UseConfiguredEndpoints(endpoints =>
{
endpoints.MapMetrics();
});
}
public override async Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context)
{
using var scope = context.ServiceProvider.CreateScope();
await scope.ServiceProvider
.GetRequiredService<ProjectServiceRuntimeDatabaseMigrator>()
.CheckAndApplyDatabaseMigrationsAsync();
}
private ConnectionMultiplexer CreateRedisConnection(IConfiguration configuration)
{
return ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
}
private void ConfigurePII(IConfiguration configuration)
{
if (configuration.GetValue<bool>(configuration["App:EnablePII"] ?? "false"))
{
Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true;
}
}
private void ConfigureJwtBearer(ServiceConfigurationContext context, IConfiguration configuration)
{
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddAbpJwtBearer(options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.MetadataAddress = configuration["AuthServer:MetaAddress"]!.EnsureEndsWith('/') + ".well-known/openid-configuration";
options.RequireHttpsMetadata = configuration.GetValue<bool>(configuration["AuthServer:RequireHttpsMetadata"]);
options.Audience = configuration["AuthServer:Audience"];
});
}
private void ConfigureVirtualFileSystem()
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<IntegrationServicesProjectServiceModule>();
});
}
private void ConfigureCors(ServiceConfigurationContext context, IConfiguration configuration)
{
var corsOrigins = configuration["App:CorsOrigins"];
context.Services.AddCors(options =>
{
options.AddDefaultPolicy(builder =>
{
if (corsOrigins != null)
{
builder
.WithOrigins(
corsOrigins
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
}
});
});
}
private void ConfigureSwagger(ServiceConfigurationContext context, IConfiguration configuration)
{
if (IsSwaggerEnabled(configuration))
{
context.Services.AddAbpSwaggerGenWithOAuth(
authority: configuration["AuthServer:Authority"],
scopes: new Dictionary<string, string>
{
{"ProjectService", "ProjectService Service API"}
},
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "ProjectService API", Version = "v1" });
options.DocInclusionPredicate((_, _) => true);
options.CustomSchemaIds(type => type.FullName);
});
}
}
private void ConfigureDatabase(ServiceConfigurationContext context)
{
Configure<AbpDbConnectionOptions>(options =>
{
options.Databases.Configure("Administration", database =>
{
database.MappedConnections.Add(AbpPermissionManagementDbProperties.ConnectionStringName);
database.MappedConnections.Add(AbpFeatureManagementDbProperties.ConnectionStringName);
database.MappedConnections.Add(AbpSettingManagementDbProperties.ConnectionStringName);
database.MappedConnections.Add(LanguageManagementDbProperties.ConnectionStringName);
});
options.Databases.Configure("AuditLoggingService", database =>
{
database.MappedConnections.Add(AbpAuditLoggingDbProperties.ConnectionStringName);
});
});
context.Services.AddAbpDbContext<ProjectServiceDbContext>(options =>
{
options.AddDefaultRepositories();
});
Configure<AbpDbContextOptions>(options =>
{
options.Configure(opts =>
{
/* Sets default DBMS for this service */
opts.UseSqlServer();
});
options.Configure<ProjectServiceDbContext>(c =>
{
c.UseSqlServer(b =>
{
b.MigrationsHistoryTable("__ProjectService_Migrations");
});
});
});
}
private void ConfigureDistributedCache(IConfiguration configuration)
{
Configure<AbpDistributedCacheOptions>(options =>
{
options.KeyPrefix = configuration["AbpDistributedCache:KeyPrefix"] ?? "";
});
}
private void ConfigureDataProtection(ServiceConfigurationContext context, IConfiguration configuration, IConnectionMultiplexer redis)
{
context.Services
.AddDataProtection()
.SetApplicationName(configuration["DataProtection:ApplicationName"]!)
.PersistKeysToStackExchangeRedis(redis, configuration["DataProtection:Keys"]);
}
private void ConfigureDistributedLock(ServiceConfigurationContext context, IConnectionMultiplexer redis)
{
context.Services.AddSingleton<IDistributedLockProvider>(
_ => new RedisDistributedSynchronizationProvider(redis.GetDatabase())
);
}
private void ConfigureDistributedEventBus()
{
Configure<AbpDistributedEventBusOptions>(options =>
{
options.Inboxes.Configure(config =>
{
config.UseDbContext<ProjectServiceDbContext>();
});
options.Outboxes.Configure(config =>
{
config.UseDbContext<ProjectServiceDbContext>();
});
});
}
private void ConfigureIntegrationServices()
{
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ExposeIntegrationServices = true;
});
}
private void ConfigureAntiForgery(IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
Configure<AbpAntiForgeryOptions>(options =>
{
/* Disabling ABP's auto anti forgery validation feature, because
* when we run the application in "localhost" domain, it will share
* the cookies between other applications (like the authentication server)
* and anti-forgery validation filter uses the other application's tokens
* which will fail the process unnecessarily.
*/
options.AutoValidate = false;
});
}
}
private void ConfigureObjectMapper()
{
Configure<AbpAutoMapperOptions>(options =>
{
options.AddMaps<IntegrationServicesProjectServiceModule>(validate: true);
});
}
private void ConfigureAutoControllers()
{
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options
.ConventionalControllers
.Create(typeof(IntegrationServicesProjectServiceModule).Assembly, opts =>
{
opts.RemoteServiceName = "ProjectService";
opts.RootPath = "project";
});
});
}
private static void ConfigureSwaggerUI(SwaggerUIOptions options, IConfiguration configuration)
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "ProjectService API");
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthScopes("ProjectService");
}
private static bool IsSwaggerEnabled(IConfiguration configuration)
{
return bool.Parse(configuration["Swagger:IsEnabled"] ?? "true");
}
private void ConfigureDynamicClaims(ServiceConfigurationContext context)
{
context.Services.Configure<AbpClaimsPrincipalFactoryOptions>(options =>
{
options.IsDynamicClaimsEnabled = true;
});
}
}
Please let me know what I need to do to get past this error.
Thanks,
Suresh
using Asp.Versioning;
using Asp.Versioning.ApplicationModels;
using Localization.Resources.AbpUi;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Swashbuckle.AspNetCore.SwaggerGen;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
[DependsOn(
typeof(ProjectApplicationContractsModule),
typeof(ProjectApplicationModule),
typeof(AbpAspNetCoreMvcModule))]
public class ProjectHttpApiModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
//PreConfigure<IMvcBuilder>(mvcBuilder =>
//{
// mvcBuilder.AddApplicationPartIfNotExists(typeof(ProjectHttpApiModule).Assembly);
//});
PreConfigure<AbpAspNetCoreMvcOptions>(options =>
{
//2.0 Version
options
.ConventionalControllers
.Create(typeof(ProjectApplicationModule).Assembly, opts =>
{
opts.TypePredicate = t => t.Namespace == typeof(CapsPay.v2.CapspayprojectAppService).Namespace;
opts.ApiVersions.Add(new ApiVersion(2, 0));
});
//1.0 Compatibility version
options
.ConventionalControllers
.Create(typeof(ProjectApplicationModule).Assembly, opts =>
{
opts.TypePredicate = t => t.Namespace == typeof(CapsPay.v1.CapspayprojectAppService).Namespace;
opts.ApiVersions.Add(new ApiVersion(1, 0));
});
});
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Get<ProjectResource>()
.AddBaseTypes(typeof(AbpUiResource));
});
var preActions = context.Services.GetPreConfigureActions<AbpAspNetCoreMvcOptions>();
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ConventionalControllers
.Create(typeof(ProjectApplicationModule).Assembly, opts =>
{
opts.RootPath = "project";
});
preActions.Configure(options);
});
// Show neutral/versionless APIs.
context.Services.AddTransient<IApiControllerFilter, NoControllerFilter>();
context.Services.AddAbpApiVersioning(options =>
{
options.ReportApiVersions = true;
options.AssumeDefaultVersionWhenUnspecified = true;
//options.ConfigureAbp(preActions.Configure());
}).AddApiExplorer(options => {
// add the versioned api explorer, which also adds IApiVersionDescriptionProvider service
// note: the specified format code will format the version as "'v'major[.minor][-status]"
options.GroupNameFormat = "'v'VVV";
// note: this option is only necessary when versioning by url segment. the SubstitutionFormat
// can also be used to control the format of the API version in route templates
options.SubstituteApiVersionInUrl = true;
});
context.Services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();
context.Services.AddAbpSwaggerGen(options =>
{
// add a custom operation filter which sets default values
options.OperationFilter<SwaggerDefaultValues>();
options.CustomSchemaIds(type => type.FullName);
});
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ChangeControllerModelApiExplorerGroupName = false;
});
}
}
What package(s) need to be installed to resolve errors for "ConfigureSwaggerOptions" and "SwaggerDefaultValues"?
Thanks.