Activities of "akaziuka"

Thoughts?

** Our tech stack**:

  • ABP Framework version: v7.2.2
  • UI Type: Angular
  • Database System: EF Core (PostgreSQL)
  • Tiered (for MVC) or Auth Server Separated (for Angular): yes

** Question**: Our platform, which we build upon the ABP framework, serves two scenarios: the user access to functionality via an Angular-based portal that relies upon the backend APIs and offering API access for partners who don't want to use the portal but willing to access functionality we offer via the backend API layer. Now, we're facing another scenario where our clients want some sort of widget which is hosted on our end and can be embedded into their application. Their app is Angular as well. Way back, to fulfill scenarios like this, we used to develop responsive pages that could be embedded in somebody's app as an iFrame. My take on iFrames is simple - these days, this way of integration is treated as insecure. This is the context, and here's the list of questions I have and I hope you guys can help to address them:

  • What would be the best approach to widget development? Can it be hosted on our end as an Angular module that others can embed into their applications? Are there any other options to achieve the same result supported by the ABP?
  • iFrame integration (yes/no), any concerns or better ways of integrating something like this
  • What would be the best way to authenticate clients who embed our widget/component into their apps (given the context above)?
  • Is there a way to make this widget (or a set of widgets) client/tenant-specific and manage them as a feature in ABP?

Please advise.

hi

I debug the app, and it works.

Ok, I seem to have figured that out. I found a chunk of code in the HealthChecksBuilderExtensions.cs:

var healthChecksUiBuilder = services.AddHealthChecksUI(settings =>
        {
            settings.AddHealthCheckEndpoint("_3M Health Status", $"http://{System.Net.Dns.GetHostName()}/health-status");
        });

Whereas the right (default) value should have been this:

settings.AddHealthCheckEndpoint("_3M Health Status", healthCheckUrl);

NOTES:

  • The first option should make it work for a containerized environment + k8s (more about it here)
  • The 'default' value/option makes the solution run locally (if running/debugging the solution in the IDE)

It would be good for you guys to document it somewhere :)

It's strange. We never get such feedback.

  1. Can a new template project reproduce the problem on your computer?
  2. You can try your app on another computer
  3. You can try to use https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks directly without abp to see if the same problem exists

I think it's probably an environmental problem.

I tried on multiple devices and all of them show the same behavior. Can you try this code on your end?

Ok, Can you share the full logs when your app started?

liming.ma@volosoft.com

You can also change to https://localhost:44338/health-status and try again. : )

Tried that already and it didn't work. It picks up the machine hostname for some reason instead of the value from the config file. I just sent you the full log file to a specified address.

hi

The default URL in appsettings.json is "HealthCheckUrl": "/health-status"

Can you try to keep it as it is?

As I said in the explanation, I didn't change/tweak the configuration. The current value is "HealthCheckUrl": "/health-status"

  • ABP Framework version: v7.2.2
  • UI Type: Angular
  • Database System: EF Core (PostgreSQL)
  • Tiered (for MVC) or Auth Server Separated (for Angular): yes
  • Exception message and full stack trace: See below
  • Steps to reproduce the issue: Install a solution from template. Rut it (Api.Host locally on Windows 11

To clarify - workstation0912 is my Windows 11 machine name. It's unclear why it resolves to this address if I run the Api.Host locally, instead of https://localhost:44338/health-status, because this is exactly what I have defined in the appconfig.json file. I didn't change the config (except the connection string to a database). Am I missing any sort of configuration for Raider/Visual Studio???

[16:40:55 ERR] GetHealthReport threw an exception when trying to get report from http://WORKSTATION0912/health-status configured with name _3M Health Status.
System.Net.Http.HttpRequestException: No connection could be made because the target machine actively refused it. (workstation0912:80)
 ---> System.Net.Sockets.SocketException (10061): No connection could be made because the target machine actively refused it.
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
   at System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|281_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken)   
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(QueueItem queueItem)
   at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.HttpConnectionWaiter`1.WaitForConnectionAsync(Boolean async, CancellationToken requestCancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)   
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.<SendAsync>g__Core|5_0(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.<SendAsync>g__Core|5_0(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at HealthChecks.UI.Core.HostedService.HealthCheckReportCollector.GetHealthReportAsync(HealthCheckConfiguration configuration) in /_/src/HealthChecks.UI/Core/HostedService/HealthCheckReportCollector.cs:line 122
[16:40:55 DBG] HealthReportCollector - health report execution history saved.
[16:40:55 DBG] Creating a new HealthReport history.
[16:40:55 DBG] HealthReportCollector has completed.
[16:40:55 DBG] HealthCheck collector HostedService executed successfully.
[16:41:05 DBG] Executing HealthCheck collector HostedService.
[16:41:05 INF] Start processing HTTP request GET http://workstation0912/health-status
[16:41:05 INF] Sending HTTP request GET http://workstation0912/health-status
[16:41:17 ERR] GetHealthReport threw an exception when trying to get report from http://WORKSTATION0912/health-status configured with name _3M Health Status.
System.Net.Http.HttpRequestException: No connection could be made because the target machine actively refused it. (workstation0912:80)
 ---> System.Net.Sockets.SocketException (10061): No connection could be made because the target machine actively refused it.
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
   at System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|281_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken)   
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(QueueItem queueItem)
   at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.HttpConnectionWaiter`1.WaitForConnectionAsync(Boolean async, CancellationToken requestCancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)   
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.<SendAsync>g__Core|5_0(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.<SendAsync>g__Core|5_0(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsC

Hi,

You can try:

var builder = WebApplication.CreateBuilder(args); 
    builder.WebHost.UseSentry(); 
    builder.Host 
        .AddAppSettingsSecretsJson() 
        .UseAutofac() 
        .UseSerilog(); 
    await builder.AddApplicationAsync<MyProjectNameWebPublicModule>(); 
    var app = builder.Build(); 
    app.UseSentryTracing(); 
    await app.InitializeApplicationAsync(); 
    await app.RunAsync(); 
    return 0; 

This configuration worked (I saw from the logs it was initializing) but it didn't send transactions to Sentry. I got in contact with Sentry support, and theit support suggested making a change to appsettings,json to include "TracesSampleRate": "1.0" parameter. My config started looking like this: It worked like a charm. Thanks for the help.

  • ABP Framework version: v7.2.2
  • UI type: Angular / Blazor (for the public site)
  • DB provider: EF Core
  • Tiered (MVC) or Identity Server Separated (Angular): AuthServer is separated

Steps to reproduce:

  • Generate a solution based on the Application Template
  • Using official Sentry documentation here: https://docs.sentry.io/platforms/dotnet/guides/aspnetcore/ add changes to the appsettings.json file in the 'xxx.HttpApi.Host' (backend) project.
  • Add changes in the Program.cs like this:
var builder = WebApplication.CreateBuilder(args);
            builder.Host
                .AddAppSettingsSecretsJson()
                .UseAutofac()
                .UseSerilog();
            await builder.AddApplicationAsync<_3MHttpApiHostModule>();
            var app = builder.Build();
            await app.InitializeApplicationAsync();
            await app.RunAsync();
            app.UseSentryTracing();
            return 0;
  • Build solution via etc/build/build-images-locally.ps1
  • Run solution in Docker by executing etc/docker/run-docker.ps1
  • Open the app, call APIs and observe Sentry Dashboard for incoming performance logs The issue is that the integration does not work. Nothing happens after the change is implemented according to instructions. Not sure is the place is correct.

Another question: The official documentation from Sentry suggests using builder.WebHost.UseSentry(); construction. However, the ABP code does not use WebHost. Is there a workaround for that?

Please advise.

hi

Are there any error logs on the backend app?

The only error message I see in the backend is this: 2023-04-26 21:56:31 [01:56:31 INF] OpenIddict.Validation.AspNetCore was not authenticated. Failure message: An error occurred while authenticating the current request.

See more in the full log: https://1drv.ms/t/s!AtmlF7r3uFNtj7J8AlcWTvdp4Fp6aQ?e=VwBs9t

Showing 1 to 10 of 23 entries
Made with ❤️ on ABP v8.2.0-preview Updated on March 25, 2024, 15:11