Skip to content

[dotnet-sdk-6.0.100-rc.2.21454.3] Cannot create instance of type 'Sentry.Dsn' when launch just-an-email #58852

Description

@Junjun-zhao

Application Name: just-an-email
OS: Windows 10 RS5
CPU: X64
.NET Build Number: dotnet-sdk-6.0.100-rc.2.21454.3

Verify Scenarios:

1). Windows rs5 x64 + dotnet-sdk-6.0.100-rc.1.21451.16: Sentry Package2.1.5:Pass
2). Windows rs5 x64 + dotnet-sdk-6.0.100-rc.2.21454.3+Sentry Package 3.0.0:Pass
3). Windows rs5 x64 + dotnet-sdk-6.0.100-rc.2.21454.3+Sentry Package2.1.5: Fail
4). Windows rs5 x64 + dotnet-sdk-6.0.100-rc.2.21457.4+Sentry Package2.1.5: Fail
5). Windows rs5 x64 + dotnet-sdk-6.0.100-rc.2.21458.9+Sentry Package2.1.5: Fail

Github Repo link: https://github.com/mustakimali/just-an-email
App Source and App checking at :https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1396752

Repro steps:
This is 6.0 app upgraded from .NET Core 3.1.

1.Launch application “JustSending.exe”.
2.Access http://localhost:5000 using Edge.

Expected Result:
The app is launched successfully.

Actual Result:
Failed to launch the app with exception that Cannot create instance of type 'Sentry.Dsn'.

Exception Details:

System.InvalidOperationException: Cannot create instance of type 'Sentry.Dsn' because it is missing a public parameterless constructor.
   at Microsoft.Extensions.Configuration.ConfigurationBinder.CreateInstance(Type type)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.GetPropertyValue(PropertyInfo property, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindProperty(PropertyInfo property, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindNonScalar(IConfiguration configuration, Object instance, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration configuration, Object instance, Action`1 configureOptions)
   at Microsoft.Extensions.Options.NamedConfigureFromConfigurationOptions`1.<>c__DisplayClass1_0.<.ctor>b__0(TOptions options)
   at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options)
   at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
   at Microsoft.Extensions.Options.UnnamedOptionsManager`1.get_Value()
   at Microsoft.AspNetCore.Builder.ApplicationBuilderExtensions.UseSentry(IApplicationBuilder app)
   at Sentry.AspNetCore.SentryStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder e)
   at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
   at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)

Minimal Repro steps:

  1. Create ASP.NET Core MVC Project(.NET Core 3.1) and then retarget it to .NET 6.0.
  2. Install Sentry.AspNetCore Package2.1.5.
  3. Add settings to aspsettings.
 "Sentry": {
    "Dsn": ""
  }
  1. use Sentry:
 public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Build().Run();
        }

        public static IHostBuilder BuildWebHost(string[] args) =>
           Host.CreateDefaultBuilder(args)
               .ConfigureWebHostDefaults(builder =>
               {
                   builder
                       .UseSentry()
                       .UseStartup<Startup>();
               })
    }
  1. Build and Run

Expected Result:
Page should be loaded successfully

Actual Result:

System.InvalidOperationException: Cannot create instance of type 'Sentry.Dsn' because it is missing a public parameterless constructor.
   at Microsoft.Extensions.Configuration.ConfigurationBinder.CreateInstance(Type type)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.GetPropertyValue(PropertyInfo property, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindProperty(PropertyInfo property, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindNonScalar(IConfiguration configuration, Object instance, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration configuration, Object instance, Action`1 configureOptions)
   at Microsoft.Extensions.Options.NamedConfigureFromConfigurationOptions`1.<>c__DisplayClass1_0.<.ctor>b__0(TOptions options)
   at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options)
   at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
   at Microsoft.Extensions.Options.UnnamedOptionsManager`1.get_Value()
   at Microsoft.AspNetCore.Builder.ApplicationBuilderExtensions.UseSentry(IApplicationBuilder app)
   at Sentry.AspNetCore.SentryStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder e)
   at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
   at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)

Additional Information:
Sentry has a big change in 3.0.0 version. This issue doesn't repro with this version.
You can see https://github.com/getsentry/sentry-dotnet/releases?after=3.2.0
For Dsn:
Dsn is just a string
SentryOptions now take a string for Dsn:

Before: o.Dsn = new Dsn("..");
After: o.Dsn = "..";

In Sentry code , different way to create IwebHostBuilder.
Before

 public static IWebHostBuilder UseSentry(
            this IWebHostBuilder builder,
            Action<WebHostBuilderContext, SentryAspNetCoreOptions> configureOptions)
        {
            // The earliest we can hook the SDK initialization code with the framework
            // Initialization happens at a later time depending if the default MEL backend is enabled or not.
            // In case the logging backend was replaced, init happens later, at the StartupFilter
            builder.ConfigureLogging((context, logging) =>
            {
                logging.AddConfiguration();
                var section = context.Configuration.GetSection("Sentry");
                logging.Services.Configure<SentryAspNetCoreOptions>(section);

                if (configureOptions != null)
                {
                    logging.Services.Configure<SentryAspNetCoreOptions>(options =>
                    {
                        configureOptions(context, options);
                    });
                }
                logging.Services.AddSingleton<IConfigureOptions<SentryAspNetCoreOptions>, SentryAspNetCoreOptionsSetup>();
                logging.Services.AddSingleton<ILoggerProvider, SentryAspNetCoreLoggerProvider>();
                logging.AddFilter<SentryAspNetCoreLoggerProvider>(
                    "Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware",
                    LogLevel.None);
                logging.Services.AddSentry();
            });
            builder.ConfigureServices(c =>
            {
                c.AddTransient<IStartupFilter, SentryStartupFilter>();
            });
            return builder;
}

After

 public static IWebHostBuilder UseSentry(
            this IWebHostBuilder builder,
            Action<WebHostBuilderContext, SentryAspNetCoreOptions>? configureOptions)
            => builder.UseSentry((context, sentryBuilder) =>
                sentryBuilder.AddSentryOptions(options => configureOptions?.Invoke(context, options)));


public static ISentryBuilder AddSentryOptions(this ISentryBuilder builder,
            Action<SentryAspNetCoreOptions>? configureOptions)
        {
            if (configureOptions != null)
            {
                builder.Services.Configure(configureOptions);
            }

            return builder;
        }

@dotnet-actwx-bot @dotnet/compat

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions