Activities of "carl.hallqvist"

Thanks, I will take a look :-)

For some reason it seems to only be related to Safari web browser, and not Chrome. Any ideas why?

Thanks

I have deployed my service using the provided Helm charts. But once testing it in Swagger (the authentication seems be ok) I got the following error from server.

[20:24:45 INF] Request starting HTTP/1.1 POST http://myproject-ticket/api/ticket/tickets - application/json 333
[20:24:45 INF] CORS policy execution successful.
[20:24:45 INF] Executing endpoint 'myproject.TicketService.Tickets.TicketsAppService.CreateAsync (myproject.TicketService)'
[20:24:45 INF] Route matched with {action = "Create", controller = "Tickets", area = "", page = ""}. Executing controller action with signature System.Threading.Tasks.Task`1[myproject.TicketService.Tickets.TicketDto] CreateAsync(myproject.TicketService.Tickets.TicketCreateDto) on controller myproject.TicketService.Tickets.TicketsAppService (myproject.TicketService).
[20:24:45 WRN] The required antiforgery cookie ".AspNetCore.Antiforgery.Pqki2eFce9s" is not present.
[20:24:45 INF] Authorization failed for the request at filter 'Volo.Abp.AspNetCore.Mvc.AntiForgery.AbpAutoValidateAntiforgeryTokenAuthorizationFilter'.
[20:24:45 INF] Executing StatusCodeResult, setting HTTP status code 400
[20:24:45 INF] Executed action myproject.TicketService.Tickets.TicketsAppService.CreateAsync (myproject.TicketService) in 1.4636ms
[20:24:45 INF] Executed endpoint 'myproject.TicketService.Tickets.TicketsAppService.CreateAsync (myproject.TicketService)'
[20:24:45 INF] Request finished HTTP/1.1 POST http://myproject-ticket/api/ticket/tickets - 400 0 null 28.3141ms

Do you have any idea what the problem is?

Thanks

Hi :-)

I have tried to follow https://abp.io/docs/latest/framework/infrastructure/event-bus/distributed

The CustomerService shall publish a message over RabbitMQ disitrbuted bus to the InvoiceService when Customer is updated.

The publisher:

public class CustomersAppService : ApplicationService, ICustomersAppService
{
    protected IDistributedCache<CustomerDownloadTokenCacheItem, string> _downloadTokenCache;
    protected ICustomerRepository _customerRepository;
    protected CustomerManager _customerManager;
    protected IDistributedEventBus _eventBus;

    public CustomersAppService(
        ICustomerRepository customerRepository,
        CustomerManager customerManager,
        IDistributedEventBus eventBus,
        IDistributedCache<CustomerDownloadTokenCacheItem, string> downloadTokenCache)
    {
        _downloadTokenCache = downloadTokenCache;
        _customerRepository = customerRepository;
        _customerManager = customerManager;
        _eventBus = eventBus;
    }

    public virtual async Task<CustomerDto> UpdateAsync(Guid id, CustomerUpdateDto input)
    {
        var customer = await _customerManager.UpdateAsync(
            id,
            input.Name, input.Street, input.ZipCode, input.City, input.PhoneNumber,
            input.Email, input.IsCompany, input.IdentificationNumber, input.AttName,
            input.ConcurrencyStamp
        );
    
        // Send update event
        var customerUpdatedEto = ObjectMapper.Map<Customer, CustomerUpdatedEto>(customer);
        await _eventBus.PublishAsync(customerUpdatedEto);
        
        // Return object
        return ObjectMapper.Map<Customer, CustomerDto>(customer);
    }

    ...
}

The ETO class:

using Volo.Abp.EventBus;

namespace MyProject.CustomerService.Customers;

[EventName("MyProject.CustomerService.Customers.CustomerUpdated")]
public class CustomerUpdatedEto
{
    public Guid Id { get; set; }
    public string Name { get; set; } = null!;
    public string Street { get; set; } = null!;
    public string ZipCode { get; set; } = null!;
    public string City { get; set; } = null!;
    public string PhoneNumber { get; set; } = null!;
    public string Email { get; set; }
    public bool IsCompany { get; set; }
    public string? IdentificationNumber { get; set; }
    public string? AttName { get; set; }
}

That's everything I have done in the CustomerService. In the subscriber, InvoiceService is only one added class CustomerServiceEventHandler

using MyProject.CustomerService.Customers;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed;

namespace MyProject.InvoiceService;

public class CustomerServiceEventHandler : IDistributedEventHandler<CustomerUpdatedEto>, ITransientDependency
{
    public async Task HandleEventAsync(CustomerUpdatedEto eventData)
    {
        var customerId = eventData.Id;       
    }
}

Now, I have started the both services, CustomerService and the InvoiceService, and the RabbitMQ queues are listed by using the RabbitMQ CLI:

$ docker exec -it rabbitmq rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name	messages
AbpBackgroundJobsDelayed.Volo.Abp.Emailing.BackgroundEmailSendingJobArgs	0
MyProject_AuthServer	0
MyProject_IdentityService	0
MyProject_CustomerService	0
AbpBackgroundJobs.Volo.Abp.Emailing.BackgroundEmailSendingJobArgs	0
MyProject_InvoiceService	0

So the queues seems to be registered. However, I can't see that any message is published, nor received at the subscribe. Notice that the receiver has a binding to the ETO class MyProject.CustomerService.Customers.CustomerUpdated. When using debugger in CustomerService, I can see that there is no exceptions thrown in the await _eventBus.PublishAsync(customerUpdatedEto); line.

$ docker exec -it rabbitmq rabbitmqctl list_bindings | grep MyProject_CustomerService
	exchange	MyProject_CustomerService	queue	MyProject_CustomerService	[]
MyProject	exchange	MyProject_CustomerService	queue	Volo.Abp.Localization.LanguageChangedEto	[]
MyProject	exchange	MyProject_CustomerService	queue	Volo.Payment.RecurringPaymentUpdated	[]
MyProject	exchange	MyProject_CustomerService	queue	Volo.Payment.SubscriptionCanceled	[]
MyProject	exchange	MyProject_CustomerService	queue	Volo.Payment.SubscriptionCreated	[]
MyProject	exchange	MyProject_CustomerService	queue	abp.data.apply_database_migrations	[]
MyProject	exchange	MyProject_CustomerService	queue	abp.multi_tenancy.tenant.connection_string.updated	[]
MyProject	exchange	MyProject_CustomerService	queue	abp.multi_tenancy.tenant.created	[]

$ docker exec -it rabbitmq rabbitmqctl list_bindings | grep MyProject_InvoiceService
	exchange	MyProject_InvoiceService	queue	MyProject_InvoiceService	[]
MyProject	exchange	MyProject_InvoiceService	queue	MyProject.CustomerService.Customers.CustomerUpdated	[]
MyProject	exchange	MyProject_InvoiceService	queue	Volo.Abp.Localization.LanguageChangedEto	[]
MyProject	exchange	MyProject_InvoiceService	queue	Volo.Payment.RecurringPaymentUpdated	[]
MyProject	exchange	MyProject_InvoiceService	queue	Volo.Payment.SubscriptionCanceled	[]
MyProject	exchange	MyProject_InvoiceService	queue	Volo.Payment.SubscriptionCreated	[]
MyProject	exchange	MyProject_InvoiceService	queue	abp.data.apply_database_migrations	[]
MyProject	exchange	MyProject_InvoiceService	queue	abp.multi_tenancy.tenant.connection_string.updated	[]
MyProject	exchange	MyProject_InvoiceService	queue	abp.multi_tenancy.tenant.created	[]

The ETO class:

using Volo.Abp.EventBus;

namespace MyProject.CustomerService.Customers;

[EventName("MyProject.CustomerService.Customers.CustomerUpdated")]
public class CustomerUpdatedEto
{
    public Guid Id { get; set; }
    public string Name { get; set; } = null!;
    public string Street { get; set; } = null!;
    public string ZipCode { get; set; } = null!;
    public string City { get; set; } = null!;
    public string PhoneNumber { get; set; } = null!;
    public string Email { get; set; }
    public bool IsCompany { get; set; }
    public string? IdentificationNumber { get; set; }
    public string? AttName { get; set; }
}

That's everything I have done in the CustomerService. In the subscriber, InvoiceService is only one added class CustomerServiceEventHandler

using MyProject.CustomerService.Customers;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed;

namespace MyProject.InvoiceService;

public class CustomerServiceEventHandler : IDistributedEventHandler<CustomerUpdatedEto>, ITransientDependency
{
    public async Task HandleEventAsync(CustomerUpdatedEto eventData)
    {
        var customerId = eventData.Id;       
    }
}

Now, I have started the both services, CustomerService and the InvoiceService, and the RabbitMQ queues are listed by using the RabbitMQ CLI:

$ docker exec -it rabbitmq rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name	messages
AbpBackgroundJobsDelayed.Volo.Abp.Emailing.BackgroundEmailSendingJobArgs	0
MyProject_AuthServer	0
MyProject_IdentityService	0
MyProject_CustomerService	0
AbpBackgroundJobs.Volo.Abp.Emailing.BackgroundEmailSendingJobArgs	0
MyProject_InvoiceService	0

So the queues seems to be registered. However, I can't see that any message is published, nor received at the subscribe. Notice that the receiver has a binding to the ETO class MyProject.CustomerService.Customers.CustomerUpdated.

$ docker exec -it rabbitmq rabbitmqctl list_bindings | grep MyProject_CustomerService
	exchange	MyProject_CustomerService	queue	MyProject_CustomerService	[]
MyProject	exchange	MyProject_CustomerService	queue	Volo.Abp.Localization.LanguageChangedEto	[]
MyProject	exchange	MyProject_CustomerService	queue	Volo.Payment.RecurringPaymentUpdated	[]
MyProject	exchange	MyProject_CustomerService	queue	Volo.Payment.SubscriptionCanceled	[]
MyProject	exchange	MyProject_CustomerService	queue	Volo.Payment.SubscriptionCreated	[]
MyProject	exchange	MyProject_CustomerService	queue	abp.data.apply_database_migrations	[]
MyProject	exchange	MyProject_CustomerService	queue	abp.multi_tenancy.tenant.connection_string.updated	[]
MyProject	exchange	MyProject_CustomerService	queue	abp.multi_tenancy.tenant.created	[]

$ docker exec -it rabbitmq rabbitmqctl list_bindings | grep MyProject_InvoiceService
	exchange	MyProject_InvoiceService	queue	MyProject_InvoiceService	[]
MyProject	exchange	MyProject_InvoiceService	queue	MyProject.CustomerService.Customers.CustomerUpdated	[]
MyProject	exchange	MyProject_InvoiceService	queue	Volo.Abp.Localization.LanguageChangedEto	[]
MyProject	exchange	MyProject_InvoiceService	queue	Volo.Payment.RecurringPaymentUpdated	[]
MyProject	exchange	MyProject_InvoiceService	queue	Volo.Payment.SubscriptionCanceled	[]
MyProject	exchange	MyProject_InvoiceService	queue	Volo.Payment.SubscriptionCreated	[]
MyProject	exchange	MyProject_InvoiceService	queue	abp.data.apply_database_migrations	[]
MyProject	exchange	MyProject_InvoiceService	queue	abp.multi_tenancy.tenant.connection_string.updated	[]
MyProject	exchange	MyProject_InvoiceService	queue	abp.multi_tenancy.tenant.created	[]

Thanks, it is working fine now! :-)

Hi, I added your suggestions in the project file. However, the generate embedded files manifest setting

<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>

result with this in the Developer console in web browser:

[Error] Error: One or more errors occurred. (An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AspNetCore.Components.WebAssembly.AbpAspNetCoreComponentsWebAssemblyModule, Volo.Abp.AspNetCore.Components.WebAssembly, Version=9.0.4.0, Culture=neutral, PublicKeyToken=null: The API description of the Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.IAbpApplicationConfigurationAppService.GetAsync method was not found!. See the inner exception for details.)
	(anonym funktion) (blazor.web.js:1:157835)

When setting to false / remove it, then it is the same result as before. Any other ideas?

Thanks

Thanks,

I can understand why you don't recommend to use Language Module for static content. However, we was first trying to follow the localization guide at https://abp.io/docs/latest/framework/fundamentals/localization but failed.

So perhaps you can guide us to set the localization instead of using the language module?

This is what we have done:

ProjectBlazorClientModule.cs:

[DependsOn(
    typeof(AbpLocalizationModule),
    ...
    typeof(AbpVirtualFileSystemModule) //virtual file system
)]
public class ProjectBlazorClientModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        var environment = context.Services.GetSingletonInstance<IWebAssemblyHostEnvironment>();
        var builder = context.Services.GetSingletonInstance<WebAssemblyHostBuilder>()

        // Include the generated app-generate-proxy.json in the virtual file system
        Configure<AbpVirtualFileSystemOptions>(options =>
        {
            options.FileSets.AddEmbedded<ProjectBlazorClientModule>();
        });

        ConfigureLocalization();
        ...
    }
    
    private void ConfigureLocalization()
    {
        Configure<AbpVirtualFileSystemOptions>(options =>
        {
            options.FileSets.AddEmbedded<ProjectBlazorClientModule>();
        });

        Configure<AbpLocalizationOptions>(options =>
        {
            //Define a new localization resource (TestResource)
            options.Resources
                .Add<TestResource>("en")
                .AddVirtualJson("/Localization/Resources/Test");
            options.DefaultResourceType = typeof(TestResource);
        });
    }
}
TestResource.cs

using Volo.Abp.Localization;

namespace GeoTicket.Blazor.Client.Localization.Resources;

[LocalizationResourceName("Test")]
public class TestResource;
File structure:
Project.Blazor.Client/
├── Project.Blazor.Client.csproj
├── ProjectBlazorClientModule.cs
├── .....
├── ProjectComponentBase.cs
├── Localization
│   ├── Resources
│   │   └── Test
│   │       ├── en.json
│   │       └── sv.json
│   └── TestResource.cs
.....
en.json content (similar for sv.json):

{
  "culture": "en",
  "texts": {
    "HelloWorld": "Hello World!"
  }
}
@page "/"
@using Project.Blazor.Client.Localization.Resources
@using Microsoft.Extensions.Localization
@inherits ProjectComponentBase

@inject IStringLocalizer<TestResource> W

@W["HelloWorld"] 

The @W["HelloWorld"] is not working, just HelloWorld in the page above.

I think that we have followed the guide, but still doesn't get it. Any ideas?

How can one seed the Language Management ? I would like to include new words that is not included default. This is what is generated:

using Volo.Abp.DependencyInjection;
using Volo.Abp.LanguageManagement.Data;
using Volo.Abp.Uow;
using Volo.Abp.MultiTenancy;

namespace GeoTicket.LanguageService.Data;

public class LanguageServiceDataSeeder : ITransientDependency
{
    private readonly ILogger<LanguageServiceDataSeeder> _logger;
    private readonly ICurrentTenant _currentTenant;
    private readonly IUnitOfWorkManager _unitOfWorkManager;
    private readonly LanguageManagementDataSeeder _languageManagementDataSeeder;

    public LanguageServiceDataSeeder(
        ILogger<LanguageServiceDataSeeder> logger,
        ICurrentTenant currentTenant,
        IUnitOfWorkManager unitOfWorkManager,
        LanguageManagementDataSeeder languageManagementDataSeeder)
    {
        _logger = logger;
        _unitOfWorkManager = unitOfWorkManager;
        _currentTenant = currentTenant;
        _languageManagementDataSeeder = languageManagementDataSeeder;
    }

    public async Task SeedAsync(Guid? tenantId = null)
    {
        using (_currentTenant.Change(tenantId))
        {
            using (var uow = _unitOfWorkManager.Begin(requiresNew: true, isTransactional: true))
            {
                await SeedLanguagesAsync(tenantId);
                await uow.CompleteAsync();
            }
        }
    }

    private async Task SeedLanguagesAsync(Guid? tenantId)
    {
        if (tenantId != null)
        {
            /* Language list is not multi-tenant */
            return;
        }

        await _languageManagementDataSeeder.SeedAsync();
    }
}
Question

How do you edit the base UI itself? For example, how do we access the code for the login page if we want to add things to that page? Or if we want to use our own spinner in the main layout?

We want to be able to edit the existing layout as it is. If that’s the best way to do it?? Can you run some command in the ABP CLI to extract the layout from the DLLs? The layout we're using is LeptonX SideMenu.

Showing 1 to 10 of 63 entries
Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v9.3.0-preview. Updated on June 12, 2025, 09:12