Activities of "jkrause"

@liangshiwei thank you for your initial analysis. Is there any underlying explanation why this particular project is affected by it? We started a complete new project using ABP Suite 5.2 and even without the DisplayAttribute this project is fast and responsive.

@liangshiwei, what mail address can I forward the details to? Thanks.

Hi,

We have been integrating ABP Commercial Business into our new project and so far it has been a good experience. Getting our domain and entity models added, we initially opted for using Suite to generate the UI components, but considering and realizing the more unique requirements, eventually settled on adding them manually after studying the generated code.

We opted to move these requirements to their own module where appropriate, and together with two additional modules, Metronic 8 and Multilingual, we have been able to get the authentication and dashboard integration working fine with our data models. The pages are not crazy fast, but consistent, and the 'user experience' is fine considering the current stages of development. It took some getting used to, to figure out where everything should go, especially with the localization and modules, but we feel we are at a good state none the less.

However, we came to the point where we wanted to try and figure out the 'modal' experience, which is also part of the default generated website and the pages generated with Suite. We generated the CRUD experience for 1 particular model, studied the generated code, removed what we didn't need, and added what we did need (mostly Metronic styling). The auto-generated HTTP/API and proxy classes gave an additional hurdle to fully understand the minimal requirements to get it all working together, but we did and the result was good, visually.

We decided on a more traditional approach for the models, whereas the 'index' and 'list' pages are using Knockout JS, but we are using razor pages for loading the modal content. These modals have been using the generated suite ABP tag helpers where applicable and regular (Microsoft) tag-helpers to get the desired output. We do have some script bound to provide an auto-complete experience, but it is with the form rendering where we are experiencing the first serious slowdown.

Loading the 'Create' modal of the model, that is showing your typical "Name, Address" fields takes 3-4 seconds to load. We double checked the API call and verified that it completed in 60ms, so it's not the ABP backend causing a slow-down. Since it is a Create modal, there are no additional DB queries involved, in fact we removed everything that could potentially slow it down, returning an empty new FooViewModel() as the result, but still the dialog loaded extremely slow.

However, this did sped up the initial experience (not having to load all navigation properties, like list of companies, list of users) it did not speed up the modal loading part. We analyzed all we could think of, removing tag-helpers, removing the modal body, enabling trace logging, double-checking no EF queries are being fired. Perhaps slow scripts that could prevent the dialog from showing, but nothing explained the slow-down. We installed AppInsights, but no additional insights into what caused the slow-down. Logging output also revealed no additional information as there are simply 2-3 lines visible where it matches the route and then 3-4secs later an indication that the content is being shown.

We then started to time the entire call, which is divided as follows:

  • ~60ms to initialize/retrieve the 'Get' operation of the CreateModal razor page
  • ~3500ms to render all form controls of the modal
  • ~1000ms to render the two dropdowns containing translated Enum values

We checked with F12 in Chrome/Edge to verify that the website was waiting for the server to render the modal, we also verified this by calling just the 'create-modal' route, and that is taking almost 4 seconds to render. We then removed all form/tag helpers on the modal, and it renders in ~100ms. Then every single form field, using a tag-helper adds 200-400ms delay, and as mentioned earlier, the two dropdowns containing localized Enum values, take upwards to 500ms each.

Checking the Network tab in Chrome reveals the total load time of the modal itself:

We then added a Stopwatch on the Razor page to show the rendering times of each control:

We tried quite a lot of things to determine what could, or should not be part of the issue:

  1. Sending a regular GET request to the API endpoint, request takes 60ms
    • Statement: ABP "Backend" is not the cause of the slowdown
    • Statement: DB queries are not impeding the page load
  2. Requesting the create-modal route itself, dialog still takes 4500ms
    • Statement: Therefor, scripts are not impeding the page load as no scripts are loaded and executed
  3. Removing all modal body content, dialog takes 100ms
    • Statement: ABP "Frontend" itself is likely not causing the slowdown, as the page is rendered quickly, thus issue has to be server-side
  4. Replacing the tag-helpers with @Html.DisplayFor and @Html.Input, dialog takes 200ms
    • Statement: Tag-helpers are somehow causing the slowdown??
  5. Replacing the ABP tag-helpers with Microsoft built-in tag-helpers, dialog takes 3500ms
    • Statement: ABP localization of the select element takes 500ms each (using MS tag-helpers effectively disables the localization that ABP-Select provides)
    • Statement: ABP Tag-helpers are seemingly not the cause of the slowdown
    • Statement: Tag-helpers themselves are seemingly part of the slowdown as the 2nd instance of each tag-helper takes 1ms but the initial slowdown is there

We've partially executed and considered the following alternative approaches:

  • Creating a completely new MVC/Razor application using Suite, re-adding the entity/model/modal/module that we are currently profiling
    • Statement: Not yet completed, as getting the bare minimum host setup working takes considerable time
    • Statement: Justification for taking this route is to eliminate a potentially bad configured Web/Module project
  • Creating a tiered application, allowing us to fully separate from the Web project and then just consuming the API endpoints
    • Statement: Extremely frustrating getting OAuth working, so not been able to even get the login part working
  • Considering ditching the ABP Frontend altogether and creating a SPA-experience using Vue
    • Statement: This creates a huge disadvantage of not having the built-in features available and a huge time-loss as well
  • Start over from scratch, no ABP, just plain vanilla project setup
    • Statement: Last ditch resort, but would set us back ~3 months and we would have to 'reinvent' ABP features
    • Statement Very costly, as we bought the Business edition of ABP Commercial

I realize that one of your first automated replies would probably be: Can you get us an isolated MVP project to showcase the issue? Well sadly, I cannot, our project is currently the smallest application to reproduce the problem.

However, we are more than willing to:

  • Share access to the repository + DB
  • Remote access and diagnosis to the development machine (TeamViewer or similar)
  • Brainstorm over a Google Meet call with screensharing
  • Provide credentials to the Test environment to witness the slow-down

Any help and direction at this point will be appreciated, as we simply cannot figure out why the tag-helpers and localization are causing a slowdown. Did we perhaps make a fatal configuration error with regards to modules and inheritance? Is there another option to enable diagnostic logging to figure out what the "server" is doing for ~4secs?

We've banged our heads against this wall for about a full sprint now (2 weeks) and have reached a point where we need a solution, either hopefully with the expert assistance of your team, or by reaching a different conclusion on how to proceed further.

Thank you very much for your time and effort reading this very lengthy question.

Answer

@albert

You misread my comment completely. I am showing you the before and after from using RC and then Stable. It changes the make-up of the csproj files by adding modules directly as NuGet packages instead of project references.

Answer

Adding a module to a freshly generated website using ABP Suite v5.0.0 (Stable) yields the following error:

Error occurred while adding the module "Acme.Abp.Crm" to the solution "AcmeProject"...

Could not find a class derived from AbpModule in the project '<path-to-project>/<project-name>.csproj'.

This while there is a fully functional project and the AcmeAbpModule.cs file is located in the root of that location and is inheriting the AbpModule class, as it is a completely unmodified new project created by ABP Suite.

In addition, despite the error, the module is created in the .\modules\Acme.Abo.Crm location, and the csproj file is modified to load it. However, upon inspecting the file, it assumes that the project can be referenced as a NuGet package with version 5.0.0 as the assumed version?

In ABP Suite 5.0.0-rc.2 <ProjectReference Include="..\..\modules\Acme.Abp.Crm\src\Acme.Abp.Crm.Web\Acme.Abp.Crm.Web.csproj" />

In ABP Suite 5.0.0 (Stable) <PackageReference Include="Acme.Abp.Crm.Web" Version="5.0.0" />

This breaks all the generated code in the project and logically it will not compile anymore. What am I missing here? Maybe it's time for a reboot..

Answer

Hi @albert,

After updating Suite to RC2 I get this error:

[12:00:50 ERR] Connection id "0HMDR0CIU98V0", Request id "0HMDR0CIU98V0:00000002": An unhandled exception was thrown by the application. Volo.Abp.AbpException: Could not find the bundle file '/libs/abp/core/abp.css' for the bundle 'Lepton.Global'!

Seems the wwwroot folder is missing in the %USERPROFILE%\.dotnet\tools\.store\volo.abp.suite\5.0.0-rc.2\volo.abp.suite\5.0.0-rc.2\tools\net6.0\any folder? When I created that folder and copied the files from the %USERPROFILE%\.dotnet\tools\.store\volo.abp.suite\5.0.0-rc.2\volo.abp.suite\5.0.0-rc.2\staticwebassets\ to that location, it started up and was usable again.

So either the staticwebassets are not being found, or the wwwroot is missing in the publish? (assumptions)

Thanks.

maliming,

I messed up and totally forgot to edit the NuGet.config to remove a certain detail from the feed.

Apologies for this oversight, would it be possible/required to invalidate that key and obtain a new one?

Sorry.

I have a simple project, that is roughly the same size in ZIP as our actual project, but whatever.

You can find the source here: Deleted

The application is setup to use LocalDb 2019 (came with VS2022 installer). After giving the default admin user permissions to see the module, click on the Companies menu item and you will get the error. Saving a new Company gives the same error.

Getting just this simple "clean" application to compile and start was frustration, as the generated files did not compile and some ConsoleTest project refused to build, so I removed that from the solution.

(The ctor generated for Company resulted in an illegal order of parameters in combination with nullable types, so I had to fix that manually)

I will try to reproduce this in a "barren" project, but it might very well not happen, which is exactly why I am asking troubleshooting for our actual project. There are no code samples available anywhere about creating a custom module that needs to use the User and Organization.

I'll report back if I can extract all the effort I did, not happy with this answer. Our actual project is not that much "bigger" than the starting template with 1 custom module containing half a dozen entities.

Answer

The duplication also occurs in the ConfigureServices method of the <MyModule>WebModule file:

(Again, I know this is minor and will not actually produce error situations so understandble if this would be of a lesser priority)

Showing 1 to 10 of 20 entries
Made with ❤️ on ABP v8.3.0-preview Updated on July 04, 2024, 07:07