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
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.