Open Closed

登陆成功后自动跳转回登陆页面. #10000


User avatar
0
mc86 created

你好 blazor web app项目 登陆后进入系统,几秒后自动跳转回认证网站. 日志已经发到邮箱. web app :本机 https://localhost:44333 host :远程 https://ourdomain:28445 auth :远程 https://ourdomain:28443


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

    好的 我会检查你的日志

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    你的日志级别是info. 请改成debug 后再次发送下日志

    https://abp.io/support/questions/8622/How-to-enable-Debug-logs-for-troubleshoot-problems

    谢谢

  • User Avatar
    0
    mc86 created

    已发送.目前主要是登陆后状态丢失

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    没有收到, 请上传到 https://wetransfer.com/

    谢谢

  • User Avatar
    0
    mc86 created

    已发送

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    尝试把App.razor 中的所有@rendermode="InteractiveAuto" 改成@rendermode="InteractiveServer"试试?

    另外请分享BlazorBlazor.Client的启动模块代码

    谢谢

  • User Avatar
    0
    mc86 created

    InteractiveServer 模式正常.

    blazor

    using System;
    using System.IO;
    using Blazorise.Bootstrap5;
    using Blazorise.Icons.FontAwesome;
    using Medallion.Threading;
    using Medallion.Threading.Redis;
    using Microsoft.AspNetCore.Authentication.Cookies;
    using Microsoft.AspNetCore.Authentication.OpenIdConnect;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.AspNetCore.Http;
    using Master9.Localization;
    using Master9.MultiTenancy;
    using Volo.Abp;
    using Volo.Abp.AspNetCore.Components.Web.Theming.Routing;
    using Volo.Abp.AspNetCore.Mvc.Localization;
    using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
    using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared;
    using Volo.Abp.AspNetCore.Serilog;
    using Volo.Abp.Autofac;
    using Volo.Abp.AutoMapper;
    using Volo.Abp.Localization;
    using Volo.Abp.Modularity;
    using Volo.Abp.Swashbuckle;
    using Volo.Abp.UI.Navigation;
    using Volo.Abp.UI.Navigation.Urls;
    using Volo.Abp.VirtualFileSystem;
    using Microsoft.AspNetCore.DataProtection;
    using Microsoft.Extensions.Options;
    using Microsoft.IdentityModel.Protocols.OpenIdConnect;
    using Microsoft.OpenApi.Models;
    using Master9.Blazor.Client;
    using Master9.Blazor.Client.Navigation;
    using Master9.Blazor.Components;
    using StackExchange.Redis;
    using Volo.Abp.AspNetCore.Authentication.OpenIdConnect;
    using Volo.Abp.AspNetCore.Components.Web;
    using Volo.Abp.AspNetCore.Mvc.Client;
    using Volo.Abp.Caching;
    using Volo.Abp.Caching.StackExchangeRedis;
    using Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Bundling;
    using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme;
    using Volo.Abp.AspNetCore.Components.Server.LeptonXTheme;
    using Volo.Abp.AspNetCore.Components.Server.LeptonXTheme.Bundling;
    using Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme.Bundling;
    using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX;
    using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Bundling;
    using Volo.Abp.LeptonX.Shared;
    using Volo.Abp.DistributedLocking;
    using Volo.Abp.Http.Client.Web;
    using Volo.Abp.Http.Client.IdentityModel.Web;
    using Volo.Abp.Security.Claims;
    using Volo.Abp.Account.LinkUsers;
    using Volo.Abp.Account.Pro.Admin.Blazor.Server;
    using Volo.Abp.Account.Pro.Public.Blazor.Server;
    using Volo.Abp.Account.Public.Web.Impersonation;
    using Volo.Abp.Account.Pro.Public.Blazor.WebAssembly.Bundling;
    using Volo.Abp.Identity.Pro.Blazor;
    using Volo.Abp.Identity.Pro.Blazor.Server;
    using Volo.Abp.AuditLogging.Blazor.Server;
    using Volo.Abp.AuditLogging.Blazor.WebAssembly.Bundling;
    using Volo.Abp.Gdpr.Blazor.Extensions;
    using Volo.Abp.Gdpr.Blazor.Server;
    using Volo.Abp.LanguageManagement.Blazor.Server;
    using Volo.Abp.OpenIddict.Pro.Blazor.Server;
    using Volo.Abp.TextTemplateManagement.Blazor.Server;
    using Volo.Saas.Host;
    using Volo.Saas.Host.Blazor;
    using Volo.Saas.Host.Blazor.Server;
    using Volo.Saas.Host.Blazor.WebAssembly.Bundling;
     
    
    using FollowUp.Blazor.Server;
    using Contract.Blazor.Server;
    using System.Net.Http;
    using DevExpress.Blazor;
    using Volo.Abp.AspNetCore.Mvc.AntiForgery;
    using Volo.Abp.FeatureManagement;
    
    namespace Master9.Blazor;
    
    [DependsOn(
        typeof(AbpCachingStackExchangeRedisModule),
        
        typeof(AbpDistributedLockingModule),
        typeof(AbpAutofacModule),
    	typeof(AbpAccountPublicBlazorWebAssemblyBundlingModule),
    	typeof(AbpAccountPublicWebImpersonationModule),
        typeof(AbpAccountAdminBlazorServerModule),
        typeof(AbpAccountPublicBlazorServerModule),
        typeof(AbpIdentityProBlazorServerModule),
        typeof(TextTemplateManagementBlazorServerModule),
        typeof(AbpAuditLoggingBlazorServerModule),
        typeof(AbpAuditLoggingBlazorWebAssemblyBundlingModule),
        typeof(AbpGdprBlazorServerModule),
        typeof(AbpOpenIddictProBlazorServerModule),
        typeof(LanguageManagementBlazorServerModule),
        typeof(SaasHostBlazorServerModule),
    	typeof(SaasHostBlazorWebAssemblyBundlingModule),
        //typeof(LeptonXThemeManagementBlazorServerModule),
        typeof(AbpAspNetCoreComponentsServerLeptonXThemeModule),
        typeof(AbpAspNetCoreComponentsWebAssemblyLeptonXThemeBundlingModule),
        typeof(AbpAspNetCoreMvcUiLeptonXThemeModule),   
        typeof(AbpFeatureManagementHttpApiModule),
        typeof(AbpSwashbuckleModule),
        typeof(AbpAspNetCoreSerilogModule),
        typeof(AbpAspNetCoreMvcClientModule),
        typeof(AbpAspNetCoreAuthenticationOpenIdConnectModule),
        typeof(AbpHttpClientWebModule),
        typeof(AbpHttpClientIdentityModelWebModule),
        typeof(Master9HttpApiClientModule)
        )]
    [DependsOn(typeof(FollowUpBlazorServerModule))]
    [DependsOn(typeof(ContractBlazorServerModule))]
    
    public class Master9BlazorModule : AbpModule
    {
        public override void PreConfigureServices(ServiceConfigurationContext context)
        {
            context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
            {
                options.AddAssemblyResource(
                    typeof(Master9Resource),
                    typeof(Master9DomainSharedModule).Assembly,
                    typeof(Master9ApplicationContractsModule).Assembly,
                    typeof(Master9BlazorModule).Assembly
                );
            });
    
            PreConfigure<AbpAspNetCoreComponentsWebOptions>(options =>
            {
                options.IsBlazorWebApp = true;
            });
        }
    
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            var hostingEnvironment = context.Services.GetHostingEnvironment();
            var configuration = context.Services.GetConfiguration();
    
            if (!configuration.GetValue<bool>("App:DisablePII"))
            {
                Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true;
                Microsoft.IdentityModel.Logging.IdentityModelEventSource.LogCompleteSecurityArtifact = true;
            }
    
            // Add services to the container.
            context.Services.AddRazorComponents()
                .AddInteractiveServerComponents()
                .AddInteractiveWebAssemblyComponents();
            context.Services.AddDevExpressBlazor(configure => configure.BootstrapVersion = BootstrapVersion.v5);
            ConfigureUrls(configuration);
            ConfigureBundles();
            ConfigureAuthentication(context, configuration);
            ConfigureImpersonation(context, configuration);
            ConfigureAutoMapper();
            ConfigureVirtualFileSystem(hostingEnvironment);
            ConfigureSwaggerServices(context.Services);
            ConfigureCache(configuration);
            ConfigureDataProtection(context, configuration, hostingEnvironment);
            ConfigureDistributedLocking(context, configuration);
            ConfigureBlazorise(context);
            ConfigureRouter();
            ConfigureMenu(configuration);
            ConfigureCookieConsent(context);
            ConfigureTheme();
        }
    
        private void ConfigureCookieConsent(ServiceConfigurationContext context)
        {
            context.Services.AddAbpCookieConsent(options =>
            {
                options.IsEnabled = true;
                options.CookiePolicyUrl = "/CookiePolicy";
                options.PrivacyPolicyUrl = "/PrivacyPolicy";
            });
        }
        
        private void ConfigureTheme()
        {
            Configure<LeptonXThemeOptions>(options =>
            {
                options.DefaultStyle = LeptonXStyleNames.System;
            });
    
            Configure<LeptonXThemeBlazorOptions>(options =>
            {
                options.Layout = LeptonXBlazorLayouts.SideMenu;
            });
        }
    
        private void ConfigureUrls(IConfiguration configuration)
        {
            Configure<AppUrlOptions>(options =>
            {
                options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
            });
    
            Configure<AbpAccountLinkUserOptions>(options =>
            {
                options.LoginUrl = configuration["AuthServer:Authority"];
            });
        }
    
        private void ConfigureBundles()
        {
            Configure<AbpBundlingOptions>(options =>
            {
                // Blazor Web App
                options.Parameters.InteractiveAuto = true;
    
                // MVC UI
                options.StyleBundles.Configure(
                    LeptonXThemeBundles.Styles.Global,
                    bundle =>
                    {
                        bundle.AddFiles("/global-styles.css");
                    }
                );
    
                options.ScriptBundles.Configure(
                    LeptonXThemeBundles.Scripts.Global,
                    bundle =>
                    {
                        bundle.AddFiles("/global-scripts.js");
                    }
                );
    
                // Blazor UI
                options.StyleBundles.Configure(
                    BlazorLeptonXThemeBundles.Styles.Global,
                    bundle =>
                    {
                    	bundle.AddFiles("/global-styles.css");
                        //bundle.AddFiles("/blazor-global-styles.css");
                        //You can remove the following line if you don't use Blazor CSS isolation for components
                        //bundle.AddFiles(new BundleFile("/Master9.Blazor.styles.css", true));
                        //bundle.AddFiles(new BundleFile("/Master9.Blazor.Client.styles.css", true));
                    }
                );
            });
    
            Configure<AbpBundlingOptions>(options =>
            {
                var globalStyles = options.StyleBundles.Get(BlazorWebAssemblyStandardBundles.Styles.Global);
                globalStyles.AddContributors(typeof(Master9StyleBundleContributor));
    
                var globalScripts = options.ScriptBundles.Get(BlazorWebAssemblyStandardBundles.Scripts.Global);
                globalScripts.AddContributors(typeof(Master9ScriptBundleContributor));
    
                options.Parameters["LeptonXTheme.Layout"] = "side-menu"; // side-menu or top-menu
            });
        }
    
       
    }
    
        
    
  • User Avatar
    0
    mc86 created

    private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) {

        //Configure&lt;AbpAntiForgeryOptions&gt;(options =>
        //{
        //    options.TokenCookie.Expiration = TimeSpan.FromDays(365);
        //    options.TokenCookie.SameSite = SameSiteMode.None;
        //    options.TokenCookie.SecurePolicy = CookieSecurePolicy.Always;
          
        //});
    
        context.Services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
                 
            })
            .AddCookie("Cookies", options =>
            {
                options.ExpireTimeSpan = TimeSpan.FromDays(365);
              
                options.IntrospectAccessToken();
            })
            .AddAbpOpenIdConnect("oidc", options =>
            {
                options.Authority = configuration["AuthServer:Authority"];
                options.RequireHttpsMetadata = configuration.GetValue&lt;bool&gt;("AuthServer:RequireHttpsMetadata");;
                options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
    
                options.ClientId = configuration["AuthServer:ClientId"];
                options.ClientSecret = configuration["AuthServer:ClientSecret"];
                
                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;
    
                options.Scope.Add("roles");
                options.Scope.Add("email");
                options.Scope.Add("phone");
                options.Scope.Add("Master9");
            });
    
            if (configuration.GetValue&lt;bool&gt;("AuthServer:IsOnK8s"))
            {
                context.Services.Configure&lt;OpenIdConnectOptions&gt;("oidc", options =>
                {
                    options.TokenValidationParameters.ValidIssuers = new[]
                    {
                        configuration["AuthServer:MetaAddress"]!.EnsureEndsWith('/'),
                        configuration["AuthServer:Authority"]!.EnsureEndsWith('/')
                    };
    
                    options.MetadataAddress = configuration["AuthServer:MetaAddress"]!.EnsureEndsWith('/') +
                                            ".well-known/openid-configuration";
    
                    var previousOnRedirectToIdentityProvider = options.Events.OnRedirectToIdentityProvider;
                    options.Events.OnRedirectToIdentityProvider = async ctx =>
                    {
                        // Intercept the redirection so the browser navigates to the right URL in your host
                        ctx.ProtocolMessage.IssuerAddress = configuration["AuthServer:Authority"]!.EnsureEndsWith('/') + "connect/authorize";
    
                        if (previousOnRedirectToIdentityProvider != null)
                        {
                            await previousOnRedirectToIdentityProvider(ctx);
                        }
                    };
                    var previousOnRedirectToIdentityProviderForSignOut = options.Events.OnRedirectToIdentityProviderForSignOut;
                    options.Events.OnRedirectToIdentityProviderForSignOut = async ctx =>
                    {
                        // Intercept the redirection for signout so the browser navigates to the right URL in your host
                        ctx.ProtocolMessage.IssuerAddress = configuration["AuthServer:Authority"]!.EnsureEndsWith('/') + "connect/endsession";
    
                        if (previousOnRedirectToIdentityProviderForSignOut != null)
                        {
                            await previousOnRedirectToIdentityProviderForSignOut(ctx);
                        }
                    };
                });
    
            }
    
        context.Services.Configure&lt;AbpClaimsPrincipalFactoryOptions&gt;(options =>
        {
            options.IsDynamicClaimsEnabled = true;
        });
    }
    
    private void ConfigureImpersonation(ServiceConfigurationContext context, IConfiguration configuration)
    {
        context.Services.Configure&lt;SaasHostBlazorOptions&gt;(options =>
        {
            options.EnableTenantImpersonation = true;
        });
        context.Services.Configure&lt;AbpIdentityProBlazorOptions&gt;(options =>
        {
            options.EnableUserImpersonation = true;
        });
    }
    
    private void ConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment)
    {
        if (hostingEnvironment.IsDevelopment())
        {
            Configure&lt;AbpVirtualFileSystemOptions&gt;(options =>
            {
                options.FileSets.ReplaceEmbeddedByPhysical&lt;Master9DomainSharedModule&gt;(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}Master9.Domain.Shared"));
                options.FileSets.ReplaceEmbeddedByPhysical&lt;Master9ApplicationContractsModule&gt;(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}Master9.Application.Contracts"));
                options.FileSets.ReplaceEmbeddedByPhysical&lt;Master9BlazorModule&gt;(hostingEnvironment.ContentRootPath);
            });
        }
    }
    
    private void ConfigureSwaggerServices(IServiceCollection services)
    {
        services.AddAbpSwaggerGen(
            options =>
            {
                options.SwaggerDoc("v1", new OpenApiInfo { Title = "Master9 API", Version = "v1" });
                options.DocInclusionPredicate((docName, description) => true);
                options.CustomSchemaIds(type => type.FullName);
            }
        );
    }
    
    private void ConfigureCache(IConfiguration configuration)
    {
        Configure&lt;AbpDistributedCacheOptions&gt;(options =>
        {
            options.KeyPrefix = "Master9:";
        });
    }
    
    private void ConfigureDataProtection(
        ServiceConfigurationContext context,
        IConfiguration configuration,
        IWebHostEnvironment hostingEnvironment)
    {
        var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("Master9");
        if (!hostingEnvironment.IsDevelopment())
        {
            var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
            dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "Master9-Protection-Keys");
        }
    }
    
    private void ConfigureDistributedLocking(
        ServiceConfigurationContext context,
        IConfiguration configuration)
    {
        context.Services.AddSingleton&lt;IDistributedLockProvider&gt;(sp =>
        {
            var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
            return new RedisDistributedSynchronizationProvider(connection.GetDatabase());
        });
    }
    
    private void ConfigureBlazorise(ServiceConfigurationContext context)
    {
        context.Services
            .AddBootstrap5Providers()
            .AddFontAwesomeIcons();
    }
    
    private void ConfigureMenu(IConfiguration configuration)
    {
        Configure&lt;AbpNavigationOptions&gt;(options =>
        {
            options.MenuContributors.Add(new Master9MenuContributor(configuration));
        });
    }
    
    private void ConfigureRouter()
    {
        Configure&lt;AbpRouterOptions&gt;(options =>
        {
            options.AppAssembly = typeof(Master9BlazorModule).Assembly;
            options.AdditionalAssemblies.Add(typeof(Master9BlazorClientModule).Assembly);
        });
    }
    
    private void ConfigureAutoMapper()
    {
        Configure&lt;AbpAutoMapperOptions&gt;(options =>
        {
            options.AddMaps&lt;Master9BlazorModule&gt;();
        });
    }
    
    public override void OnApplicationInitialization(ApplicationInitializationContext context)
    {
        var env = context.GetEnvironment();
        var app = context.GetApplicationBuilder();
    
        app.Use(async (ctx, next) =>
        {
            /* Converting to https to be able to include https URLs in `/.well-known/openid-configuration` endpoint.
             * This should only be done if the request is coming outside of the cluster.  */
            if (ctx.Request.Headers.ContainsKey("from-ingress"))
            {
                ctx.Request.Scheme = "https";
            }
    
            await next();
        });     
        
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
    
        app.UseAbpRequestLocalization();
    
        if (!env.IsDevelopment())
        {
            app.UseErrorPage();
            app.UseHsts();
        }
    
        app.UseCorrelationId();
        app.UseRouting();
        var configuration = context.GetConfiguration();
        if (Convert.ToBoolean(configuration["AuthServer:IsOnK8s"]))
        {
            app.Use(async (context, next) =>
            {
                if (context.Request.Path.Value != null &&
                    context.Request.Path.Value.StartsWith("/appsettings", StringComparison.OrdinalIgnoreCase) &&
                    context.Request.Path.Value.EndsWith(".json", StringComparison.OrdinalIgnoreCase))
                {
                    // Set endpoint to null so the static files middleware will handle the request.
                    context.SetEndpoint(null);
                }
                await next(context);
            });
    
            app.UseStaticFilesForPatterns("appsettings*.json");       
        }
        
           
        
    	app.MapAbpStaticAssets(); 
        app.UseAbpSecurityHeaders();
        app.UseAuthentication();
    
        if (MultiTenancyConsts.IsEnabled)
        {
            app.UseMultiTenancy();
        }
    
        app.UseDynamicClaims();
        app.UseAntiforgery();
        app.UseAuthorization();
        app.UseSwagger();
        app.UseAbpSwaggerUI(options =>
        {
            options.SwaggerEndpoint("/swagger/v1/swagger.json", "Master9 API");
        });
        app.UseAbpSerilogEnrichers();
        app.UseConfiguredEndpoints(builder =>
        {
            builder.MapRazorComponents&lt;App&gt;()
                .AddInteractiveServerRenderMode()
                .AddInteractiveWebAssemblyRenderMode()
                .AddAdditionalAssemblies(builder.ServiceProvider.GetRequiredService&lt;IOptions&lt;AbpRouterOptions&gt;>().Value.AdditionalAssemblies.ToArray());
       
        });
    }
    
  • User Avatar
    0
    mc86 created

    client

    using System;
    using System.Net.Http;
    using Blazorise.Bootstrap5;
    using Blazorise.Icons.FontAwesome;
    using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
    using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.DependencyInjection.Extensions;
    using Master9.Blazor.Client.Navigation;
    using OpenIddict.Abstractions;
    using Volo.Abp.AspNetCore.Components.Web;
    using Volo.Abp.AspNetCore.Components.Web.Theming.Routing;
    using Volo.Abp.Autofac.WebAssembly;
    using Volo.Abp.AutoMapper;
    using Volo.Abp.Modularity;
    using Volo.Abp.UI.Navigation;
    using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
    using Volo.Abp.AspNetCore.Components.WebAssembly.Theming.Bundling;
    using Master9.Blazor.Client.Components.Layout;
    using Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme;
    using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme;
    using Volo.Abp.LeptonX.Shared;
    using Volo.Abp.SettingManagement.Blazor.WebAssembly;
    using Volo.Abp.FeatureManagement.Blazor.WebAssembly;
    using Volo.Abp.Account.Pro.Admin.Blazor.WebAssembly;
    using Volo.Abp.Account.Pro.Public.Blazor.WebAssembly;
    using Volo.Abp.Identity.Pro.Blazor.Server.WebAssembly;
    using Volo.Abp.AuditLogging.Blazor.WebAssembly;
    using Volo.Abp.Gdpr.Blazor.Extensions;
    using Volo.Abp.Gdpr.Blazor.WebAssembly;
    using Volo.Abp.LanguageManagement.Blazor.WebAssembly;
    using Volo.Abp.OpenIddict.Pro.Blazor.WebAssembly;
    using Volo.Abp.TextTemplateManagement.Blazor.WebAssembly;
    using Volo.Saas.Host.Blazor.WebAssembly;
    using FollowUp.Blazor.WebAssembly;
    using Contract.Blazor.WebAssembly;
    
    using DevExpress.Blazor;
    using DevExpress.Blazor.Localization;
    using Master9.Blazor.Client.Resources;
    using System.Globalization;
    
    
    
    namespace Master9.Blazor.Client;
    
    [DependsOn(
        typeof(AbpSettingManagementBlazorWebAssemblyModule),
        typeof(AbpFeatureManagementBlazorWebAssemblyModule),
       
        typeof(AbpAccountAdminBlazorWebAssemblyModule),
        typeof(AbpAccountPublicBlazorWebAssemblyModule),
        typeof(AbpIdentityProBlazorWebAssemblyModule),
        typeof(SaasHostBlazorWebAssemblyModule),
        typeof(AbpOpenIddictProBlazorWebAssemblyModule),
        typeof(AbpAuditLoggingBlazorWebAssemblyModule),
        typeof(AbpGdprBlazorWebAssemblyModule),
        typeof(TextTemplateManagementBlazorWebAssemblyModule),
        typeof(LanguageManagementBlazorWebAssemblyModule),
      
        typeof(AbpAspNetCoreComponentsWebAssemblyLeptonXThemeModule),
        typeof(AbpAutofacWebAssemblyModule),
        typeof(Master9HttpApiClientModule)
    )]
    [DependsOn(typeof(FollowUpBlazorWebAssemblyModule))]
    [DependsOn(typeof(ContractBlazorWebAssemblyModule))]
        public class Master9BlazorClientModule : AbpModule
    {
        public override void PreConfigureServices(ServiceConfigurationContext context)
        {
            PreConfigure<AbpAspNetCoreComponentsWebOptions>(options =>
            {
                options.IsBlazorWebApp = true;
            }); 
        }
        
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            var environment = context.Services.GetSingletonInstance<IWebAssemblyHostEnvironment>();
            var builder = context.Services.GetSingletonInstance<WebAssemblyHostBuilder>();
            context.Services.AddDevExpressBlazor(configure => configure.BootstrapVersion = BootstrapVersion.v5);
            ConfigureDevExpressL18n(builder);
            ConfigureAuthentication(builder);
            ConfigureHttpClient(context, environment);
            ConfigureBlazorise(context);
            ConfigureRouter(context);
            ConfigureMenu(context);
            ConfigureAutoMapper(context);
            ConfigureCookieConsent(context);
            ConfigureTheme();
        }
        
        private void ConfigureCookieConsent(ServiceConfigurationContext context)
        {
            context.Services.AddAbpCookieConsent(options =>
            {
                options.IsEnabled = true;
                options.CookiePolicyUrl = "/CookiePolicy";
                options.PrivacyPolicyUrl = "/PrivacyPolicy";
            });
        }
    
        private void ConfigureTheme()
        {
            Configure<LeptonXThemeOptions>(options =>
            {
                options.DefaultStyle = LeptonXStyleNames.System;
            });
    
            Configure<LeptonXThemeBlazorOptions>(options =>
            {
                // When Layout is changed, the `options.Parameters["LeptonXTheme.Layout"]` in Master9BlazorModule.cs should be updated accordingly.
                options.Layout = LeptonXBlazorLayouts.SideMenu;
            });
        }
    
        private void ConfigureRouter(ServiceConfigurationContext context)
        {
            Configure<AbpRouterOptions>(options =>
            {
                options.AppAssembly = typeof(Master9BlazorClientModule).Assembly;
            });
        }
    
        private void ConfigureMenu(ServiceConfigurationContext context)
        {
            Configure<AbpNavigationOptions>(options =>
            {
                options.MenuContributors.Add(new Master9MenuContributor(context.Services.GetConfiguration()));
            });
        }
    
        private void ConfigureBlazorise(ServiceConfigurationContext context)
        {
            context.Services
                .AddBootstrap5Providers()
                .AddFontAwesomeIcons();
        }
    
        private static void ConfigureAuthentication(WebAssemblyHostBuilder builder)
        {
            builder.Services.AddBlazorWebAppServices();
            //builder.Services.AddBlazorWebAppTieredServices();
        }
        
        private static void ConfigureHttpClient(ServiceConfigurationContext context, IWebAssemblyHostEnvironment environment)
        {
            
            context.Services.AddTransient(sp => new HttpClient()
            {
                BaseAddress = new Uri(environment.BaseAddress),
                
            });
        }
    
        private void ConfigureAutoMapper(ServiceConfigurationContext context)
        {
            Configure<AbpAutoMapperOptions>(options =>
            {
                options.AddMaps<Master9BlazorClientModule>();
            });
        }
        private static void ConfigureDevExpressL18n(WebAssemblyHostBuilder builder)
        {
            builder.Services.AddLocalization();
            //builder.Services.AddLocalization();
            builder.Services.AddSingleton(typeof(IDxLocalizationService), typeof(LocalizationService));
            var culture = new CultureInfo("zh-Hans");
            CultureInfo.DefaultThreadCurrentCulture = culture;
            CultureInfo.DefaultThreadCurrentUICulture = culture;
        }
    }
    
    
  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    收到,我检查一下源码

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    请尝试更新Client项目中的appsetings.json

    {
      "AuthServer": {
        "Authority": "https://master.aysdlrmyy.com:28443"
      },
      "RemoteServices": {
        "Default": {
          "BaseUrl": "https://master.aysdlrmyy.com:44333"
        },
        "AbpAccountPublic": {
          "BaseUrl": "https://master.aysdlrmyy.com:28443"
        }
      }
    }
    
  • User Avatar
    0
    mc86 created

    { "AuthServer": { "Authority": "https://master.aysdlrmyy.com:28443" }, "RemoteServices": { "Default": { "BaseUrl": "https://master.aysdlrmyy.com:28445" }, "AbpAccountPublic": { "BaseUrl": "https://master.aysdlrmyy.com:28443" } } }

    api 部署在https://master.aysdlrmyy.com:28445 端口下. 目前浏览器中报这个错误:warn: Volo.Abp.IdentityModel.IdentityModelAuthenticationService[0] Could not find IdentityClientConfiguration for AbpMvcClient. Either define a configuration for AbpMvcClient or set a default configuration.

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

  • User Avatar
    0
    mc86 created

    项目api 部署在https://master.aysdlrmyy.com:28445 认证 部署在https://master.aysdlrmyy.com:28443 本地blazor host启动路径是https://localhost:44333 查看了迁移记录 https://abp.io/docs/latest/release-info/migration-guides/abp-8-2-blazor-web-app

    https://github.com/abpframework/abp/issues/22622

    修改了RemoteServices.BaseUrl

    "RemoteServices": { "Default": { "BaseUrl": "https://localhost:44333" },

    现在无法wasm下找不到HTTP方法. Unhandled exception rendering component: Could not find remote action for method: System.Threading.Tasks.Task1[Volo.Abp.Application.Dtos.PagedResultDto1[Contract.Shared.LookupDto1[System.Guid]]] GetReviewKeyLookupAsync(Contract.Shared.LookupRequestDto) on the URL: https://localhost:44333 Volo.Abp.AbpException: Could not find remote action for method: System.Threading.Tasks.Task1[Volo.Abp.Application.Dtos.PagedResultDto1[Contract.Shared.LookupDto1[System.Guid]]] GetReviewKeyLookupAsync(Contract.Shared.LookupRequestDto) on the URL: https://localhost:44333 at Volo.Abp.Http.Client.DynamicProxying.ApiDescriptionFinder.FindActionAsync(:44333/HttpClient client, String baseUrl, Type serviceType, MethodInfo method) at Volo.Abp.Http.Client.DynamicProxying.DynamicHttpProxyInterceptor1.<GetActionApiDescriptionModel>d__25[[Contract.ClassOnes.IClassOnesAppService, Contract.Application.Contracts, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext((索引)) at Volo.Abp.Http.Client.DynamicProxying.DynamicHttpProxyInterceptor1.<InterceptAsync>d__24[[Contract.ClassOnes.IClassOnesAppService, Contract.Application.Contracts, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext((索引)) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1.<InterceptAsync>d__31[[Volo.Abp.Http.Client.DynamicProxying.DynamicHttpProxyInterceptor1[[Contract.ClassOnes.IClassOnesAppService, Contract.Application.Contracts, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null]], Volo.Abp.Http.Client, Version=9.3.5.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.Application.Dtos.PagedResultDto1[[Contract.Shared.LookupDto1[[System.Guid, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Contract.Application.Contracts, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null]], Volo.Abp.Ddd.Application.Contracts, Version=9.3.5.0, Culture=neutral, PublicKeyToken=null]].MoveNext((索引)) at Castle.DynamicProxy.AsyncInterceptorBase.<ProceedAsynchronous>d__141[[Volo.Abp.Application.Dtos.PagedResultDto1[[Contract.Shared.LookupDto1[[System.Guid, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Contract.Application.Contracts, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null]], Volo.Abp.Ddd.Application.Contracts, Version=9.3.5.0, Culture=neutral, PublicKeyToken=null]].MoveNext((索引)) at Volo.Abp.Castle.DynamicProxy.CastleAbpMethodInvocationAdapterWithReturnValue1.<ProceedAsync>d__7[[Volo.Abp.Application.Dtos.PagedResultDto1[[Contract.Shared.LookupDto1[[System.Guid, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Contract.Application.Contracts, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null]], Volo.Abp.Ddd.Application.Contracts, Version=9.3.5.0, Culture=neutral, PublicKeyToken=null]].MoveNext((索引)) at Volo.Abp.Validation.ValidationInterceptor.InterceptAsync(:44333/IAbpMethodInvocation invocation) at Volo.Abp.Castle.DynamicProxy.CastleAsyncAbpInterceptorAdapter1.<InterceptAsync>d__31[[Volo.Abp.Validation.ValidationInterceptor, Volo.Abp.Validation, Version=9.3.5.0, Culture=neutral, PublicKeyToken=null],[Volo.Abp.Application.Dtos.PagedResultDto1[[Contract.Shared.LookupDto`1[[System.Guid, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Contract.Application.Contracts, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null]], Volo.Abp.Ddd.Application.Contracts, Version=9.3.5.0, Culture=neutral, PublicKeyToken=null]].MoveNext((索引)) at :44333/Contract.Blazor.Pages.Contract.ClassOnes.GetReviewKeyLookupAsync(String newValue) in E:\Master9.0\modules\Contract\src\Contract.Blazor\Pages\Contract\ClassOnes.razor.cs:line 401 at :44333/Contract.Blazor.Pages.Contract.ClassOnes.OnInitializedAsync() in E:\Master9.0\modules\Contract\src\Contract.Blazor\Pages\Contract\ClassOnes.razor.cs:line 115 at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync((索引)) at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(:44333/Task taskToHandle, ComponentState owningComponentState)

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    你可以分享你的项目源码吗?

    你可以上传到一个私人的Github仓库

    谢谢

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    https://github.com/eren186/master9

    请把仓库设置为私有在上传代码

    谢谢

  • User Avatar
    0
    mc86 created

    已上传

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    好的

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    文件夹都是空的

  • User Avatar
    0
    mc86 created

    重新创建了一个.已发送邀请

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    请私有你的仓库

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    请尝试在Contract.HttpApi.Client项目中创建静态代理文件

    https://abp.io/docs/latest/framework/api-development/static-csharp-clients

  • User Avatar
    0
    mc86 created

    已设置

  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    使用静态代理会解决 Could not find remote action for method: 问题

    https://abp.io/support/questions/10000#answer-3a1d12ae-23c8-a2fb-753d-747ed1b879e2

  • User Avatar
    0
    mc86 created

    之前查看了这个.解决方案也是使用静态代理. 这个是9.3.5目前的BUG?使用动态代理多久可以恢复呢? https://abp.io/support/questions/4300/Abp-Suite-Generating-a-CRUD-page-BUG

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 v10.1.0-preview. Updated on November 04, 2025, 06:41