рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдкрдиреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ .NET Framework MVC рд╕реЗ .NET Core 2.2 MVC рдореЗрдВ Identity Framework рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдореИрдВ рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдкреЛрдореЗрд▓реЛ 2.2.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрд╡ рд╣реБрдЖ рдФрд░ рдЗрд╕рдиреЗ рдПрдХ рдЗрд▓рд╛рдЬ рдХрд┐рдпрд╛ред рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдпрд╛ рдореЗрд░реЗ MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рдХрд▓ рдореИрдВрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рджреЗрдЦрд╛ рдХрд┐ рдкреЛрдореЗрд▓реЛ рдХреЗ рд▓рд┐рдП 3.0.0-рдЖрд░рд╕реА1.рдлрд╛рдЗрдирд▓ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдмреБрджреНрдзрд┐рдорд╛рди рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП .NET рдХреЛрд░ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдерд╛ред
рдореИрдВрдиреЗ рдЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рдФрд░ рдореИрдВрдиреЗ рдкреЛрдореЗрд▓реЛ рдХреЗ 3.0.0-rc1. final рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдХреЛ .NET Core 3 рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред рдореИрдВрдиреЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдФрд░ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕рд╛рдЗрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдФрд░ рд╕рднреА рдЕрдЪреНрдЫреЗ рд▓рдЧ рд░рд╣реЗ рдереЗред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЬрдм рдореЗрд░реЗ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд▓рд╛рдЗрд╡ рд╣реЛрдиреЗ рдХреА рдмрд╛рдд рдЖрдИ, рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рд╕рдордп рд╕рд╛рдЗрдЯ рдкрд░ рд▓рдЧрднрдЧ 100-150 рд▓реЛрдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╣реА рдПрдХ рдХрдВрдЯреЗрдирд░ рдлреИрд▓рддрд╛ рд╣реИ, рдореЗрд░рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ 80-100% рд╕реАрдкреАрдпреВ рддрдХ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА рд▓реЙрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдЯрд╛рдЗрдордЖрдЙрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рддреБрд░рдВрдд рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд░рд╣рд╛ рдерд╛ред
рдореИрдВрдиреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рдХрдВрдЯреЗрдирд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдореМрдХреЛрдВ рдкрд░ рдХреЛрд╢рд┐рд╢ рдХреАред рдЖрдк рдЗрди рджреЛ рдЕрд╡рд╕рд░реЛрдВ рдХреЛ рдиреАрдЪреЗ рдореЗрд░реЗ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдЖрд░рдбреАрдПрд╕ MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
рд▓реЙрдЧ рдХреЛ рд╕реНрдкрд╛рдЗрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдорд╛рдВрдб рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдШреБрдЯрдиреЛрдВ рдкрд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдореЗрдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдХрдВрдЯреЗрдирд░ рд▓реЗрддрд╛ рд╣реИред рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдирд┐рд╡рд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдзрд┐рдХрд░рдг/рд╕рддреНрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдЙрдкрдЬреА рд╣реИрдВ:
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
(рдиреАрдЪреЗ рдкреВрд░реНрдг рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╕реЗ рд╕реНрдирд┐рдкреЗрдЯ)ред
рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЕрдм рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрд╣ рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк.рд╕реАрдПрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдирдП рдХреЙрд▓ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реВрдВред
рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╡рд░реНрдЧ рд╣реИ:
public class Startup
{
private IConfiguration Configuration { get; }
private static readonly ILoggerFactory EfLoggerFactory = LoggerFactory.Create(builder =>
{
builder
.AddFilter((category, level) =>
category == DbLoggerCategory.Database.Command.Name
&& level == LogLevel.Information)
.AddConsole();
});
private readonly IWebHostEnvironment environment;
public Startup(IConfiguration configuration, IWebHostEnvironment environment)
{
this.environment = environment;
Configuration = configuration;
var builder = new ConfigurationBuilder()
.SetBasePath(environment.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{environment.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
var redis = ConnectionMultiplexer.Connect(Configuration.GetConnectionString("RedisConnection"));
services.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "DataProtectionKeys");
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContextPool<MyDbContext>(
options => options.UseLazyLoadingProxies()
.UseLoggerFactory(EfLoggerFactory)
.UseMySql(Configuration.GetConnectionString(ConnectionStringConstants.DefaultConnectionName),
mySqlOptions => { mySqlOptions.ServerVersion(new Version(5, 7, 24), ServerType.MySql); }
));
services.AddIdentity<User, Role>(options =>
{
// TODO: Probably should improve the password complexity - requires changes to the registration logic to handle errors when creating user
options.Password.RequireDigit = false;
options.Password.RequiredLength = 6;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequireLowercase = false;
})
.AddEntityFrameworkStores<MyDbContext>();
services.AddAuthentication()
.AddFacebook(o =>
{
o.AppId = Configuration.GetValue<string>("Facebook:FacebookAppId");
o.AppSecret = Configuration.GetValue<string>("Facebook:FacebookAppSecret");
});
services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/Welcome";
options.AccessDeniedPath = "/Welcome";
});
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = Configuration.GetConnectionString("RedisConnection");
options.InstanceName = Configuration.GetValue<string>("ApplicationRedisKey");
});
services.AddSession();
services.AddResponseCaching();
RegisterServices(services);
services.AddJsEngineSwitcher(options => options.DefaultEngineName = ChakraCoreJsEngine.EngineName)
.AddChakraCore();
services.AddReact();
services.AddMvc()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null; // Enables PascalCase JSON serialization (default for .NET core is camelCase)
})
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
services.AddSignalR().AddStackExchangeRedis(Configuration.GetConnectionString("RedisConnection"), options =>
{
options.Configuration.ChannelPrefix = Configuration.GetValue<string>("SignalRRedisKey");
});
SetStaticConfigValues();
var builder = services.AddControllersWithViews();
if (environment.IsDevelopment())
{
builder.AddRazorRuntimeCompilation();
}
// AWS Config
services.AddDefaultAWSOptions(Configuration.GetAWSOptions());
services.AddAWSService<IAmazonLambda>();
services.AddAWSService<IAmazonS3>();
services.AddAWSService<IAmazonSimpleEmailService>();
}
public void ConfigureContainer(ContainerBuilder builder)
{
var listOfModules = new List<string>
{
"Blah.Bl.Core.Bootstrapper.BlBootstrapper, Blah.Bl.Core",
"Blah.Dal.Core.Bootstrapper.DalBootstrapper, Blah.Dal.Core",
"Blah.Domain.Core.Bootstrapper.DomainBootstrapper, Blah.Domain.Core",
"Blah.WebUI.Core.Bootstrapper.WebBootstrapper, Blah.WebUI.Core"
};
var serviceBootstrappers = new List<Module>();
foreach (var moduleToLoad in listOfModules)
{
var boostrapperType = Type.GetType(moduleToLoad);
var serviceBootstrapper = (Module)Activator.CreateInstance(boostrapperType);
serviceBootstrappers.Add(serviceBootstrapper);
}
serviceBootstrappers.ForEach(module => builder.RegisterModule(module));
}
private void SetStaticConfigValues()
{
ImageHelper.ImageLocation = Configuration.GetValue<string>("ImageLocation");
ImageHelper.ImageBucketName = Configuration.GetValue<string>("ImageBucketName");
}
private void RegisterServices(IServiceCollection services)
{
services.AddOptions();
services.AddScoped<IPasswordHasher<User>, BlowfishPasswordHasher>();
services.AddTransient<IViewRenderService, ViewRenderService>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<IIdentityWrapper, IdentityWrapper>();
services.Configure<PaypalConfigSettings>(options => Configuration.GetSection("Paypal").Bind(options));
services.Configure<FacebookConfigSettings>(options => Configuration.GetSection("Facebook").Bind(options));
}
private ILoggerFactory GetLoggerFactory()
{
IServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddLogging(builder =>
builder.AddConsole()
.AddFilter(DbLoggerCategory.Database.Command.Name, LogLevel.Information));
return serviceCollection.BuildServiceProvider()
.GetService<ILoggerFactory>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
// TODO: Do I want HSTS yet...? probably, uncomment when ready
// app.UseHsts();
}
app.UseHttpsRedirection();
app.UseResponseCaching();
app.UseWhen(x =>
x.Request.HttpContext.Request.Path.ToString().StartsWith("/content/images/"),
appBranch =>
{
appBranch.UseImageHandler();
});
app.UseCookiePolicy();
app.UseSession();
app.UseRewriter(new RewriteOptions()
.AddRewrite("^embed.js", "dist/embed/embed.js", true));
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
//.. other routes including signalr setup
// Default route
endpoints.MapControllerRoute(
name: "Default",
pattern: "{controller=Root}/{action=Index}/{urlId:regex((?i)^[a-z0-9]{{6}}$)?}/{takerId?}");
});
// Initialise ReactJS.NET. Must be before static files.
app.UseReact(config =>
{
// If you want to use server-side rendering of React components,
// add all the necessary JavaScript files here. This includes
// your components as well as all of their dependencies.
// See http://reactjs.net/ for more information. Example:
//config
// .AddScript("~/Scripts/First.jsx")
// .AddScript("~/Scripts/Second.jsx");
// If you use an external build too (for example, Babel, Webpack,
// Browserify or Gulp), you can improve performance by disabling
// ReactJS.NET's version of Babel and loading the pre-transpiled
// scripts. Example:
//config
// .SetLoadBabel(false)
// .AddScriptWithoutTransform("~/Scripts/bundle.server.js");
config.JsonSerializerSettings.ContractResolver = new DefaultContractResolver(); // Enables PascalCase JSON serialization (default for .NET core is camelCase)
config
.SetReuseJavaScriptEngines(true)
.SetLoadBabel(true)
.SetLoadReact(false)
.AddScriptWithoutTransform("./dist/reactjs/runtime.js")
.AddScriptWithoutTransform("./dist/reactjs/vendors.js")
.AddScriptWithoutTransform("./dist/reactjs/components.js");
});
}
}
рдореБрдЭреЗ рд╕рдЪ рдореЗрдВ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕рдХрд╛ рдирд┐рд╡рд╛рд░рдг рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБред рдореИрдВ рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред
рдпрджрд┐ рдЖрдк рдПрдХ рдЕрдкрд╡рд╛рдж рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдкреВрд░реНрдг рдЕрдкрд╡рд╛рдж рд╡рд┐рд╡рд░рдг (рд╕рдВрджреЗрд╢ рдФрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕) рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред
Exception message:
Stack trace:
[2019-10-13 20:31:13.7365] 1 - ERROR - Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware - An unhandled exception has occurred while executing the request.
MySql.Data.MySqlClient.MySqlException (0x80004005): The Command Timeout expired before the operation completed.
---> MySql.Data.MySqlClient.MySqlException (0x80004005): The Command Timeout expired before the operation completed.
---> System.IO.IOException: Unable to read data from the transport connection: Connection timed out.
---> System.Net.Sockets.SocketException (110): Connection timed out
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Security.SslStream.FillBufferAsync[TReadAdapter](TReadAdapter adapter, Int32 minSize)
at System.Net.Security.SslStream.ReadAsyncInternal[TReadAdapter](TReadAdapter adapter, Memory`1 buffer)
at System.Net.Security.SslStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at MySqlConnector.Protocol.Serialization.StreamByteHandler.<ReadBytesAsync>g__DoReadBytesSync|6_0(ArraySegment`1 buffer_) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\StreamByteHandler.cs:line 39
at MySqlConnector.Protocol.Serialization.BufferedByteReader.ReadBytesAsync(IByteHandler byteHandler, ArraySegment`1 buffer, Int32 totalBytesToRead, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\BufferedByteReader.cs:line 37
at MySqlConnector.Protocol.Serialization.ProtocolUtility.ReadPacketAsync(BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func`1 getNextSequenceNumber, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\ProtocolUtility.cs:line 410
at MySqlConnector.Protocol.Serialization.ProtocolUtility.DoReadPayloadAsync(BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func`1 getNextSequenceNumber, ArraySegmentHolder`1 previousPayloads, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\ProtocolUtility.cs:line 468
at MySqlConnector.Protocol.Serialization.ProtocolUtility.ReadPayloadAsync(BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func`1 getNextSequenceNumber, ArraySegmentHolder`1 cache, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\ProtocolUtility.cs:line 463
at MySqlConnector.Protocol.Serialization.StandardPayloadHandler.ReadPayloadAsync(ArraySegmentHolder`1 cache, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\StandardPayloadHandler.cs:line 42
at MySqlConnector.Core.ServerSession.ReceiveReplyAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 732
--- End of stack trace from previous location where exception was thrown ---
at MySqlConnector.Core.ServerSession.ReceiveReplyAsyncAwaited(ValueTask`1 task) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 773
at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ResultSet.cs:line 49
at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 111
at MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary`2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 338
at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList`1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\CommandExecutor.cs:line 63
at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 218
at System.Data.Common.DbCommand.ExecuteReader()
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.QueryingEnumerable`1.Enumerator.MoveNext()
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
at System.Linq.Queryable.First[TSource](IQueryable`1 source, Expression`1 predicate)
at Blah.Bl.Core.Services.QuizStartOgTagsService.GetOgTagsForQuizStart(String urlId, Nullable`1 personalityId) in /Blah.Bl.Core/Services/QuizStartOgTagsService.cs:line 35
at Blah.WebUI.Core.Components.DisplayOgTagsViewComponent.InvokeAsync(String urlId, Nullable`1 personalityId) in /Blah.WebUI.Core/Components/DisplayOgTagsViewComponents.cs:line 22
at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentInvoker.InvokeAsyncCore(ObjectMethodExecutor executor, ViewComponentContext context)
at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentInvoker.InvokeAsync(ViewComponentContext context)
at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentHelper.InvokeCoreAsync(ViewComponentDescriptor descriptor, Object arguments)
at AspNetCore.Views_Quiz_Start.<>c__DisplayClass14_0.<<ExecuteAsync>b__3>d.MoveNext() in /Blah.WebUI.Core/Views/Quiz/Start.cshtml:line 161
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Razor.RazorPage.RenderSectionAsyncCore(String sectionName, Boolean required)
at Microsoft.AspNetCore.Mvc.Razor.RazorPage.RenderSection(String name, Boolean required)
at AspNetCore.Views_Shared__QuizLayout.<ExecuteAsync>b__8_0() in /Blah.WebUI.Core/Views/Shared/_QuizLayout.cshtml:line 6
at Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext.SetOutputContentAsync()
at AspNetCore.Views_Shared__QuizLayout.ExecuteAsync()
at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, Boolean invokeViewStarts)
at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderLayoutAsync(ViewContext context, ViewBufferTextWriter bodyWriter)
at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)
at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, String contentType, Nullable`1 statusCode)
at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ActionContext actionContext, IView view, ViewDataDictionary viewData, ITempDataDictionary tempData, String contentType, Nullable`1 statusCode)
at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync(ActionContext context, ViewResult result)
at Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync(ActionContext context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeResultFilters>g__Awaited|27_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
MySQL рд╕рдВрд╕реНрдХрд░рдг: 5.6.41
рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо: Amazon ECS, Docker, .NET Core 3.0 рд░рдирдЯрд╛рдЗрдо рдмрд╛рдпреЛрдирд┐рдХ рдЗрдореЗрдЬ
Pomelo.EntityFrameworkCore.MySql рд╕рдВрд╕реНрдХрд░рдг: 3.0.0-rc1. final
Microsoft.AspNetCore.App рд╕рдВрд╕реНрдХрд░рдг: 3.0.0
рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рд╡рд┐рд╡рд░рдг:
EF Core рдиреЗ 3.0 рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХреНрд╡реЗрд░реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрджрд▓ рджреАред рдИрдПрдл рдХреЛрд░ 2.2 рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреНрд░рддреНрдпреЗрдХ LINQ рдХреНрд╡реЗрд░реА рдЕрдм рдПрдХ рдПрдХрд▓ SQL рдХрдерди (рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рдХрд┐ LINQ рдХрдИ Include()
рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ Include()
рдХреЙрд▓ рдХреЛ рдПрдХ рдЕрд▓рдЧ SELECT
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдм рдПрдХ рдПрдХрд▓ SELECT
рдкреНрд░рддреНрдпреЗрдХ Include()
рдХреЙрд▓ рдХреЗ рд▓рд┐рдП JOIN
рдХреНрд▓реЙрдЬ рдХреЗ рд╕рд╛рде SELECT
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯред
рдЗрд╕рд╕реЗ рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдЙрддреНрдкрд╛рдж рдмрди рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдореЗрдВ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП https://github.com/aspnet/EntityFrameworkCore/issues/18022 рджреЗрдЦреЗрдВред
рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ MSDN рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдбреЙрдХреНрд╕ рдореЗрдВ Caution
рдмреЙрдХреНрд╕ рднреА рджреЗрдЦреЗрдВ:
рд╕рдВрд╕реНрдХрд░рдг 3.0.0 рдХреЗ рдмрд╛рдж рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдорд┐рд▓ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреЙрдЗрди рдХреЛ рд░рд┐рд▓реЗрд╢рдирд▓ рдкреНрд░рджрд╛рддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрд╛рджрд┐рдд SQL рдХреНрд╡реЗрд░реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдмрдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд SQL рдХреНрд╡реЗрд░реА рдЙрддреНрдкрдиреНрди рдХреА рдереАред рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рд╡рд┐рд╕реНрдлреЛрдЯ рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП LINQ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ LINQ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг:
рдЖрдк рдЕрдкрдиреЗ LINQ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдХрдИ Include()
рдХрдерди рд╣реИрдВред
рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП .NET рдкреНрд░рджрд░реНрд╢рди рдЯреНрд░реЗрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЗрддрдирд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред
рд╕рд╛рде рд╣реА, рдЖрдк рдзреАрдореА рдХреНрд╡реЗрд░реА рд▓реЙрдЧ рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд LINQ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред
@lauxjpn рдЗрд╕ рдХреЗ рд╕рд╛рде рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЙрд╕ рд╕рдордп рд╕реЗ MySQL рдореЗрдВ рдзреАрдореА рдХреНрд╡реЗрд░реА рд▓реЙрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдЬрдм рд╕реЗ рдЙрд╕рдиреЗ рдореЗрд░реА рд╕рд╛рдЗрдЯ рдХреЛ рдиреАрдЪреЗ рд▓рд╛рдпрд╛ред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдкреЛрдореЗрд▓реЛ/рдИрдПрдл рдпрд╛ рдХреБрдЫ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧрдВрднреАрд░ рдореБрджреНрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдПрдХрд▓ рд╢рд╛рдорд┐рд▓() рдерд╛ рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдШреБрдЯрдиреЛрдВ рдкрд░ рд▓рд╛рдпрд╛ред
рдмрд╕ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдпрд╣ рд╡рд╣ рдкреНрд░рд╢реНрди рд╣реИ рдЬрд┐рд╕рдиреЗ рдпрд╣ рдХрд┐рдпрд╛:
var quiz = dbContext.Set<Quiz>()
.Include(x => x.PersonalityOutcomes)
.ThenInclude(x => x.QuizVersion)
.First(x => x.UrlId == urlId);
рдПрдХ Include
рдФрд░ рдПрдХ ThenInclude
ред
рд╢рд╛рдорд┐рд▓ рдиреЗ рдПрдХ рдЗрдирд░ рдЬреЙрдЗрди рдмрдирд╛рдпрд╛, рд▓реЗрдХрд┐рди рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдореЗрдВ рдПрдХ рдХреНрд╡реЗрд░реА рдереА рдЬрд┐рд╕рдиреЗ рдбреЗрдЯрд╛ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд╕реНрдХреИрди рдХрд┐рдпрд╛ред рд╕реБрдВрджрд░ рдард┐рдХрд╛рдиреЗред
рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!