Check the docs before asking a question: https://docs.abp.io/en/commercial/latest/ Check the samples, to see the basic tasks: https://docs.abp.io/en/commercial/latest/samples/index The exact solution to your question may have been answered before, please use the search on the homepage.
1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask
2.InnerInvoke()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Query.Internal.SplitQueryingEnumerable1.AsyncEnumerator.InitializeReaderAsync(DbContext _, Boolean result, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func
4 operation, Func4 verifySucceeded, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.SplitQueryingEnumerable
1.AsyncEnumerator.MoveNextAsync()
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable1 asyncEnumerable, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable
1 asyncEnumerable, CancellationToken cancellationToken)
at Volo.Abp.BlobStoring.Database.EntityFrameworkCore.EfCoreDatabaseBlobContainerRepository.FindAsync(String name, CancellationToken cancellationToken)
at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo)
at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue1.ProceedAsync() at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter
1.InterceptAsync[TResult](IInvocation invocation, IInvocationProceedInfo proceedInfo, Func3 proceed) at Volo.Abp.BlobStoring.Database.DatabaseBlobProvider.GetOrCreateContainerAsync(String name, CancellationToken cancellationToken) at Volo.Abp.BlobStoring.Database.DatabaseBlobProvider.SaveAsync(BlobProviderSaveArgs args) at Volo.Abp.BlobStoring.BlobContainer.SaveAsync(String name, Stream stream, Boolean overrideExisting, CancellationToken cancellationToken) at Volo.Abp.BlobStoring.BlobContainerExtensions.SaveAsync(IBlobContainer container, String name, Byte[] bytes, Boolean overrideExisting, CancellationToken cancellationToken) at Siemens.Odms.FileAppService.SaveBlobAsync(SaveBlobInput saveBlobInput) at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous(IInvocation invocation, IInvocationProceedInfo proceedInfo) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapter.ProceedAsync() at Volo.Abp.Auditing.AuditingInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter
1.InterceptAsync(IInvocation invocation, IInvocationProceedInfo proceedInfo, Func3 proceed) at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous(IInvocation invocation, IInvocationProceedInfo proceedInfo) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapter.ProceedAsync() at Volo.Abp.Validation.ValidationInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter
1.InterceptAsync(IInvocation invocation, IInvocationProceedInfo proceedInfo, Func3 proceed) at Castle.DynamicProxy.AsyncInterceptorBase.ProceedAsynchronous(IInvocation invocation, IInvocationProceedInfo proceedInfo) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapter.ProceedAsync() at Volo.Abp.Uow.UnitOfWorkInterceptor.InterceptAsync(IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter
1.InterceptAsync(IInvocation invocation, IInvocationProceedInfo proceedInfo, Func`3 proceed)
at Siemens.Odms.FileController.SaveBlobAsync(SaveBlobInput saveBlobInput)
at lambda_method3887(Closure , Object )
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Configure blobstoring model creation with table prefix
builder.ConfigureBlobStoring(optionsAction: options => { options.TablePrefix = "Any prefix apart from Abp"; options.Schema = dbSchema; });
Maybe i'm blind as bat but not able to locate Volo.Abp.BlobStoring.Database.EntityFrameworkCore ? or anything related with Volo.Abp.BlobStoring.Database blob provider ?
https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Overriding-Services
Hello, I want to override the method in the application service which in a seperate module.
using Volo.Saas.Editions;
using Volo.Saas.Host.Dtos;
using Volo.Saas.Tenants;
namespace Volo.Saas.Host
{
[Authorize(SaasHostPermissions.Tenants.Default)]
public class TenantAppService : SaasHostAppServiceBase, ITenantAppService
{
public TenantAppService(.........
)
[Authorize(SaasHostPermissions.Tenants.Create)]
public virtual async Task<SaasTenantDto> CreateAsync(SaasTenantCreateDto input)
{
}
}
}
I'm just targeting to override CreateAsync in my solution
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(ITenantAppService), typeof(TenantAppService), typeof(NMMTenantAppService))]
public class NMMTenantAppService : TenantAppService
{
public NMMTenantAppService(
IEditionRepository editionRepository,
ITenantRepository tenantRepository,
ITenantManager tenantManager,
IDataSeeder dataSeeder)
: base(
tenantRepository: tenantRepository,
editionRepository: editionRepository,
tenantManager: tenantManager,
dataSeeder: dataSeeder)
{
}
public async override Task<SaasTenantDto> CreateAsync(SaasTenantCreateDto input)
{
var tenant = await TenantManager.CreateAsync(input.Name, input.EditionId);
input.MapExtraPropertiesTo(tenant);
await TenantRepository.InsertAsync(tenant);
await CurrentUnitOfWork.SaveChangesAsync();
return ObjectMapper.Map<Tenant, SaasTenantDto>(tenant);
}
}
Beside that I'm also not happy with** SaasTenantCreateDto**. Tricky part is I don't want to extend DTO, I want to remove properties What is the recommended way to do this in framework ?
Do I need create a new ApplicationService in my project with new interface ? And replace service from module with a new one
App Service
[Authorize(SaasHostPermissions.Tenants.Default)]
public class NMMTenantAppService : SaasHostAppServiceBase, INMMTenantAppService
{
}
Method
[Authorize(SaasHostPermissions.Tenants.Create)]
public async Task<SaasTenantDto> CreateAsync(**NMMSaasTenantCreateDto** input)
{
}
Interface
public interface INMMTenantAppService : ICrudAppService<SaasTenantDto, Guid, GetTenantsInput, **NMMSaasTenantCreateDto**, SaasTenantUpdateDto>
{
}
Dto
public class NMMSaasTenantCreateDto : SaasTenantCreateOrUpdateDtoBase
{
}
Hi, I have created a separate database for each tenant in order to provide data isolation between host and tenant in my system. Migration operation is performed over different contextes
Host is
/* Include modules to your migration db context */
builder.ConfigurePermissionManagement();
builder.ConfigureSettingManagement();
builder.ConfigureBackgroundJobs();
builder.ConfigureAuditLogging();
builder.ConfigureIdentity();
builder.ConfigureIdentityServer();
builder.ConfigureFeatureManagement();
builder.ConfigureLanguageManagement();
builder.ConfigureSaas();
builder.ConfigureTextTemplateManagement();
builder.ConfigureBlobStoring();
/* Custom platform modules */
builder.ConfigureCredit();
/* Configure your own tables/entities inside the ConfigureNMM method */
builder.ConfigureNMM();
Tenat is
builder.ConfigurePermissionManagement();
builder.ConfigureSettingManagement();
builder.ConfigureAuditLogging();
builder.ConfigureIdentity();
builder.ConfigureFeatureManagement();
builder.ConfigureLanguageManagement();
builder.ConfigureTextTemplateManagement();
As you can see from above we didn't create any identityServer4 related table at tenant side since it is host related task
As far as i can see out of box app client supports password grant flow
CreateClientAsync(
name: consoleAndAngularClientId,
scopes: commonScopes,
grantTypes: new[] { "password", "client_credentials", "authorization_code" },
secret: (configurationSection["XYZ_App:ClientSecret"] ?? "1q2w3e*").Sha256(),
requireClientSecret: ~~false~~ true,
redirectUri: webClientRootUrl,
postLogoutRedirectUri: webClientRootUrl,
~~corsOrigins: new[] { webClientRootUrl.RemovePostFix("/") ~~
Ofcourse, there is no problem for the host users
However tenant users are not able get token for the API calls, Any hint ?