Open Closed

Application crashes when running generate-proxy with external packages #1745


User avatar
0
danieljudge10@gmail.com created
  • ABP Framework version: v4.4.0
  • UI type: Angular
  • DB provider: EF Core
  • Tiered (MVC) or Identity Server Separated (Angular): no

I'm currently getting and issue when trying to run generate proxy on the cli after adding the chargebee package which crashes the application and fails to run the proxies. I have also tried creating a new project and get the same behaviour.

I've created a dummy entity and this simple function in it, as well as the interface and controller and it works successfully in swagger.

        public virtual async Task<List<Item>> GetChargebeePlans()
        {
            ListResult chargebeePlans = await Item.List().Limit(10).RequestAsync();
            List<Item> chargebeeItems = new List<Item>();

            foreach (var item in chargebeePlans.List)
            {
                chargebeeItems.Add(item.Item);
            }

            return chargebeeItems;

        }

Before this function generate-proxy works fine, but afterwards it crashes I get an error in the web server output, below is an extract:

[13:33:39 DBG] Executing HealthCheck collector HostedService.
[13:33:39 INF] Start processing HTTP request GET https://localhost:44348/health-status
[13:33:39 INF] Sending HTTP request GET https://localhost:44348/health-status
[13:33:39 INF] Request starting HTTP/1.1 GET https://localhost:44348/health-status - -
[13:33:39 INF] Executing endpoint 'Health checks'
[13:33:39 INF] Executed endpoint 'Health checks'
[13:33:39 INF] Received HTTP response headers after 17.0992ms - 200
[13:33:39 INF] End processing HTTP request after 17.2147ms - 200
[13:33:39 INF] Request finished HTTP/1.1 GET https://localhost:44348/health-status - - - 200 - application/json 18.0426ms
[13:33:39 DBG] HealthReportCollector - health report execution history saved.
[13:33:39 DBG] HealthReport history already exists and is in the same state, updating the values.
[13:33:39 DBG] HealthReportCollector has completed.
[13:33:39 DBG] HealthCheck collector HostedService executed successfully.
[13:33:40 INF] Request starting HTTP/1.1 GET https://localhost:44348/api/abp/api-definition?includeTypes=true - -
[13:33:40 INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController.Get (Volo.Abp.AspNetCore.Mvc)'
[13:33:40 INF] Route matched with {area = "abp", action = "Get", controller = "AbpApiDefinition", page = ""}. Executing controller action with signature Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel Get(Volo.Abp.Http.Modeling.ApplicationApiDescriptionModelRequestDto) on controller Volo.Abp.AspNetCore.Mvc.ApiExploring.AbpApiDefinitionController (Volo.Abp.AspNetCore.Mvc).
[13:33:40 DBG] ActionApiDescriptionModel.Create: Dummy.GetListAsyncByInput
[13:33:40 DBG] ActionApiDescriptionModel.Create: Dummy.GetAsyncById
[13:33:40 DBG] ActionApiDescriptionModel.Create: Dummy.CreateAsyncByInput
[13:33:40 DBG] ActionApiDescriptionModel.Create: Dummy.UpdateAsyncByIdAndInput
[13:33:40 DBG] ActionApiDescriptionModel.Create: Dummy.DeleteAsyncById
[13:33:40 DBG] ActionApiDescriptionModel.Create: Dummy.GetChargebeePlans
Stack overflow.
   at System.ReadOnlySpan`1[[System.__Canon, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ToArray()
   at System.RuntimeType.GetInterfaces()
   at Volo.Abp.Reflection.ReflectionHelper.AddImplementedGenericTypes(System.Collections.Generic.List`1<System.Type>, System.Type, System.Type)
   at Volo.Abp.Reflection.ReflectionHelper.GetImplementedGenericTypes(System.Type, System.Type)
   at Volo.Abp.Reflection.TypeHelper.IsEnumerable(System.Type, System.Type ByRef, Boolean)
   at Volo.Abp.AspNetCore.Mvc.AspNetCoreApiDescriptionModelProvider.AddCustomTypesToModel(Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel, System.Type)
   at Volo.Abp.AspNetCore.Mvc.AspNetCoreApiDescriptionModelProvider.AddCustomTypesToModel(Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel, System.Type)
   at Volo.Abp.AspNetCore.Mvc.AspNetCoreApiDescriptionModelProvider.AddCustomTypesToModel(Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel, System.Type)
   at Volo.Abp.AspNetCore.Mvc.AspNetCoreApiDescriptionModelProvider.AddCustomTypesToModel(Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel, System.Type)
   at Volo.Abp.AspNetCore.Mvc.AspNetCoreApiDescriptionModelProvider.AddCustomTypesToModel(Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel, System.Type)
   at Volo.Abp.AspNetCore.Mvc.AspNetCoreApiDescriptionModelProvider.AddCustomTypesToModel(Volo.Abp.Http.Modeling.ApplicationApiDescriptionModel, System.Type)
   ...

Those errors repeat ~15000 times, I can provide the full output if it helps.


6 Answer(s)
  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi

    Can you share the code of Item?

  • User Avatar
    0
    danieljudge10@gmail.com created

    Item is from Chargebee, below is what I get from the package, the souce can be found at https://github.com/chargebee/chargebee-dotnet/blob/master/ChargeBee/Models/Item.cs

    #region Assembly ChargeBee, Version=2.9.1.0, Culture=neutral, PublicKeyToken=2efc9456dd1bdb9d
    // C:\Users\xxxxxx\.nuget\packages\chargebee\2.10.0\lib\netstandard2.0\ChargeBee.dll
    #endregion
    
    using ChargeBee.Api;
    using ChargeBee.Filters.Enums;
    using ChargeBee.Internal;
    using Newtonsoft.Json.Linq;
    using System;
    using System.Collections.Generic;
    using System.IO;
    
    namespace ChargeBee.Models
    {
        public class Item : Resource
        {
            public Item();
            public Item(Stream stream);
            public Item(TextReader reader);
            public Item(string jsonString);
    
            public bool EnabledForCheckout { get; }
            public bool EnabledInPortal { get; }
            public bool? IncludedInMrr { get; }
            public ItemApplicabilityEnum ItemApplicability { get; }
            public string GiftClaimRedirectUrl { get; }
            public bool Metered { get; }
            public bool IsGiftable { get; }
            public UsageCalculationEnum? UsageCalculation { get; }
            public DateTime? ArchivedAt { get; }
            public List<ItemApplicableItem> ApplicableItems { get; }
            public JToken Metadata { get; }
            public string Unit { get; }
            public bool? IsShippable { get; }
            public string RedirectUrl { get; }
            public string ItemFamilyId { get; }
            public DateTime? UpdatedAt { get; }
            public long? ResourceVersion { get; }
            public StatusEnum? Status { get; }
            public string Description { get; }
            public string Name { get; }
            public string Id { get; }
            public TypeEnum ItemType { get; }
    
            public static CreateRequest Create();
            public static EntityRequest<Type> Delete(string id);
            public static ItemListRequest List();
            public static EntityRequest<Type> Retrieve(string id);
            public static UpdateRequest Update(string id);
    
            public enum StatusEnum
            {
                UnKnown = 0,
                Active = 1,
                Archived = 2,
                Deleted = 3
            }
            public enum TypeEnum
            {
                UnKnown = 0,
                Plan = 1,
                Addon = 2,
                Charge = 3
            }
            public enum ItemApplicabilityEnum
            {
                UnKnown = 0,
                All = 1,
                Restricted = 2
            }
            public enum UsageCalculationEnum
            {
                UnKnown = 0,
                SumOfUsages = 1,
                LastUsage = 2,
                MaxUsage = 3
            }
    
            public class CreateRequest : EntityRequest<CreateRequest>
            {
                public CreateRequest(string url, HttpMethod method);
    
                public CreateRequest ApplicableItems(List<string> applicableItems);
                public CreateRequest Description(string description);
                public CreateRequest EnabledForCheckout(bool enabledForCheckout);
                public CreateRequest EnabledInPortal(bool enabledInPortal);
                public CreateRequest GiftClaimRedirectUrl(string giftClaimRedirectUrl);
                public CreateRequest Id(string id);
                public CreateRequest IncludedInMrr(bool includedInMrr);
                public CreateRequest IsGiftable(bool isGiftable);
                public CreateRequest IsShippable(bool isShippable);
                public CreateRequest ItemApplicability(ItemApplicabilityEnum itemApplicability);
                public CreateRequest ItemFamilyId(string itemFamilyId);
                public CreateRequest Metadata(JToken metadata);
                public CreateRequest Metered(bool metered);
                public CreateRequest Name(string name);
                public CreateRequest RedirectUrl(string redirectUrl);
                public CreateRequest Type(TypeEnum type);
                public CreateRequest Unit(string unit);
                public CreateRequest UsageCalculation(UsageCalculationEnum usageCalculation);
            }
            public class UpdateRequest : EntityRequest<UpdateRequest>
            {
                public UpdateRequest(string url, HttpMethod method);
    
                public UpdateRequest ApplicableItems(List<string> applicableItems);
                [Obsolete]
                public UpdateRequest ClearApplicableItems(bool clearApplicableItems);
                public UpdateRequest Description(string description);
                public UpdateRequest EnabledForCheckout(bool enabledForCheckout);
                public UpdateRequest EnabledInPortal(bool enabledInPortal);
                public UpdateRequest GiftClaimRedirectUrl(string giftClaimRedirectUrl);
                public UpdateRequest IncludedInMrr(bool includedInMrr);
                public UpdateRequest IsShippable(bool isShippable);
                public UpdateRequest ItemApplicability(ItemApplicabilityEnum itemApplicability);
                public UpdateRequest ItemFamilyId(string itemFamilyId);
                public UpdateRequest Metadata(JToken metadata);
                public UpdateRequest Name(string name);
                public UpdateRequest RedirectUrl(string redirectUrl);
                public UpdateRequest Status(StatusEnum status);
                public UpdateRequest Unit(string unit);
            }
            public class ItemListRequest : ListRequestBase<ItemListRequest>
            {
                public ItemListRequest(string url);
    
                public BooleanFilter<ItemListRequest> EnabledForCheckout();
                public BooleanFilter<ItemListRequest> EnabledInPortal();
                public StringFilter<ItemListRequest> Id();
                public BooleanFilter<ItemListRequest> IsGiftable();
                public EnumFilter<ItemApplicabilityEnum, ItemListRequest> ItemApplicability();
                public StringFilter<ItemListRequest> ItemFamilyId();
                public BooleanFilter<ItemListRequest> Metered();
                public StringFilter<ItemListRequest> Name();
                public ItemListRequest SortById(SortOrderEnum order);
                public ItemListRequest SortByName(SortOrderEnum order);
                public ItemListRequest SortByUpdatedAt(SortOrderEnum order);
                public EnumFilter<StatusEnum, ItemListRequest> Status();
                public EnumFilter<TypeEnum, ItemListRequest> Type();
                public TimestampFilter<ItemListRequest> UpdatedAt();
                public EnumFilter<UsageCalculationEnum, ItemListRequest> UsageCalculation();
            }
            public class ItemApplicableItem : Resource
            {
                public ItemApplicableItem();
    
                public string Id();
            }
        }
    }
    
  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi

    I guess the JToken cause the problem.

    You can create another class and convert the Item to yours.

    https://github.com/chargebee/chargebee-dotnet/blob/master/ChargeBee/Models/Item.cs#L156

  • User Avatar
    0
    danieljudge10@gmail.com created

    Thanks for that.

    Looks like that is the issue, I created a copy with the JToken and got the same error, then removed it and it worked. Any further information on why this causes it or hope for a more permanent solution? It's used in a lot of the models for Chargebee and I would rather avoid the headaches of maintaining a copy of them all, especially when it comes to billing.

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi

    There are self-referencing properties in the JToken class, which can cause infinite recursion in some cases.

    I suggest you create a new class instead of using it in input and output DTO.

  • User Avatar
    0
    ServiceBot created
    Support Team Automatic process manager

    This question has been automatically marked as stale because it has not had recent activity.

Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
Do you need assistance from an ABP expert?
Schedule a Meeting
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v9.2.0-preview. Updated on March 13, 2025, 04:08