# Conflicts: # npm/ng-packs/migrations.json # npm/ng-packs/package.json # npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html # templates/app/angular/package.json # templates/app/angular/src/app/app.config.tsfeature/ssr-migration-schematic
@ -0,0 +1,86 @@ |
|||
# ABP.IO Platform 9.2 Final Has Been Released! |
|||
|
|||
We are glad to announce that [ABP](https://abp.io/) 9.2 stable version has been released today. |
|||
|
|||
## What's New With Version 9.2? |
|||
|
|||
All the new features were explained in detail in the [9.2 RC Announcement Post](https://abp.io/community/articles/abp-platform-9.2-rc-has-been-released-jpq072nh), so there is no need to review them again. You can check it out for more details. |
|||
|
|||
## Getting Started with 9.2 |
|||
|
|||
### Creating New Solutions |
|||
|
|||
You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli) to create new solutions. |
|||
|
|||
### How to Upgrade an Existing Solution |
|||
|
|||
You can upgrade your existing solutions with either ABP Studio or ABP CLI. In the following sections, both approaches are explained: |
|||
|
|||
### Upgrading via ABP Studio |
|||
|
|||
If you are already using the ABP Studio, you can upgrade it to the latest version. ABP Studio periodically checks for updates in the background, and when a new version of ABP Studio is available, you will be notified through a modal. Then, you can update it by confirming the opened modal. See [the documentation](https://abp.io/docs/latest/studio/installation#upgrading) for more info. |
|||
|
|||
After upgrading the ABP Studio, then you can open your solution in the application, and simply click the **Upgrade ABP Packages** action button to instantly upgrade your solution: |
|||
|
|||
 |
|||
|
|||
### Upgrading via ABP CLI |
|||
|
|||
Alternatively, you can upgrade your existing solution via ABP CLI. First, you need to install the ABP CLI or upgrade it to the latest version. |
|||
|
|||
If you haven't installed it yet, you can run the following command: |
|||
|
|||
```bash |
|||
dotnet tool install -g Volo.Abp.Studio.Cli |
|||
``` |
|||
|
|||
Or to update the existing CLI, you can run the following command: |
|||
|
|||
```bash |
|||
dotnet tool update -g Volo.Abp.Studio.Cli |
|||
``` |
|||
|
|||
After installing/updating the ABP CLI, you can use the [`update` command](https://abp.io/docs/latest/CLI#update) to update all the ABP related NuGet and NPM packages in your solution as follows: |
|||
|
|||
```bash |
|||
abp update |
|||
``` |
|||
|
|||
You can run this command in the root folder of your solution to update all ABP related packages. |
|||
|
|||
## Migration Guides |
|||
|
|||
There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v9.x: [ABP Version 9.2 Migration Guide](https://abp.io/docs/9.2/release-info/migration-guides/abp-9-2) |
|||
|
|||
## Community News |
|||
|
|||
### New ABP Community Articles |
|||
|
|||
As always, exciting articles have been contributed by the ABP community. I will highlight some of them here: |
|||
|
|||
* [Liming Ma](https://github.com/maliming) has published 3 new articles: |
|||
* [Integrating .NET AI Chat Template with ABP Framework](https://abp.io/community/articles/integrating-.net-ai-chat-template-with-abp-framework-qavb5p2j) |
|||
* [Resolving Tenant from Route in ABP Framework](https://abp.io/community/articles/resolving-tenant-from-route-in-abp-framework-ah7oru97) |
|||
* [Common Errors in JWT Bearer Authentication](https://abp.io/community/articles/common-errors-in-jwt-bearer-authentication-4u3wrbs5) |
|||
* [Engincan Veske](https://engincanveske.substack.com/) has published 3 new articles: |
|||
* [Understanding HttpApi.Client Project & Remote Services in an ABP Based Application](https://abp.io/community/articles/http-api-client-and-remote-services-in-abp-based-application-xkknsp6m) |
|||
* [Using Elsa 3 with the ABP Framework: A Comprehensive Guide](https://abp.io/community/articles/using-elsa-3-workflow-with-abp-framework-usqk8afg) |
|||
* [Implementing Custom Tenant Logo Feature in ABP Framework: A Step-by-Step Guide](https://abp.io/community/articles/implementing-custom-tenant-logo-feature-in-abp-framework-a-stepbystep-guide-sba96ac9) |
|||
* [Berkan Şaşmaz](https://berkansasmaz.com/) has published 2 new articles: |
|||
* [Understanding the Domain and Application Layers in ABP Framework](https://abp.io/community/articles/understanding-the-domain-and-application-layers-in-abp-1fipc4x4) |
|||
* [How Do We Maintain Code Quality and Technical Debt in Our .NET Codebase?](https://abp.io/community/articles/how-do-we-maintain-code-quality-and-technical-debt-in-our-.net-codebase-z7glpya1) |
|||
* [Enis Necipoğlu](https://github.com/enisn) has published 2 new articles: |
|||
* [White Labeling in ABP Framework](https://abp.io/community/articles/white-labeling-in-abp-framework-5trwmrfm) by [Enis Necipoğlu](https://github.com/enisn) |
|||
* [You do it wrong! Customizing ABP Login Page Correctly](https://abp.io/community/articles/you-do-it-wrong-customizing-abp-login-page-correctly-bna7wzt5) |
|||
* [Ariful Islam](https://abp.io/community/members/arif) has published 2 new articles: |
|||
* [Multi-Workspace Management for ABP Applications](https://abp.io/community/articles/multiworkspace-management-for-abp-applications-eghgty3j) |
|||
* [Using Semantic Kernel in the ABP Framework](https://abp.io/community/articles/using-semantic-kernel-in-the-abp-framework-qo5cnuzs) |
|||
* [Guide to Add Custom Modules in ABP.IO App](https://abp.io/community/articles/guide-to-add-custom-modules-in-abp.io-app-sttetffa) by [Harsh Gupta](https://abp.io/community/members/harshgupta) |
|||
* [Debugging NuGet Packages in ABP.IO: A Complete Guide](https://abp.io/community/articles/debugging-nuget-packages-in-abp.io-a-complete-guide-h13y2033) by [Suhaib Mousa](https://suhaibmousa.com/) |
|||
* [Using Microsoft AI Extensions Library and OpenAI to Summarize User Comments](https://abp.io/community/articles/using-microsoft-ai-extensions-library-and-openai-to-summarize-user-comments-gj1lusg7) by [Halil Ibrahim Kalkan](https://twitter.com/hibrahimkalkan) |
|||
|
|||
Thanks to the ABP Community for all the content they have published. You can also [post your ABP related (text or video) content](https://abp.io/community/posts/create) to the ABP Community. |
|||
|
|||
## About the Next Version |
|||
|
|||
The next feature version will be 9.3. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). Please [submit an issue](https://github.com/abpframework/abp/issues/new) if you have any problems with this version. |
|||
|
After Width: | Height: | Size: 492 KiB |
|
After Width: | Height: | Size: 34 KiB |
@ -0,0 +1,97 @@ |
|||
# Announcing ABP Studio 1.0 General Availability 🚀 |
|||
|
|||
It's the moment you've been waiting for! We are thrilled to announce the stable release of ABP Studio v1.0. This milestone marks a significant step forward in our mission to provide a first-class, integrated development environment for ABP developers. Paired with the recently released [ABP v9.2](https://abp.io/community/articles/announcing-abp-9-2-stable-release-061qmtzb), ABP Studio v1.0 brings new features and improvements that will make your development work faster and more efficient. |
|||
|
|||
For the past several months, our core ABP team has been hard at work, focusing on the features that matter most to you, our community of developers. This release is the peak of that effort, bringing a host of improvements and new capabilities to the forefront. Let's dive in and explore what's new in ABP Studio v1.0. |
|||
|
|||
## What's New with ABP Studio v1.0? |
|||
|
|||
ABP Studio v1.0 is all about enhancing your development experience, from project creation to deployment. Here, we'll walk you through some of the latest features we've implemented, along with other key enhancements that make this release truly special. |
|||
|
|||
### ❤️ Solution Runner with Ready/Health Checks |
|||
|
|||
ABP Studio's Solution Runner now provides visual health monitoring that makes tracking your applications' status easily. When you start an application, a spinner indicates it's "starting", then in the *Overall* tab, you can see the application's health (✅ for healthy, ⚠️ for unhealthy) that displays real-time health status: |
|||
|
|||
 |
|||
|
|||
With [pre-configured health checks](https://abp.io/docs/9.2/solution-templates/layered-web-application/health-check-configuration) in ABP solution templates including database connectivity tests, you get instant feedback on your applications' health. |
|||
|
|||
When health check UI is configured, you can access comprehensive health dashboards with a dedicated "Browse Health UI" command or see the last health response from the "Show Latest Health Check Response" command: |
|||
|
|||
 |
|||
|
|||
When you restart applications that are open in your browser, ABP Studio automatically refreshes the pages for you. |
|||
|
|||
### 🎨 Theme Style Selection on Project Creation |
|||
|
|||
When creating a new solution, you can now choose your theme, theme style, and layout right from the project creation wizard instead of having to configure these settings later. ABP Studio lets you pick from [ABP's officially provided themes including Basic, LeptonX Lite, and LeptonX](https://abp.io/docs/latest/ui-themes). |
|||
|
|||
 |
|||
|
|||
If you select Basic or LeptonX Lite themes, only the theme will be changed. However, if you select the LeptonX theme, you'll get additional options to fine-tune your setup: |
|||
|
|||
- **Theme Style Configuration** - Pick from **System, Light, Dim, or Dark** styles to match how you like your development environment |
|||
- **Layout Options** - **Sidebar menu** / **Top menu** |
|||
|
|||
### 📦 "Container" Application Type for Solution Runner |
|||
|
|||
ABP Studio v1.0 introduces a dedicated "Container" application type that gives you better control over your Docker containers directly from the Solution Runner. Instead of managing all your containers through PowerShell scripts or running them all together, you can now see and control each container individually in the Solution Runner panel. |
|||
|
|||
 |
|||
|
|||
This new feature replaces the previous _Infrastructure_ folder approach with a cleaner, more intuitive container section. You can now: |
|||
|
|||
- **Start and stop containers individually** - No more starting all containers at once when you only need specific services |
|||
- **Monitor container status** - See which containers are running, stopped, or have issues directly in the UI |
|||
- **Manage container dependencies** - Control the order and timing of container startup based on your application needs |
|||
|
|||
Whether you're working with databases, message brokers, or other containerized services, the new Container application type makes it much easier to manage your development environment. This is especially useful for microservice architectures where you might want to run only specific services during development or testing. |
|||
|
|||
### ⚙️ Handle Multiple DbContexts When Adding/Removing/Applying Migrations |
|||
|
|||
When working with ABP solutions that have multiple DbContexts (such as when using the separate tenant database option), ABP Studio now intelligently prompts you to select the appropriate DbContext for migration operations. This enhancement ensures you're always working with the correct database context and helps prevent common mistakes when managing multiple databases. |
|||
|
|||
 |
|||
|
|||
The context selection dialog appears automatically when you perform any of these Entity Framework operations: |
|||
|
|||
- **Adding a new migration** - Choose which DbContext the new migration should target |
|||
- **Removing an existing migration** - Select the DbContext from which to remove the migration |
|||
- **Updating the database** - Specify which database context should be updated |
|||
|
|||
## Get Started with ABP Studio v1.0 Today! |
|||
|
|||
ABP Studio v1.0 is built on the solid foundation of the [latest version of ABP Framework, which is v9.2](https://abp.io/community/articles/announcing-abp-9-2-stable-release-061qmtzb). This means that when you create a new project with ABP Studio, you're getting all the latest features, performance improvements, and bug fixes that come with v9.2. This includes updates to dependencies, enhancements to the core framework, and improvements to application modules. |
|||
|
|||
We are incredibly excited for you to get your hands on ABP Studio v1.0. We believe these new features will make a real difference in your day-to-day development workflow. |
|||
|
|||
### ⬇️ Download ABP Studio 1.0 |
|||
|
|||
Ready to get started? You can download the stable v1.0 release right now from the official ABP Studio website: **[https://abp.io/studio](https://abp.io/studio)** |
|||
|
|||
 |
|||
|
|||
If you are an existing ABP Studio user, it's even easier. You don't need to download the installer again. Simply launch ABP Studio, and it will prompt you to update to the latest version directly from the UI. |
|||
|
|||
> Alternatively, you can click to the *Help -> Check for Updates* context menu item to check for updates and install the latest version: |
|||
> |
|||
>  |
|||
|
|||
### 🔮 What's Next? |
|||
|
|||
ABP Studio v1.0 represents just the beginning of our journey. We're committed to continuously evolving the platform, adding features that directly address real-world development challenges and enhance your workflow. Our goal is to make ABP Studio the go-to development environment for .NET and ABP Framework developers. |
|||
|
|||
We will keep releasing new versions with exciting features based on our roadmap and your valuable feedback. To give you a sneak peek into what's planned for future releases, you can expect to see: |
|||
|
|||
- **Environment Variable Management:** A dedicated UI to easily manage environment variables for your solutions. |
|||
- **OpenTelemetry Integration:** We'll be integrating OpenTelemetry support directly into the startup templates, making distributed tracing and observability a seamless part of your application from day one. |
|||
- **LeptonX Theme Builder**: Allowing users to determine styling, colour palette and easily override their project's theme styles. |
|||
- **Monitor dashboards of the tools used in the solution (e.g. Kubernetes, Redis, Grafana, etc...)** |
|||
- **Pre-configured .NET Aspire for the Microservice Startup Template** |
|||
- **and more...** |
|||
|
|||
We are incredibly excited about the future of ABP Studio and can't wait to share the next set of features with you. Your comments and suggestions are invaluable to us. If you have any feedback, please drop a comment below. |
|||
|
|||
Thank you for being part of our community and happy coding! |
|||
|
|||
**The Volosoft Team** |
|||
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 282 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 455 KiB |
|
After Width: | Height: | Size: 207 KiB |
|
After Width: | Height: | Size: 913 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 107 KiB |
@ -0,0 +1,203 @@ |
|||
# ABP Platform 9.3 RC Has Been Released |
|||
|
|||
We are happy to release [ABP](https://abp.io) version **9.3 RC** (Release Candidate). This blog post introduces the new features and important changes in this new version. |
|||
|
|||
Try this version and provide feedback for a more stable version of ABP v9.3! Thanks to you in advance. |
|||
|
|||
## Get Started with the 9.3 RC |
|||
|
|||
You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli). |
|||
|
|||
By default, ABP Studio uses stable versions to create solutions. Therefore, if you want to create a solution with a preview version, first you need to create a solution and then switch your solution to the preview version from the ABP Studio UI: |
|||
|
|||
 |
|||
|
|||
## Migration Guide |
|||
|
|||
There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v9.2 or earlier: [ABP Version 9.3 Migration Guide](https://abp.io/docs/9.3/release-info/migration-guides/abp-9-3) |
|||
|
|||
## What's New with ABP v9.3? |
|||
|
|||
In this section, I will introduce some major features released in this version. |
|||
Here is a brief list of titles explained in the next sections: |
|||
|
|||
* Cron Expression Support for Background Workers |
|||
* Docs Module: PDF Export |
|||
* Angular UI: Standalone Package Structure |
|||
* Upgraded to Blazorise v1.7.7 |
|||
* Audit Logging Module: Excel Export |
|||
|
|||
### Cron Expression Support for Background Workers |
|||
|
|||
We've enhanced the [Background Workers System](https://abp.io/docs/9.3/framework/infrastructure/background-workers) by adding support for Cron expressions when using [Hangfire](https://abp.io/docs/9.3/framework/infrastructure/background-workers/hangfire) or [Quartz](https://abp.io/docs/9.3/framework/infrastructure/background-workers/quartz) as the background worker manager. This new feature provides more flexibility in scheduling background tasks compared to the simple period-based timing system. |
|||
|
|||
Now you can define complex scheduling patterns using standard Cron expressions. For example, you can schedule a task to run: "Every day at midnight", "Every Monday at 9 AM", or "First day of every month". |
|||
|
|||
Here's how you can use it in your background worker: |
|||
|
|||
```csharp |
|||
public class MyPeriodicBackgroundWorker : AsyncPeriodicBackgroundWorkerBase |
|||
{ |
|||
public MyPeriodicBackgroundWorker( |
|||
AbpAsyncTimer timer, |
|||
IServiceScopeFactory serviceScopeFactory) |
|||
: base(timer, serviceScopeFactory) |
|||
{ |
|||
// You can either use Period for simple intervals |
|||
Timer.Period = 600000; //10 minutes |
|||
|
|||
// 👇 or use CronExpression for more complex scheduling 👇 |
|||
CronExpression = "0 0/10 * * * ?"; //Run every 10 minutes |
|||
} |
|||
|
|||
protected async override Task DoWorkAsync( |
|||
PeriodicBackgroundWorkerContext context) |
|||
{ |
|||
// Your background work... |
|||
} |
|||
} |
|||
``` |
|||
|
|||
The `CronExpression` property takes precedence over the `Period` property when both are set. This feature is available when you use either the [Hangfire](https://abp.io/docs/9.3/framework/infrastructure/background-workers/hangfire) or [Quartz](https://abp.io/docs/9.3/framework/infrastructure/background-workers/quartz) background worker managers. |
|||
|
|||
> See the [Background Workers documentation](https://abp.io/docs/9.3/framework/infrastructure/background-workers) for more information about configuring and using background workers with Cron expressions. |
|||
|
|||
### Docs Module: PDF Export |
|||
|
|||
We're excited to introduce a new feature in the Docs Module that allows users to export documentation as PDF files. This feature makes it easier for users to access documentation offline or share it with team members who might not have immediate access to the online documentation system. |
|||
|
|||
**Administrators can generate PDF files from the back-office side**: |
|||
|
|||
 |
|||
|
|||
and **then a "Download PDF" button appears in the document system** (as shown in the image below - the bottom right of the navigation menu -), allowing users to download the compiled documentation as a PDF file: |
|||
|
|||
 |
|||
|
|||
The feature supports multiple versions of documentation, different language variants, and ensures proper formatting of all content including code blocks and technical documentation. |
|||
|
|||
### Angular UI: Standalone Package Structure |
|||
|
|||
ABP v9.3 introduces support for Angular's standalone components architecture while maintaining **full compatibility with existing module-based applications**. This update aligns with Angular's strategic direction toward standalone components as the recommended approach for building Angular applications. |
|||
|
|||
The key improvements include: |
|||
|
|||
* **Dual-support routing configurations** that work seamlessly with both module-based and standalone approaches |
|||
* **ABP Suite integration** for generating code that supports standalone components |
|||
* **Updated schematics** that provide templates for both development patterns |
|||
|
|||
This enhancement gives developers the flexibility to choose their preferred Angular architecture. Existing module-based applications **continue to work without modifications**, while new projects can leverage the standalone approach for simplified dependency management, reduced boilerplate code, and better lazy-loading capabilities. |
|||
|
|||
> For developers interested in migrating to standalone components or starting new projects, we'll be publishing a comprehensive blog post with detailed guidance and best practices. In the meantime, you can check [#22829](https://github.com/abpframework/abp/pull/22829) for implementation details of the standalone package structure and make the necessary changes to your project. |
|||
|
|||
### Upgraded to Blazorise v1.7.7 |
|||
|
|||
Upgraded the [Blazorise](https://blazorise.com/) library to v1.7.7 for Blazor UI. If you are upgrading your project to v9.3.0, please ensure that all the Blazorise-related packages are using v1.7.7 in your application. Otherwise, you might get errors due to incompatible versions. |
|||
|
|||
> See [#23013](https://github.com/abpframework/abp/pull/23013) for the updated NuGet packages. |
|||
|
|||
### Audit Logging Module: Excel Export |
|||
|
|||
In this version, we've added Excel export capabilities to the [Audit Logging Module](https://abp.io/docs/latest/modules/audit-logging-pro), allowing administrators to export audit logs and entity changes to Excel files for further analysis or reporting purposes. |
|||
|
|||
 |
|||
|
|||
This feature enables users to: |
|||
|
|||
- Export audit logs with filtering options |
|||
- Export entity changes with detailed information |
|||
- Receive email notifications when exports are completed or fail |
|||
- Download exported files via secure links |
|||
|
|||
The export process runs in the background, and once completed, users receive an email with a download link. This approach ensures that even large audit log exports don't block the UI or time out during processing. |
|||
|
|||
You can configure various aspects of this feature using the `AuditLogExcelFileOptions` in your module's configuration: |
|||
|
|||
```csharp |
|||
Configure<AuditLogExcelFileOptions>(options => |
|||
{ |
|||
// How long to keep exported files before cleanup |
|||
options.FileRetentionHours = 48; |
|||
|
|||
// Base URL for download links in notification emails |
|||
options.DownloadBaseUrl = "https://yourdomain.com"; |
|||
|
|||
// Configure the cleanup worker schedule |
|||
options.ExcelFileCleanupOptions.Period = (int)TimeSpan.FromHours(24).TotalMilliseconds; |
|||
|
|||
// Use cron expression for more advanced scheduling (requires Hangfire or Quartz) |
|||
options.ExcelFileCleanupOptions.CronExpression = "0 2 * * *"; // Run at 2 AM daily |
|||
}); |
|||
``` |
|||
|
|||
The module includes pre-configured email templates for notifications about completed or failed exports, ensuring users are always informed about the status of their export requests. |
|||
|
|||
> **Note**: This feature requires a configured BLOB storage provider to store the generated Excel files. See the [BLOB Storing documentation](https://abp.io/docs/9.3/framework/infrastructure/blob-storing) for more information. |
|||
|
|||
For more details about the Audit Logging Module and its Excel export capabilities, please refer to the [official documentation](https://abp.io/docs/9.3/modules/audit-logging-pro). |
|||
|
|||
## Community News |
|||
|
|||
### Announcing ABP Studio 1.0 General Availability 🚀 |
|||
|
|||
 |
|||
|
|||
We are thrilled to announce that ABP Studio has reached version 1.0 and is now generally available! This marks a significant milestone for our integrated development environment designed specifically for ABP developers. The stable release brings several powerful features including: |
|||
|
|||
* Enhanced Solution Runner with health monitoring capabilities |
|||
* Theme style selection during project creation (Basic, LeptonX Lite, and LeptonX Themes) |
|||
* New "Container" application type for better Docker container management |
|||
* Improved handling of multiple DbContexts for migration operations |
|||
|
|||
> For a detailed overview of these features and to learn more about what's coming next, check out our [announcement post](https://abp.io/community/articles/announcing-abp-studio-1-0-general-availability-82yw62bt). |
|||
|
|||
### ABP Community Talks 2025.05: Empower Elsa Workflows with AI in .NET + ABP Framework |
|||
|
|||
In this episode of ABP Community Talks, 2025.05, we are thrilled to host [**Sipke Schoorstra**](https://github.com/sfmskywalker), the creator of the [Elsa Workflows](https://docs.elsaworkflows.io/) library! This month's session is all about **"Empower Elsa Workflows with AI in .NET + ABP Framework"**. |
|||
|
|||
 |
|||
|
|||
Sipke will join us to demonstrate how you can leverage AI within Elsa Workflows using .NET and the ABP Framework. The session will explore practical techniques and showcase how to integrate AI capabilities to enhance and automate your business processes within the Elsa workflow engine. |
|||
|
|||
> 👉 Don't miss this opportunity to learn directly from the creator of Elsa and see real-world examples of building intelligent, automated workflows! You can register from [here](https://kommunity.com/volosoft/events/abp-community-talks-202505empower-elsa-workflows-with-ai-in-netabp-framework-3965dd32). |
|||
|
|||
### ABP Bootcamp: Mastering Infrastructure & Features |
|||
|
|||
We are excited to announce the very first **ABP Bootcamp: Mastering Infrastructure & Features**! This is a live training program designed to give you hands-on, practical experience with ABP's core infrastructure and features. |
|||
|
|||
 |
|||
|
|||
Join the ABP Bootcamp to learn directly from the core team in a focused, hands-on program designed for busy developers. Over four days, you'll gain a deep understanding of ABP's infrastructure, best practices, and practical skills you can immediately apply to your projects. |
|||
|
|||
> **Seats are limited!** Don't miss this opportunity to level up your ABP skills with direct guidance from the experts. |
|||
> |
|||
> 👉 [See full details and reserve your seat!](https://abp.io/bootcamp) |
|||
|
|||
### New ABP Community Articles |
|||
|
|||
There are exciting articles contributed by the ABP community as always. I will highlight some of them here: |
|||
|
|||
* [Prabhjot Singh](https://abp.io/community/members/prabhjot) has published 3 new articles: |
|||
* [Accessing Multiple Remote ABP based Backends Using HttpApi.Client](https://abp.io/community/articles/consume-multi-backends-using-clients-6f4vcggh) |
|||
* [Adopting the new .slnx format to organize applications and services](https://abp.io/community/articles/adopting-the-new-.slnx-format-to-organize-applications-6cm3vl8k) |
|||
* [Replacing Dynamic client proxies with Static client proxies](https://abp.io/community/articles/replacing-dynamic-client-proxies-with-static-client-proxies-g30lf0vx) |
|||
* [Liming Ma](https://github.com/maliming) has published 2 new articles: |
|||
* [Resolving Tenant from Route in ABP Framework](https://abp.io/community/articles/resolving-tenant-from-route-in-abp-framework-ah7oru97) |
|||
* [Integrating .NET AI Chat Template with ABP Framework](https://abp.io/community/articles/integrating-.net-ai-chat-template-with-abp-framework-qavb5p2j) |
|||
* [Engincan Veske](https://engincanveske.substack.com/) has published 2 new articles: |
|||
* [Understanding HttpApi.Client Project & Remote Services in an ABP Based Application](https://abp.io/community/articles/http-api-client-and-remote-services-in-abp-based-application-xkknsp6m) |
|||
* [Using Elsa 3 with the ABP Framework: A Comprehensive Guide](https://abp.io/community/articles/using-elsa-3-workflow-with-abp-framework-usqk8afg) |
|||
* [Enis Necipoğlu](https://github.com/enisn) has published 2 new articles: |
|||
* [White Labeling in ABP Framework](https://abp.io/community/articles/white-labeling-in-abp-framework-5trwmrfm) by [Enis Necipoğlu](https://github.com/enisn) |
|||
* [You do it wrong! Customizing ABP Login Page Correctly](https://abp.io/community/articles/you-do-it-wrong-customizing-abp-login-page-correctly-bna7wzt5) |
|||
* [New in ABP Studio: Docker Container Management](https://abp.io/community/articles/abp-studio-docker-container-management-ex7r27y8) by [Yunus Emre Kalkan](https://github.com/yekalkan) |
|||
* [Solving MongoDB GUID Issues After an ABP Framework Upgrade](https://abp.io/community/articles/solving-mongodb-guid-issues-after-an-abp-framework-upgrade-tv8waw1n) by [Burak Demir](https://abp.io/community/members/burakdemir) |
|||
|
|||
|
|||
Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://abp.io/community/posts/create) to the ABP Community. |
|||
|
|||
## Conclusion |
|||
|
|||
This version comes with some new features and a lot of enhancements to the existing features. You can see the [Road Map](https://abp.io/docs/9.3/release-info/road-map) documentation to learn about the release schedule and planned features for the next releases. Please try ABP v9.3 RC and provide feedback to help us release a more stable version. |
|||
|
|||
Thanks for being a part of this community! |
|||
|
After Width: | Height: | Size: 455 KiB |
|
After Width: | Height: | Size: 147 KiB |
|
After Width: | Height: | Size: 300 KiB |
|
After Width: | Height: | Size: 239 KiB |
|
After Width: | Height: | Size: 676 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 34 KiB |
@ -0,0 +1,134 @@ |
|||
# Integrating .NET AI Chat Template with ABP Framework |
|||
|
|||
This article demonstrates how to integrate the [.NET AI Chat Template](https://devblogs.microsoft.com/dotnet/announcing-dotnet-ai-template-preview2/) into an ABP Framework application, enabling powerful AI chat capabilities in your ABP-based solution. |
|||
|
|||
 |
|||
|
|||
## Step 1: Create a New ABP Project |
|||
|
|||
First, let's create a new [single-layer Blazor Server project](https://abp.io/docs/latest/solution-templates/single-layer-web-application/overview) named `AbpAiChat` using ABP Studio, You can also use the following ABP CLI command to create the project: |
|||
|
|||
```bash |
|||
abp new AbpAiChat -t app-nolayers --ui-framework blazor-server --use-open-source-template |
|||
``` |
|||
|
|||
## Step 2: Integrate AI Chat Template |
|||
|
|||
The integration process involves copying and adapting the .NET AI Chat Template code into our ABP project. The template code is already included in our sample project, so you don't need to install it separately. |
|||
|
|||
### 2.1 Project Structure Changes |
|||
|
|||
1. Copy Blazor components to the `Components` folder |
|||
2. Copy AI service classes to the `Services` folder |
|||
3. Add required entities(`IngestedDocument`, `IngestedRecord`) to the `AbpAiChatDbContext` and add new migration |
|||
4. Copy frontend resources to the `wwwroot` folder |
|||
5. Adjust some styles to capatible with the ABP theme |
|||
|
|||
### 2.2 Required NuGet Packages |
|||
|
|||
Add the following packages to `AbpAiChat.csproj`: |
|||
|
|||
```xml |
|||
<PackageReference Include="Microsoft.Extensions.AI.OpenAI" Version="9.4.3-preview.1.25230.7" /> |
|||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.4" /> |
|||
<PackageReference Include="Microsoft.Extensions.AI" Version="9.4.3-preview.1.25230.7" /> |
|||
<PackageReference Include="Microsoft.SemanticKernel.Core" Version="1.47.0" /> |
|||
<PackageReference Include="PdfPig" Version="0.1.9" /> |
|||
<PackageReference Include="System.Linq.Async" Version="6.0.1" /> |
|||
``` |
|||
|
|||
### 2.3 Configure AI Services |
|||
|
|||
Add the following configuration to `AbpAiChatModule.cs`: |
|||
|
|||
```csharp |
|||
private void ConfigureAi(ServiceConfigurationContext context) |
|||
{ |
|||
var credential = new ApiKeyCredential(context.Services.GetConfiguration()["GitHubToken"] ?? throw new InvalidOperationException("Missing configuration: GitHubToken. See the README for details.")); |
|||
var openAiOptions = new OpenAIClientOptions() |
|||
{ |
|||
Endpoint = new Uri("https://models.inference.ai.azure.com") |
|||
}; |
|||
|
|||
var ghModelsClient = new OpenAIClient(credential, openAiOptions); |
|||
var chatClient = ghModelsClient.GetChatClient("gpt-4o-mini").AsIChatClient(); |
|||
var embeddingGenerator = ghModelsClient.GetEmbeddingClient("text-embedding-3-small").AsIEmbeddingGenerator(); |
|||
|
|||
var vectorStore = new JsonVectorStore(Path.Combine(AppContext.BaseDirectory, "vector-store")); |
|||
|
|||
context.Services.AddSingleton<IVectorStore>(vectorStore); |
|||
context.Services.AddScoped<DataIngestor>(); |
|||
context.Services.AddSingleton<SemanticSearch>(); |
|||
context.Services.AddChatClient(chatClient).UseFunctionInvocation().UseLogging(); |
|||
context.Services.AddEmbeddingGenerator(embeddingGenerator); |
|||
|
|||
context.Services.Configure<AbpAspNetCoreContentOptions>(options => |
|||
{ |
|||
options.ContentTypeMaps.Add(".mjs", "application/javascript"); |
|||
}); |
|||
} |
|||
``` |
|||
|
|||
The `ConfigureAi` method is called in the `ConfigureServices` method of `AbpAiChatModule`. It sets up the AI services, including the OpenAI client, chat client, embedding generator, and vector store. |
|||
|
|||
### 2.4 Configure GitHub Token |
|||
|
|||
Add your GitHub Personal Access Token to `appsettings.json`: |
|||
|
|||
```json |
|||
{ |
|||
"GitHubToken": "your-github-token" |
|||
} |
|||
``` |
|||
|
|||
You can obtain your token from [GitHub Personal Access Tokens](https://github.com/settings/personal-access-tokens). |
|||
|
|||
## Step 3: Add Custom AI Functionality |
|||
|
|||
Let's add a custom AI function to retrieve the current user's information. Update the `Chat.razor` component: |
|||
|
|||
```csharp |
|||
chatOptions.Tools = |
|||
[ |
|||
AIFunctionFactory.Create(SearchAsync), |
|||
AIFunctionFactory.Create(GetWeather), |
|||
AIFunctionFactory.Create(GetCurrentUserInfo) |
|||
]; |
|||
|
|||
[Description("Get current user information")] |
|||
private Task<string> GetCurrentUserInfo() |
|||
{ |
|||
return Task.FromResult(CurrentUser.IsAuthenticated ? |
|||
$"UserId: {CurrentUser.Id}, Name: {CurrentUser.UserName}, Email: {CurrentUser.Email}, Roles: {string.Join(", ", CurrentUser.Roles)}" : |
|||
"No user information available."); |
|||
} |
|||
``` |
|||
|
|||
## Step 4: Add Navigation |
|||
|
|||
Add a `Chat` menu item in `AbpAiChatMenuContributor` to navigate to the AI Chat component. |
|||
|
|||
## Running the Application |
|||
|
|||
After completing the integration, you can run the application and access the AI chat functionality. The chat interface allows you to: |
|||
|
|||
- Get weather information |
|||
- Ask questions about PDF content |
|||
- Retrieve current user information |
|||
- And more! |
|||
|
|||
 |
|||
|
|||
## Conclusion |
|||
|
|||
This integration demonstrates how to leverage the power of AI in your ABP Framework applications. The .NET AI Chat Template provides a solid foundation for building intelligent chat interfaces, and ABP Framework makes it more powerful. |
|||
|
|||
## References |
|||
|
|||
- [ABP Single Layer Solution](https://abp.io/docs/latest/solution-templates/single-layer-web-application/overview) |
|||
- [.NET AI Template Documentation](https://devblogs.microsoft.com/dotnet/announcing-dotnet-ai-template-preview1/) |
|||
- [GitHub Personal Access Tokens Guide](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) |
|||
|
|||
## Source Code |
|||
|
|||
- [AbpAiChat Source Code](https://github.com/abpframework/abp-samples/tree/master/AIChat) |
|||
|
After Width: | Height: | Size: 236 KiB |
|
After Width: | Height: | Size: 1.8 MiB |
@ -0,0 +1,38 @@ |
|||
You Asked, We Delivered: Introducing Our New Training Bootcamp\! |
|||
|
|||
Over the past months we’ve heard from countless freelancers, individuals and small teams asking for a focused, high-impact training without the overwhelming commitment or high costs of traditional bootcamps. So here we are\! |
|||
|
|||
We're excited to introduce **ABP Bootcamp: Mastering Infrastructure & Features**, a full training experience designed to help developers level up fast with practical knowledge they can apply immediately. |
|||
|
|||
This live, instructor-led program delivers four days of in-depth, real-world training on ABP’s infrastructure and core features. |
|||
|
|||
**Bootcamp Details** |
|||
|
|||
Dates: July 1,2,3,4 2025 |
|||
Time: 17:00-19:00 (UTC) each day |
|||
Format: Live, online sessions |
|||
Price: $399 (discounted $799) |
|||
Seats: Limited to a small group |
|||
|
|||
### **What You’ll Learn** |
|||
|
|||
By the end of this bootcamp, you’ll have: |
|||
|
|||
\-A solid understanding of ABP’s infrastructure, systems, and design patterns |
|||
\-Practical experience with features like dependency injection, configuration, logging, and localization |
|||
\-The ability to implement email templating, event bus, caching, and custom settings in real applications |
|||
\-Knowledge of best practices for building scalable, maintainable, and high-performance solutions with ABP |
|||
|
|||
### **Who It’s For** |
|||
|
|||
This bootcamp is ideal for: |
|||
|
|||
\-Developers and freelancers using ABP in their daily work |
|||
\-Teams looking to speed up onboarding and improve development efficiency |
|||
\-Anyone who wants practical ABP knowledge without committing to long-format training programs |
|||
|
|||
### **Reserve Your Spot** |
|||
|
|||
Seats are limited to keep the experience interactive and personalized. With the current 50% discount, this is the most accessible way to gain hands-on ABP experience with expert guidance. |
|||
|
|||
**Registration is now open. Secure your place today and master the infrastructure that powers ABP. Register here: [https://docs.google.com/forms/d/e/1FAIpQLSckMZChdqIJIuWiEvg\_KsSDmrxagRdc5WBYceAemHLrmT1oiA/viewform](https://docs.google.com/forms/d/e/1FAIpQLSckMZChdqIJIuWiEvg_KsSDmrxagRdc5WBYceAemHLrmT1oiA/viewform)** |
|||
|
After Width: | Height: | Size: 30 KiB |
@ -0,0 +1,93 @@ |
|||
# Solving MongoDB GUID Issues After an ABP Framework Upgrade |
|||
|
|||
So, you've just upgraded your ABP Framework application to a newer version (like v9.2.0+) and suddenly, your application can't read data from its MongoDB database. You're seeing strange deserialization errors, especially related to `Guid` types. What's going on? |
|||
|
|||
You've likely run into a classic compatibility issue with the MongoDB .NET driver. |
|||
|
|||
### The Problem: Legacy vs. Standard GUIDs |
|||
|
|||
Here's the short version: |
|||
|
|||
* **Old MongoDB Drivers** (used in older ABP versions) stored `Guid` values in a format called `CSharpLegacy`. |
|||
* **New MongoDB Drivers** (v3.0+), now default to a universal `Standard` format. |
|||
|
|||
When your newly upgraded app tries to read old data, the new driver expects the `Standard` format but finds `CSharpLegacy`. The byte orders don't match, and... boom. Deserialization fails. |
|||
|
|||
The ABP Framework team has an excellent official guide covering this topic in detail. We highly recommend reading their **[MongoDB Driver 2 to 3 Migration Guide](https://abp.io/docs/latest/release-info/migration-guides/MongoDB-Driver-2-to-3)** for a full understanding. |
|||
|
|||
Our tip below serves as a fast, application-level fix if you need to get your system back online quickly without performing a full data migration. |
|||
|
|||
### The Quick Fix: Tell the Driver to Use the Old Format |
|||
|
|||
Instead of changing your data, you can simply tell the new driver to continue using the old `CSharpLegacy` format for all `Guid` and `Guid?` properties. This provides immediate backward compatibility without touching your database. |
|||
|
|||
It’s a simple, two-step process. |
|||
|
|||
#### Step 1: Create a Custom Convention |
|||
|
|||
First, create this class in your `.MongoDb` project. It tells the serializer how to handle `Guid` types. |
|||
|
|||
```csharp |
|||
using MongoDB.Bson; |
|||
using MongoDB.Bson.Serialization; |
|||
using MongoDB.Bson.Serialization.Conventions; |
|||
using MongoDB.Bson.Serialization.Serializers; |
|||
using System; |
|||
|
|||
public class LegacyGuidConvention : ConventionBase, IMemberMapConvention |
|||
{ |
|||
public void Apply(BsonMemberMap memberMap) |
|||
{ |
|||
if (memberMap.MemberType == typeof(Guid)) |
|||
{ |
|||
memberMap.SetSerializer(new GuidSerializer(GuidRepresentation.CSharpLegacy)); |
|||
} |
|||
else if (memberMap.MemberType == typeof(Guid?)) |
|||
{ |
|||
var guidSerializer = new GuidSerializer(GuidRepresentation.CSharpLegacy); |
|||
var nullableGuidSerializer = new NullableSerializer<Guid>(guidSerializer); |
|||
memberMap.SetSerializer(nullableGuidSerializer); |
|||
} |
|||
} |
|||
} |
|||
``` |
|||
|
|||
#### Step 2: Register the Convention at Startup |
|||
|
|||
Now, register this convention in your `YourProjectMongoDbModule.cs` file. Add this code to the top of the `ConfigureServices` method. This ensures your rule is applied globally as soon as the application starts. |
|||
|
|||
```csharp |
|||
using Volo.Abp.Modularity; |
|||
using MongoDB.Bson.Serialization; |
|||
using MongoDB.Bson.Serialization.Conventions; |
|||
|
|||
public class YourProjectMongoDbModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
// Fix Start |
|||
var conventionPack = new ConventionPack { new LegacyGuidConvention() }; |
|||
ConventionRegistry.Register( |
|||
"LegacyGuidConvention", |
|||
conventionPack, |
|||
t => true); // Apply to all types |
|||
// Fix End |
|||
|
|||
// ... Your existing ConfigureServices code |
|||
} |
|||
} |
|||
``` |
|||
|
|||
### An Alternative to Full Data Migration |
|||
|
|||
It's important to note that the method described here is an **application-level fix**. It's a fantastic alternative to performing a full data migration, which involves writing scripts to convert every legacy GUID in your database. |
|||
|
|||
If you are interested in the more permanent, data-centric approach, the ABP.IO community has a detailed guide on [**Migrating MongoDB GUIDs from Legacy to Standard Format**](https://abp.io/community/articles/migrating-mongodb-guids-from-legacy-to-standard-format-mongodb-v2-to-v3-dqwybdtw). |
|||
|
|||
Our quick fix is ideal for getting a system back online fast or when a database migration is too complex. The full migration is better for long-term standards compliance. Choose the path that best fits your project's needs! |
|||
|
|||
### That's It! |
|||
|
|||
Restart your application, and the errors should be gone. Your app can now correctly read its old `Guid` data, and it will continue to write new data in the same legacy format, ensuring consistency. |
|||
|
|||
This approach is a lifesaver for existing projects, saving you from a risky and time-consuming data migration. For brand-new projects, you might consider starting with the `Standard` representation, but for everything else, this is a clean and effective fix. Happy coding! |
|||
@ -0,0 +1,113 @@ |
|||
# 🚀 New in ABP Studio: Modular Docker Container Management |
|||
|
|||
We're excited to announce a new improvement to Docker integration in **ABP Studio**! |
|||
With the latest update, you can now manage Docker containers **individually**, add or remove them dynamically, and launch them **either separately or collectively** — all within the Studio. |
|||
|
|||
 |
|||
|
|||
------ |
|||
|
|||
## 🔄 What Has Changed? |
|||
|
|||
In previous versions, Docker dependencies were handled using a **single `docker-compose.override.yml` file**, which was **automatically generated** when creating a new solution if it is needed. |
|||
|
|||
By default, this file included common development dependencies like PostgreSQL, Redis, RabbitMQ, etc., and was executed through a predefined script named `docker-dependencies` in the Solution Runner. |
|||
|
|||
While this approach worked well for simple setups, it had some limitations: |
|||
|
|||
- All services were bundled into a **single compose file**. |
|||
- Adding or removing services required modifying this central file. |
|||
- It wasn't possible to **start or stop individual containers independently**. |
|||
|
|||
------ |
|||
|
|||
## ✅ What's New? |
|||
|
|||
With the latest ABP Studio update: |
|||
|
|||
- Each Docker container can now be defined in its **own `docker-compose` file**. |
|||
- Compose files can be **added or removed** from the Studio UI. |
|||
- Containers can be: |
|||
- **Started or stopped individually**. |
|||
- **Started/stopped in bulk**. |
|||
- The **Solution Runner** recognizes Docker containers and can run them alongside application projects. |
|||
|
|||
------ |
|||
|
|||
## ⚠️ Important Notes Before You Start |
|||
|
|||
### Required: Use `container_name` for Docker Service Matching |
|||
|
|||
When working with the new modular Docker system in ABP Studio, each service **must define a `container_name`**. |
|||
This name is used by ABP Studio to **identify and map** Docker containers to their corresponding service entries in the Studio UI. |
|||
|
|||
#### Why is this mandatory? |
|||
|
|||
- ABP Studio relies on `container_name` to: |
|||
- Detect whether the service is stopped or continue running. |
|||
- Perform **start**, **stop**, and **status check** operations reliably. |
|||
- Match Studio UI entries with actual running Docker containers. |
|||
- Without a `container_name`, container discovery may fail and **service management features might not work as expected**. |
|||
|
|||
#### Example: |
|||
|
|||
``` |
|||
services: |
|||
redis: |
|||
container_name: redis |
|||
image: redis:7 |
|||
ports: |
|||
- "6379:6379" |
|||
networks: |
|||
- my-network |
|||
``` |
|||
|
|||
> If you do **not** define `container_name`, ABP Studio will be unable to track or control the service properly. |
|||
|
|||
------ |
|||
|
|||
## 📥 Migrating from the Old System |
|||
|
|||
If you're using the old method with a centralized compose file: |
|||
|
|||
Before: |
|||
|
|||
``` |
|||
docker-compose -f docker-compose.override.yml up -d |
|||
``` |
|||
|
|||
Now: |
|||
|
|||
1. Create separate `docker-compose` files for each service |
|||
(e.g., `docker-compose.postgres.yml`, `docker-compose.redis.yml`). |
|||
2. Go to the **Solution Runner tab in ABP Studio**. |
|||
3. Use the **“Add Docker Service”** option in Studio to register each file. |
|||
4. Optionally remove or archive the old monolithic compose file. |
|||
|
|||
> If your original `docker-compose.override.yml` contains multiple services, you can split it into individual files — Docker Compose and ABP Studio both support modular composition. |
|||
|
|||
------ |
|||
|
|||
## ⚙️ Advanced: Shared Network |
|||
|
|||
If your containers need to communicate over a shared network, you can define an external network in each compose file like this: |
|||
|
|||
``` |
|||
networks: |
|||
my-network: |
|||
external: true |
|||
``` |
|||
|
|||
ABP Studio automatically creates the network if they do no exist. But if you like you can create the network once using: |
|||
|
|||
``` |
|||
docker network create my-network |
|||
``` |
|||
|
|||
------ |
|||
|
|||
## 📚 Additional Resources |
|||
|
|||
- Docker Compose Documentation |
|||
- ABP Studio Documentation (link to updated docs when ready) |
|||
- [Report Issues on GitHub](https://github.com/abpframework/abp/issues) |
|||
|
After Width: | Height: | Size: 42 KiB |
@ -0,0 +1,250 @@ |
|||
# Using Hangfire Dashboard in ABP API Website 🚀 |
|||
|
|||
## Introduction |
|||
|
|||
In this article, I'll show you how to integrate and use the Hangfire Dashboard in an ABP API website. |
|||
|
|||
Typically, API websites use `JWT Bearer` authentication, but the Hangfire Dashboard isn't compatible with `JWT Bearer` authentication. Therefore, we need to implement `Cookies` and `OpenIdConnect` authentication for the Hangfire Dashboard access. |
|||
|
|||
## Creating a New ABP Demo Project 🛠️ |
|||
|
|||
We'll create a new ABP Demo `Tiered` project that includes `AuthServer`, `API`, and `Web` projects. |
|||
|
|||
```bash |
|||
abp new AbpHangfireDemoApp -t app --tiered |
|||
``` |
|||
|
|||
Now let's add the Hangfire Dashboard to the `API` project and configure it to use `Cookies` and `OpenIdConnect` authentication for accessing the dashboard. |
|||
|
|||
## Adding a New Hangfire Application 🔧 |
|||
|
|||
We need to add a new Hangfire application to the `appsettings.json` file in the `DbMigrator` project: |
|||
|
|||
> **Note:** Replace `44371` with your `API` project's port. |
|||
|
|||
```json |
|||
"OpenIddict": { |
|||
"Applications": { |
|||
//... |
|||
"AbpHangfireDemoApp_Hangfire": { |
|||
"ClientId": "AbpHangfireDemoApp_Hangfire", |
|||
"RootUrl": "https://localhost:44371/" |
|||
} |
|||
//... |
|||
} |
|||
} |
|||
``` |
|||
|
|||
2. Update the `OpenIddictDataSeedContributor`'s `CreateApplicationsAsync` method in the `Domain` project to seed the new Hangfire application. |
|||
|
|||
```csharp |
|||
//Hangfire Client |
|||
var hangfireClientId = configurationSection["AbpHangfireDemoApp_Hangfire:ClientId"]; |
|||
if (!hangfireClientId.IsNullOrWhiteSpace()) |
|||
{ |
|||
var hangfireClientRootUrl = configurationSection["AbpHangfireDemoApp_Hangfire:RootUrl"]!.EnsureEndsWith('/'); |
|||
|
|||
await CreateApplicationAsync( |
|||
applicationType: OpenIddictConstants.ApplicationTypes.Web, |
|||
name: hangfireClientId!, |
|||
type: OpenIddictConstants.ClientTypes.Confidential, |
|||
consentType: OpenIddictConstants.ConsentTypes.Implicit, |
|||
displayName: "Hangfire Application", |
|||
secret: configurationSection["AbpHangfireDemoApp_Hangfire:ClientSecret"] ?? "1q2w3e*", |
|||
grantTypes: new List<string> //Hybrid flow |
|||
{ |
|||
OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.Implicit |
|||
}, |
|||
scopes: commonScopes, |
|||
redirectUris: new List<string> { $"{hangfireClientRootUrl}signin-oidc" }, |
|||
postLogoutRedirectUris: new List<string> { $"{hangfireClientRootUrl}signout-callback-oidc" }, |
|||
clientUri: hangfireClientRootUrl, |
|||
logoUri: "/images/clients/aspnetcore.svg" |
|||
); |
|||
} |
|||
``` |
|||
|
|||
3. Run the `DbMigrator` project to seed the new Hangfire application. |
|||
|
|||
### Adding Hangfire Dashboard to the `API` Project 📦 |
|||
|
|||
1. Add the following packages and modules dependencies to the `API` project: |
|||
|
|||
```bash |
|||
<PackageReference Include="Volo.Abp.BackgroundJobs.HangFire" Version="9.2.0" /> |
|||
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.OpenIdConnect" Version="9.2.0" /> |
|||
<PackageReference Include="Hangfire.SqlServer" Version="1.8.20" /> |
|||
``` |
|||
|
|||
```cs |
|||
typeof(AbpBackgroundJobsHangfireModule), |
|||
typeof(AbpAspNetCoreAuthenticationOpenIdConnectModule) |
|||
``` |
|||
|
|||
2. Add the `HangfireClientId` and `HangfireClientSecret` to the `appsettings.json` file in the `API` project: |
|||
|
|||
```csharp |
|||
"AuthServer": { |
|||
"Authority": "https://localhost:44358", |
|||
"RequireHttpsMetadata": true, |
|||
"MetaAddress": "https://localhost:44358", |
|||
"SwaggerClientId": "AbpHangfireDemoApp_Swagger", |
|||
"HangfireClientId": "AbpHangfireDemoApp_Hangfire", |
|||
"HangfireClientSecret": "1q2w3e*" |
|||
} |
|||
``` |
|||
|
|||
3. Add the `ConfigureHangfire` method to the `API` project to configure Hangfire: |
|||
|
|||
```csharp |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
var configuration = context.Services.GetConfiguration(); |
|||
var hostingEnvironment = context.Services.GetHostingEnvironment(); |
|||
|
|||
//... |
|||
|
|||
//Add Hangfire |
|||
ConfigureHangfire(context, configuration); |
|||
//... |
|||
} |
|||
|
|||
private void ConfigureHangfire(ServiceConfigurationContext context, IConfiguration configuration) |
|||
{ |
|||
context.Services.AddHangfire(config => |
|||
{ |
|||
config.UseSqlServerStorage(configuration.GetConnectionString("Default")); |
|||
}); |
|||
} |
|||
``` |
|||
|
|||
4. Modify the `ConfigureAuthentication` method to add new `Cookies` and `OpenIdConnect` authentication schemes: |
|||
|
|||
```csharp |
|||
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) |
|||
{ |
|||
context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) |
|||
.AddAbpJwtBearer(options => |
|||
{ |
|||
options.Authority = configuration["AuthServer:Authority"]; |
|||
options.RequireHttpsMetadata = configuration.GetValue<bool>("AuthServer:RequireHttpsMetadata"); |
|||
options.Audience = "AbpHangfireDemoApp"; |
|||
|
|||
options.ForwardDefaultSelector = httpContext => httpContext.Request.Path.StartsWithSegments("/hangfire", StringComparison.OrdinalIgnoreCase) |
|||
? CookieAuthenticationDefaults.AuthenticationScheme |
|||
: null; |
|||
}) |
|||
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme) |
|||
.AddAbpOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options => |
|||
{ |
|||
options.Authority = configuration["AuthServer:Authority"]; |
|||
options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]); |
|||
options.ResponseType = OpenIdConnectResponseType.Code; |
|||
|
|||
options.ClientId = configuration["AuthServer:HangfireClientId"]; |
|||
options.ClientSecret = configuration["AuthServer:HangfireClientSecret"]; |
|||
|
|||
options.UsePkce = true; |
|||
options.SaveTokens = true; |
|||
options.GetClaimsFromUserInfoEndpoint = true; |
|||
|
|||
options.Scope.Add("roles"); |
|||
options.Scope.Add("email"); |
|||
options.Scope.Add("phone"); |
|||
options.Scope.Add("AbpHangfireDemoApp"); |
|||
|
|||
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; |
|||
}); |
|||
|
|||
//... |
|||
} |
|||
``` |
|||
|
|||
5. Add a custom middleware and `UseAbpHangfireDashboard` after `UseAuthorization` in the `OnApplicationInitialization` method: |
|||
|
|||
```csharp |
|||
//... |
|||
app.UseAuthorization(); |
|||
|
|||
app.Use(async (httpContext, next) => |
|||
{ |
|||
if (httpContext.Request.Path.StartsWithSegments("/hangfire", StringComparison.OrdinalIgnoreCase)) |
|||
{ |
|||
var authenticateResult = await httpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme); |
|||
if (!authenticateResult.Succeeded) |
|||
{ |
|||
await httpContext.ChallengeAsync( |
|||
OpenIdConnectDefaults.AuthenticationScheme, |
|||
new AuthenticationProperties |
|||
{ |
|||
RedirectUri = httpContext.Request.Path + httpContext.Request.QueryString |
|||
}); |
|||
return; |
|||
} |
|||
} |
|||
await next.Invoke(); |
|||
}); |
|||
app.UseAbpHangfireDashboard("/hangfire", options => |
|||
{ |
|||
options.AsyncAuthorization = new[] |
|||
{ |
|||
new AbpHangfireAuthorizationFilter() |
|||
}; |
|||
}); |
|||
|
|||
//... |
|||
``` |
|||
|
|||
Perfect! 🎉 Now you can run the `AuthServer` and `API` projects and access the Hangfire Dashboard at `https://localhost:44371/hangfire`. |
|||
|
|||
> **Note:** Replace `44371` with your `API` project's port. |
|||
|
|||
The first time you access the Hangfire Dashboard, you'll be redirected to the login page of the `AuthServer` project. After you log in, you'll be redirected back to the Hangfire Dashboard. |
|||
|
|||
 |
|||
|
|||
## Key Points 🔑 |
|||
|
|||
### 1. Authentication Scheme Selection |
|||
|
|||
The default authentication scheme in API websites is `JWT Bearer`. We've implemented `Cookies` and `OpenIdConnect` specifically for the Hangfire Dashboard. |
|||
|
|||
We've configured the `JwtBearerOptions`'s `ForwardDefaultSelector` to use `CookieAuthenticationDefaults.AuthenticationScheme` for Hangfire Dashboard requests. |
|||
|
|||
This means that if the request path starts with `/hangfire`, the request will be authenticated using the `Cookies` authentication scheme; otherwise, it will use the `JwtBearer` authentication scheme. |
|||
|
|||
```csharp |
|||
options.ForwardDefaultSelector = httpContext => httpContext.Request.Path.StartsWithSegments("/hangfire", StringComparison.OrdinalIgnoreCase) |
|||
? CookieAuthenticationDefaults.AuthenticationScheme |
|||
: null; |
|||
``` |
|||
|
|||
### 2. Custom Middleware for Authentication |
|||
|
|||
We've also implemented a custom middleware to handle `Cookies` authentication for the Hangfire Dashboard. If the current request isn't authenticated with the `Cookies` authentication scheme, it will be redirected to the login page. |
|||
|
|||
```csharp |
|||
app.Use(async (httpContext, next) => |
|||
{ |
|||
if (httpContext.Request.Path.StartsWithSegments("/hangfire", StringComparison.OrdinalIgnoreCase)) |
|||
{ |
|||
var authenticateResult = await httpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme); |
|||
if (!authenticateResult.Succeeded) |
|||
{ |
|||
await httpContext.ChallengeAsync( |
|||
OpenIdConnectDefaults.AuthenticationScheme, |
|||
new AuthenticationProperties |
|||
{ |
|||
RedirectUri = httpContext.Request.Path + httpContext.Request.QueryString |
|||
}); |
|||
return; |
|||
} |
|||
} |
|||
await next.Invoke(); |
|||
}); |
|||
``` |
|||
|
|||
## References 📚 |
|||
|
|||
- [ABP Hangfire Background Job Manager](https://abp.io/docs/latest/framework/infrastructure/background-jobs/hangfire) |
|||
- [Use cookie authentication in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-9.0) |
|||
|
After Width: | Height: | Size: 4.9 MiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 200 KiB After Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 296 KiB After Width: | Height: | Size: 183 KiB |
@ -0,0 +1,46 @@ |
|||
# ABP Version 9.3 Migration Guide |
|||
|
|||
This document is a guide for upgrading ABP v9.2 solutions to ABP v9.3. There are some changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application. |
|||
|
|||
## Updated `RabbitMQ.Client` to `7.x` |
|||
|
|||
In this version, we updated `RabbitMQ.Client` to `7.1.2`. [This is a major version update](https://github.com/rabbitmq/rabbitmq-dotnet-client/blob/main/v7-MIGRATION.md) that brings significant improvements to the library: |
|||
|
|||
1. Full async/await support throughout the entire public API and internals |
|||
2. Improved performance and resource utilization |
|||
3. Better error handling and connection management |
|||
|
|||
With this update, you should update your method calls to use the new async/await support (in the RabbitMQ related provider packages). There are some method signature changes and new API calls, aligned with the new API. You can see the internal changes we made in [#22510](https://github.com/abpframework/abp/pull/22510) and make the relevant changes in your code. |
|||
|
|||
## Docs Module: Export as PDF |
|||
|
|||
In this version, we have introduced a new feature to the [Docs Module](../../modules/docs.md) that allows you to export the documentation as a PDF file. (Administrators generate PDF files from the back-office side, and then "Download PDF" button appears on the document system, allowing users to download the compiled documentation as a PDF file.) |
|||
|
|||
While implementing this feature, we have made changes in some services of the Docs Module. Typically, you don't need to make any changes in your code unless you have overridden or used internal services of the Docs Module. |
|||
|
|||
For example, the `ProjectAdminAppService` constructor has been changed to accept a new parameter: |
|||
|
|||
```diff |
|||
public class ProjectAdminAppService : ApplicationService, IProjectAdminAppService |
|||
{ |
|||
public ProjectAdminAppService( |
|||
IProjectRepository projectRepository, |
|||
IDocumentRepository documentRepository, |
|||
IDocumentFullSearch elasticSearchService, |
|||
IGuidGenerator guidGenerator, |
|||
+ IProjectPdfFileStore projectPdfFileStore) |
|||
} |
|||
``` |
|||
|
|||
You can see the all internal changes we made in [#22430](https://github.com/abpframework/abp/pull/22430) and [#22922](https://github.com/abpframework/abp/pull/22922) and make the relevant changes in your code if needed. |
|||
|
|||
## Angular UI: Migrating NPM Packages to Standalone Structure |
|||
|
|||
In this version, we've updated our Angular packages to support the new standalone components architecture. This is a non-breaking change - your existing module-based applications will continue to work without any modifications. However, if you wish to migrate to the standalone approach, [we've provided the necessary updates in our packages](https://github.com/abpframework/abp/pull/22829). |
|||
|
|||
The main changes include: |
|||
- Updated routing configurations to support both module-based and standalone approaches |
|||
- Added support for standalone components in ABP Suite code generation |
|||
- Updated schematics to support both module-based and standalone templates |
|||
|
|||
For detailed migration steps and best practices, please refer to our upcoming documentation and/or blog post. The migration is optional, and you can continue using the module-based approach if you prefer. |
|||
|
After Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 16 KiB |