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

@Junjun-zhao

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions