From 4bd5df50faee18e620807f014b81718ca1ff778d Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Fri, 29 Jun 2018 16:17:55 +0300 Subject: [PATCH] Added modal form to the tutorial. --- docs/AutoMapper-Integration.md | 3 + docs/Tutorials/AspNetCore-Mvc/Part-I.md | 10 +- docs/Tutorials/AspNetCore-Mvc/Part-II.md | 188 ++++- docs/Tutorials/AspNetCore-Mvc/Part-III.md | 15 + docs/images/bookstore-add-create-dialog.png | Bin 0 -> 8437 bytes docs/images/bookstore-create-dialog.png | Bin 0 -> 35217 bytes docs/images/bookstore-new-book-button.png | Bin 0 -> 24150 bytes .../Localization/BookStore/en.json | 4 +- .../Localization/BookStore/tr.json | 4 +- .../BookStoreWebAutoMapperProfile.cs | 15 + .../Acme.BookStore.Web/BookStoreWebModule.cs | 26 +- .../Pages/Books/CreateModal.cshtml | 16 + .../Pages/Books/CreateModal.cshtml.cs | 48 ++ .../Pages/Books/Index.cshtml | 12 +- .../wwwroot/pages/books/index.js | 15 +- .../Logs/logs.txt | 651 ++++++++++++++++++ .../MyProjectNameWebAutoMapperProfile.cs | 13 + .../MyProjectNameWebModule.cs | 24 +- 18 files changed, 1024 insertions(+), 20 deletions(-) create mode 100644 docs/AutoMapper-Integration.md create mode 100644 docs/Tutorials/AspNetCore-Mvc/Part-III.md create mode 100644 docs/images/bookstore-add-create-dialog.png create mode 100644 docs/images/bookstore-create-dialog.png create mode 100644 docs/images/bookstore-new-book-button.png create mode 100644 samples/BookStore/src/Acme.BookStore.Web/BookStoreWebAutoMapperProfile.cs create mode 100644 samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml create mode 100644 samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml.cs create mode 100644 templates/mvc/src/MyCompanyName.MyProjectName.Web/Logs/logs.txt create mode 100644 templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebAutoMapperProfile.cs diff --git a/docs/AutoMapper-Integration.md b/docs/AutoMapper-Integration.md new file mode 100644 index 0000000000..d197861f25 --- /dev/null +++ b/docs/AutoMapper-Integration.md @@ -0,0 +1,3 @@ +## AutoMapper Integration + +TODO \ No newline at end of file diff --git a/docs/Tutorials/AspNetCore-Mvc/Part-I.md b/docs/Tutorials/AspNetCore-Mvc/Part-I.md index 464bfe1954..5ba2cce338 100644 --- a/docs/Tutorials/AspNetCore-Mvc/Part-I.md +++ b/docs/Tutorials/AspNetCore-Mvc/Part-I.md @@ -4,10 +4,11 @@ In this tutorial series, you will build an application that is used to manage a list of books & their authors. **Entity Framework Core** (EF Core) will be used as the ORM provider (as it comes pre-configured with the startup template). -This is the second part of the tutorial series. See other parts: +This is the second part of the tutorial series. See all parts: -- Part I (this tutorial) -- [Part II](Part-II.md) +- **Part I: Create the project and a book list page (this tutorial)** +- [Part II: Create, Update and Delete books](Part-II.md) +- [Part III: Integration Tests](Part-III.md) You can download the **source code** of the application [from here](https://github.com/volosoft/abp/tree/master/samples/BookStore). @@ -183,6 +184,7 @@ namespace Acme.BookStore * `BookAppService` is derived from `AsyncCrudAppService` which implements all CRUD methods defined above. * `BookAppService` injects `IRepository` which is the default repository created for the `Book` entity. See the [repository document](../../Repositories.md). +* `BookAppService` uses `IObjectMapper` to convert `Book` objects to `BookDto` objects and vice verse. Startup template uses the [AutoMapper](http://automapper.org/) library as the mapping provider. Since you haven't defined any mapping configuration, AutoMapper's [inline mapping](http://automapper.readthedocs.io/en/latest/Inline-Mapping.html) feature is used to automatically configure the mapping. This works fine if both classes have identical properties, but may cause to problems if they not. See the [AutoMapper integration document](../../AutoMapper-Integration.md) for details. ### Auto API Controllers @@ -355,7 +357,7 @@ Create `index.js` JavaScript file under the `wwwroot/pages/books/` folder: ````js $(function() { - $('#BooksTable').DataTable({ + var dataTable = $('#BooksTable').DataTable({ ajax: abp.libs.datatables.createAjax(acme.bookStore.book.getList), columnDefs: [ { diff --git a/docs/Tutorials/AspNetCore-Mvc/Part-II.md b/docs/Tutorials/AspNetCore-Mvc/Part-II.md index 053f1dfe5c..0791fef352 100644 --- a/docs/Tutorials/AspNetCore-Mvc/Part-II.md +++ b/docs/Tutorials/AspNetCore-Mvc/Part-II.md @@ -4,13 +4,195 @@ In this tutorial series, you will build an application that is used to manage a list of books & their authors. **Entity Framework Core** (EF Core) will be used as the ORM provider (as it comes pre-configured with the startup template). -This is the second part of the tutorial series. See other parts: +This is the second part of the tutorial series. See all parts: -* [Part I](Part-I.md) -* Part II (this tutorial) +* [Part I: Create the project and a book list page](Part-I.md) +* **Part II: Create, Update and Delete books (this tutorial)** +* [Part III: Integration Tests](Part-III.md) You can download the **source code** of the application [from here](https://github.com/volosoft/abp/tree/master/samples/BookStore). ### Creating a New Book +In this section, you will learn how to create a new modal dialog form to create a new book. The result dialog will be like that: + +![bookstore-create-dialog](../../images/bookstore-create-dialog.png) + +#### Create the Modal Form + +Create a new razor page, named `CreateModal.cshtml` under the `Pages/Books` folder of the `Acme.BookStore.Web` project: + +![bookstore-add-create-dialog](../../images/bookstore-add-create-dialog.png) + +##### CreateModal.cshtml.cs + +Open the `CreateModal.cshtml.cs` file (`CreateModalModel` class) and replace with the following code: + +````C# +using System; +using System.ComponentModel.DataAnnotations; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; + +namespace Acme.BookStore.Pages.Books +{ + public class CreateModalModel : AbpPageModel + { + [BindProperty] + public CreateBookViewModel Book { get; set; } + + private readonly IBookAppService _bookAppService; + + public CreateModalModel(IBookAppService bookAppService) + { + _bookAppService = bookAppService; + } + + public async Task OnPostAsync() + { + ValidateModel(); + + var bookDto = ObjectMapper.Map(Book); + await _bookAppService.CreateAsync(bookDto); + + return NoContent(); + } + + public class CreateBookViewModel + { + [Required] + [StringLength(128)] + [Display(Name = "Name")] + public string Name { get; set; } + + [Display(Name = "Type")] + public BookType Type { get; set; } = BookType.Undefined; + + [Display(Name = "PublishDate")] + public DateTime PublishDate { get; set; } + + [Display(Name = "Price")] + public float Price { get; set; } + } + } +} +```` + +* `CreateBookViewModel` is a nested class that will be used to create and post the form. + * Each property has a `[Display]` property which sets the label on the form for the related input. It's also integrated to the localization system. + * Each property has data annotations for validation which is used for validation in the client side and the server side and automatically localized. +* `[BindProperty]` attribute on the `Book` property binds post request data to this property. + +##### AutoMapper Configuration + +`OnPostAsync` method maps `CreateBookViewModel` object to `BookDto` object (which is accepted by the `BookAppService.CreateAsync` method). + +Open the `BookStoreWebAutoMapperProfile` class and add the mapping: + +````C# +using Acme.BookStore.Pages.Books; +using AutoMapper; +using Volo.Abp.AutoMapper; + +namespace Acme.BookStore +{ + public class BookStoreWebAutoMapperProfile : Profile + { + public BookStoreWebAutoMapperProfile() + { + CreateMap() + .Ignore(x => x.Id); + } + } +} + +```` + +Thus, AutoMapper will create the mapping configuration between classes and will ignore the `Id` property of the `BookDto` class (to satisfy the configuration validation - see below). + +##### AutoMapper Configuration Validation + +AutoMapper has a [configuration validation feature](http://automapper.readthedocs.io/en/latest/Configuration-validation.html) which is not enabled for the startup template by default. If you want to perform validation, go to the `BookStoreWebModule` class, find the `ConfigureAutoMapper` method and change the `AddProfile` line as shown below: + +````c# +options.AddProfile(validate: true); +```` + +It's up to you to use validation or not. It can prevent mapping mistakes, but comes with a cost of configuration. See [AutoMapper's documentation](http://automapper.readthedocs.io/en/latest/Configuration-validation.html) to fully understand it. + +##### CreateModal.cshtml + +Open the `CreateModal.cshtml` file and paste the code below: + +````html +@page +@inherits Acme.BookStore.Pages.BookStorePageBase +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@model Acme.BookStore.Pages.Books.CreateModalModel +@{ + Layout = null; +} + + + + + + + + + + +```` + +* This modal uses `abp-dynamic-form` tag helper to automatically create the form from the `CreateBookViewModel` class. + * `abp-model` attribute indicates the model object, the `Book` in this case. + * `data-ajaxForm` attribute makes the form to submit via AJAX, instead of classic page post. + * `abp-form-content` tag helper is a placeholder to render the form. This is optional and needed only if you added some other content in the `abp-dynamic-form` tag. + +#### Add the "New book" Button + +Open the `Pages/Books/Index.cshtml` and change the `abp-card-header` tag as shown below: + +````html + + + +

@L["Books"]

+
+ + + +
+
+```` + +Just added a **New book** button to the **top right** of the table: + +![bookstore-new-book-button](../../images/bookstore-new-book-button.png) + +Open the `wwwroot/pages/books/index.js` and add the following code just after the datatable configuration: + +````js +var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); + +createModal.onResult(function () { + dataTable.ajax.reload(); +}); + +$('#NewBookButton').click(function (e) { + e.preventDefault(); + createModal.open(); +}); +```` + +* `abp.ModalManager` is a helper class to open and manage modals in the client side. It internally uses Twitter Bootstrap's standard modal, but abstracts many details by providing a simple API. + +Now, you can **run the application** and add new books using the new modal form. + +### Updating An Existing Book + TODO... \ No newline at end of file diff --git a/docs/Tutorials/AspNetCore-Mvc/Part-III.md b/docs/Tutorials/AspNetCore-Mvc/Part-III.md new file mode 100644 index 0000000000..18e006adf4 --- /dev/null +++ b/docs/Tutorials/AspNetCore-Mvc/Part-III.md @@ -0,0 +1,15 @@ +## ASP.NET Core MVC Tutorial - Part III + +### About the Tutorial + +In this tutorial series, you will build an application that is used to manage a list of books & their authors. **Entity Framework Core** (EF Core) will be used as the ORM provider (as it comes pre-configured with the startup template). + +This is the third part of the tutorial series. See all parts: + +- [Part I: Create the project and a book list page](Part-I.md) +- [Part II: Create, Update and Delete books](Part-II.md) +- **Part III: Integration Tests (this tutorial)** + +You can download the **source code** of the application [from here](https://github.com/volosoft/abp/tree/master/samples/BookStore). + +TODO... \ No newline at end of file diff --git a/docs/images/bookstore-add-create-dialog.png b/docs/images/bookstore-add-create-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..44398e6b4c4fa0f83881b2e63f29bed6f32f9a6d GIT binary patch literal 8437 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 literal 0 HcmV?d00001 diff --git a/docs/images/bookstore-create-dialog.png b/docs/images/bookstore-create-dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..4691d3c8fab2eed7c2f7a69fe5b6282f901be87c GIT binary patch literal 35217 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 literal 0 HcmV?d00001 diff --git a/docs/images/bookstore-new-book-button.png b/docs/images/bookstore-new-book-button.png new file mode 100644 index 0000000000000000000000000000000000000000..6f1cb321bfd1abbee2d2d94478b0d9633f15cb2b GIT binary patch literal 24150 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 + .Ignore(x => x.Id); + } + } +} diff --git a/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs b/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs index c4442c2418..22a86c9db9 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs @@ -16,21 +16,20 @@ using Volo.Abp; using Volo.Abp.Account.Web; using Volo.Abp.AspNetCore.Modularity; using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc.UI; -using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; +using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.Autofac; +using Volo.Abp.AutoMapper; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Identity; +using Volo.Abp.Identity.Localization; using Volo.Abp.Identity.Web; using Volo.Abp.Localization; using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; -using Volo.Abp.PermissionManagement.Web; using Volo.Abp.Threading; -using Volo.Abp.UI; using Volo.Abp.UI.Navigation; using Volo.Abp.VirtualFileSystem; @@ -46,21 +45,38 @@ namespace Acme.BookStore )] public class BookStoreWebModule : AbpModule { + public override void PreConfigureServices(IServiceCollection services) + { + services.PreConfigure(options => + { + options.AddAssemblyResource(typeof(BookStoreResource), typeof(BookStoreWebModule).Assembly); + }); + } + public override void ConfigureServices(IServiceCollection services) { var hostingEnvironment = services.GetHostingEnvironment(); var configuration = services.BuildConfiguration(); ConfigureDatabaseServices(services, configuration); + ConfigureAutoMapper(services); ConfigureVirtualFileSystem(services, hostingEnvironment); ConfigureLocalizationServices(services); ConfigureNavigationServices(services); ConfigureAutoApiControllers(services); ConfigureSwaggerServices(services); - + services.AddAssemblyOf(); } + private static void ConfigureAutoMapper(IServiceCollection services) + { + services.Configure(options => + { + options.AddProfile(validate: true); + }); + } + private static void ConfigureAutoApiControllers(IServiceCollection services) { services.Configure(options => diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml new file mode 100644 index 0000000000..5766199fbc --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml @@ -0,0 +1,16 @@ +@page +@inherits Acme.BookStore.Pages.BookStorePageBase +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@model Acme.BookStore.Pages.Books.CreateModalModel +@{ + Layout = null; +} + + + + + + + + + \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml.cs b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml.cs new file mode 100644 index 0000000000..a57bd82441 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/CreateModal.cshtml.cs @@ -0,0 +1,48 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; + +namespace Acme.BookStore.Pages.Books +{ + public class CreateModalModel : AbpPageModel + { + [BindProperty] + public CreateBookViewModel Book { get; set; } + + private readonly IBookAppService _bookAppService; + + public CreateModalModel(IBookAppService bookAppService) + { + _bookAppService = bookAppService; + } + + public async Task OnPostAsync() + { + ValidateModel(); + + var bookDto = ObjectMapper.Map(Book); + await _bookAppService.CreateAsync(bookDto); + + return NoContent(); + } + + public class CreateBookViewModel + { + [Required] + [StringLength(128)] + [Display(Name = "Name")] + public string Name { get; set; } + + [Display(Name = "Type")] + public BookType Type { get; set; } = BookType.Undefined; + + [Display(Name = "PublishDate")] + public DateTime PublishDate { get; set; } + + [Display(Name = "Price")] + public float Price { get; set; } + } + } +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml index 56dc8586d3..94a74470ed 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Books/Index.cshtml @@ -8,7 +8,17 @@ } -

@L["Books"]

+ + +

@L["Books"]

+
+ + + +
diff --git a/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/books/index.js b/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/books/index.js index a2a20fad54..fed19a78cc 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/books/index.js +++ b/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/books/index.js @@ -1,5 +1,5 @@ -$(function() { - $('#BooksTable').DataTable({ +$(function () { + var dataTable = $('#BooksTable').DataTable({ ajax: abp.libs.datatables.createAjax(acme.bookStore.book.getList), columnDefs: [ { @@ -20,4 +20,15 @@ } ] }); + + var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); + + createModal.onResult(function () { + dataTable.ajax.reload(); + }); + + $('#NewBookButton').click(function (e) { + e.preventDefault(); + createModal.open(); + }); }); \ No newline at end of file diff --git a/templates/mvc/src/MyCompanyName.MyProjectName.Web/Logs/logs.txt b/templates/mvc/src/MyCompanyName.MyProjectName.Web/Logs/logs.txt new file mode 100644 index 0000000000..75480efcaa --- /dev/null +++ b/templates/mvc/src/MyCompanyName.MyProjectName.Web/Logs/logs.txt @@ -0,0 +1,651 @@ +2018-06-29 16:16:43.259 +03:00 [INF] Starting web host. +2018-06-29 16:16:44.901 +03:00 [INF] User profile is available. Using 'C:\Users\halil\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. +2018-06-29 16:16:44.975 +03:00 [INF] Loaded modules: +2018-06-29 16:16:44.975 +03:00 [INF] - Volo.Abp.Security.AbpSecurityModule +2018-06-29 16:16:44.975 +03:00 [INF] - Volo.Abp.VirtualFileSystem.AbpVirtualFileSystemModule +2018-06-29 16:16:44.975 +03:00 [INF] - Volo.Abp.Localization.AbpLocalizationModule +2018-06-29 16:16:44.975 +03:00 [INF] - Volo.Abp.Authorization.AbpAuthorizationModule +2018-06-29 16:16:44.975 +03:00 [INF] - Volo.Abp.Data.AbpDataModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Timing.AbpTimingModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Settings.AbpSettingsModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.MultiTenancy.AbpMultiTenancyAbstractionsModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Auditing.AbpAuditingModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.EventBus.AbpEventBusModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Guids.AbpGuidsModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Threading.AbpThreadingModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Uow.AbpUnitOfWorkModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Domain.AbpDddDomainModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.PermissionManagement.AbpPermissionManagementDomainSharedModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Serialization.AbpSerializationModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Caching.AbpCachingModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Json.AbpJsonModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.PermissionManagement.AbpPermissionManagementDomainModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Users.AbpUsersDomainSharedModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Identity.AbpIdentityDomainSharedModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Users.AbpUsersAbstractionModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Users.AbpUsersDomainModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Identity.AbpIdentityDomainModule +2018-06-29 16:16:44.976 +03:00 [INF] - MyCompanyName.MyProjectName.MyProjectNameDomainModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.ObjectMapping.AbpObjectMappingModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Validation.AbpValidationModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Http.AbpHttpAbstractionsModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Application.AbpDddApplicationModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.PermissionManagement.AbpPermissionManagementApplicationContractsModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Identity.AbpIdentityApplicationContractsModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.AutoMapper.AbpAutoMapperModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.PermissionManagement.AbpPermissionManagementApplicationModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Identity.AbpIdentityApplicationModule +2018-06-29 16:16:44.976 +03:00 [INF] - MyCompanyName.MyProjectName.MyProjectNameApplicationModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.EntityFrameworkCore.AbpEntityFrameworkCoreModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Users.EntityFrameworkCore.AbpUsersEntityFrameworkCoreModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Identity.EntityFrameworkCore.AbpIdentityEntityFrameworkCoreModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.PermissionManagement.EntityFrameworkCore.AbpPermissionManagementEntityFrameworkCoreModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.SettingManagement.AbpSettingManagementDomainSharedModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.SettingManagement.AbpSettingManagementDomainModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.SettingManagement.EntityFrameworkCore.AbpSettingManagementEntityFrameworkCoreModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.EntityFrameworkCore.SqlServer.AbpEntityFrameworkCoreSqlServerModule +2018-06-29 16:16:44.976 +03:00 [INF] - MyCompanyName.MyProjectName.EntityFrameworkCore.MyProjectNameEntityFrameworkCoreModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Castle.AbpCastleCoreModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Autofac.AbpAutofacModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.AspNetCore.AbpAspNetCoreModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.ApiVersioning.AbpApiVersioningAbstractionsModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Http.AbpHttpModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.UI.AbpUiModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.AspNetCore.Mvc.AbpAspNetCoreMvcModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Identity.AbpIdentityHttpApiModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.UI.Navigation.AbpUiNavigationModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.AbpAspNetCoreMvcUiModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.AbpAspNetCoreMvcUiBootstrapModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.PermissionManagement.Web.AbpPermissionManagementWebModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Identity.Web.AbpIdentityWebModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Bundling.AbpAspNetCoreMvcUiBundlingModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Packages.AbpAspNetCoreMvcUiPackagesModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.AbpAspNetCoreMvcUiThemeSharedModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.Account.Web.AbpAccountWebModule +2018-06-29 16:16:44.976 +03:00 [INF] - Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.AbpAspNetCoreMvcUiBasicThemeModule +2018-06-29 16:16:44.976 +03:00 [INF] - MyCompanyName.MyProjectName.MyProjectNameWebModule +2018-06-29 16:16:45.030 +03:00 [DBG] No class found with auto mapping attributes. +2018-06-29 16:16:46.664 +03:00 [INF] Initialized all modules. +2018-06-29 16:16:46.961 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/ +2018-06-29 16:16:48.937 +03:00 [INF] Route matched with {page = "/Index", area = "", action = "", controller = ""}. Executing action /Index +2018-06-29 16:16:48.959 +03:00 [INF] Executing handler method OnGet with arguments (null) - ModelState is "Valid" +2018-06-29 16:16:49.410 +03:00 [DBG] Added bundle 'Global' to the page in 8.51 ms. +2018-06-29 16:16:49.890 +03:00 [INF] Authorization failed. +2018-06-29 16:16:49.890 +03:00 [INF] Authorization failed. +2018-06-29 16:16:50.772 +03:00 [DBG] Added bundle 'Global' to the page in 4.95 ms. +2018-06-29 16:16:50.794 +03:00 [INF] Executed action /Index in 1851.4723000000001ms +2018-06-29 16:16:50.801 +03:00 [INF] Request finished in 3840.9863ms 200 text/html; charset=utf-8 +2018-06-29 16:16:50.858 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/font-awesome/css/font-awesome.css?_v=636650775792061946 +2018-06-29 16:16:50.858 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/bootstrap/css/bootstrap.css?_v=636650775792091898 +2018-06-29 16:16:50.861 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/toastr/toastr.min.css?_v=636650775792311922 +2018-06-29 16:16:50.865 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/pages/index.css +2018-06-29 16:16:50.865 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/select2/css/select2.min.css?_v=636650775792091898 +2018-06-29 16:16:50.868 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/datatables.net-bs4/css/dataTables.bootstrap4.css?_v=636650775792051921 +2018-06-29 16:16:50.876 +03:00 [INF] Sending file. Request path: '/libs/datatables.net-bs4/css/dataTables.bootstrap4.css'. Physical path: 'D:\Github\abp\templates\mvc\src\MyCompanyName.MyProjectName.Web\wwwroot\libs\datatables.net-bs4\css\dataTables.bootstrap4.css' +2018-06-29 16:16:50.876 +03:00 [INF] Sending file. Request path: '/libs/font-awesome/css/font-awesome.css'. Physical path: 'D:\Github\abp\templates\mvc\src\MyCompanyName.MyProjectName.Web\wwwroot\libs\font-awesome\css\font-awesome.css' +2018-06-29 16:16:50.878 +03:00 [INF] Sending file. Request path: '/pages/index.css'. Physical path: 'D:\Github\abp\templates\mvc\src\MyCompanyName.MyProjectName.Web\wwwroot\pages\index.css' +2018-06-29 16:16:50.878 +03:00 [INF] Sending file. Request path: '/libs/toastr/toastr.min.css'. Physical path: 'D:\Github\abp\templates\mvc\src\MyCompanyName.MyProjectName.Web\wwwroot\libs\toastr\toastr.min.css' +2018-06-29 16:16:50.878 +03:00 [INF] Sending file. Request path: '/libs/select2/css/select2.min.css'. Physical path: 'D:\Github\abp\templates\mvc\src\MyCompanyName.MyProjectName.Web\wwwroot\libs\select2\css\select2.min.css' +2018-06-29 16:16:50.882 +03:00 [INF] Request finished in 20.3453ms 200 text/css +2018-06-29 16:16:50.882 +03:00 [INF] Request finished in 23.8325ms 200 text/css +2018-06-29 16:16:50.882 +03:00 [INF] Request finished in 17.0487ms 200 text/css +2018-06-29 16:16:50.882 +03:00 [INF] Request finished in 17.0913ms 200 text/css +2018-06-29 16:16:50.882 +03:00 [INF] Request finished in 13.4555ms 200 text/css +2018-06-29 16:16:50.889 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/abp/core/abp.js?_v=636650775792061946 +2018-06-29 16:16:50.890 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/jquery/jquery.js?_v=636650775791991919 +2018-06-29 16:16:50.890 +03:00 [INF] The file /libs/jquery/jquery.js was not modified +2018-06-29 16:16:50.891 +03:00 [INF] The file /libs/abp/core/abp.js was not modified +2018-06-29 16:16:50.891 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/abp/jquery/abp.jquery.js?_v=636650775792101911 +2018-06-29 16:16:50.891 +03:00 [INF] The file /libs/abp/jquery/abp.jquery.js was not modified +2018-06-29 16:16:50.893 +03:00 [INF] Request finished in 4.0154ms 304 application/javascript +2018-06-29 16:16:50.893 +03:00 [INF] Request finished in 2.9645ms 304 application/javascript +2018-06-29 16:16:50.894 +03:00 [INF] Request finished in 2.5025ms 304 application/javascript +2018-06-29 16:16:50.894 +03:00 [INF] Sending file. Request path: '/libs/bootstrap/css/bootstrap.css'. Physical path: 'D:\Github\abp\templates\mvc\src\MyCompanyName.MyProjectName.Web\wwwroot\libs\bootstrap\css\bootstrap.css' +2018-06-29 16:16:50.895 +03:00 [INF] Request finished in 36.7849ms 200 text/css +2018-06-29 16:16:50.899 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/jquery-validation/jquery.validate.js?_v=636650775791991919 +2018-06-29 16:16:50.900 +03:00 [INF] The file /libs/jquery-validation/jquery.validate.js was not modified +2018-06-29 16:16:50.900 +03:00 [INF] Request finished in 1.0812ms 304 application/javascript +2018-06-29 16:16:50.901 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/bootstrap/js/bootstrap.bundle.js?_v=636650775792061946 +2018-06-29 16:16:50.901 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/lodash/lodash.min.js?_v=636650775791991919 +2018-06-29 16:16:50.902 +03:00 [INF] The file /libs/lodash/lodash.min.js was not modified +2018-06-29 16:16:50.902 +03:00 [INF] Request finished in 1.1839ms 304 application/javascript +2018-06-29 16:16:50.903 +03:00 [INF] The file /libs/bootstrap/js/bootstrap.bundle.js was not modified +2018-06-29 16:16:50.903 +03:00 [INF] Request finished in 2.492ms 304 application/javascript +2018-06-29 16:16:50.904 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/jquery-form/jquery.form.min.js?_v=636650775791991919 +2018-06-29 16:16:50.906 +03:00 [INF] The file /libs/jquery-form/jquery.form.min.js was not modified +2018-06-29 16:16:50.906 +03:00 [INF] Request finished in 2.4698ms 304 application/javascript +2018-06-29 16:16:50.909 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js?_v=636650775792001923 +2018-06-29 16:16:50.910 +03:00 [INF] The file /libs/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js was not modified +2018-06-29 16:16:50.910 +03:00 [INF] Request finished in 1.3938ms 304 application/javascript +2018-06-29 16:16:50.913 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/select2/js/select2.min.js?_v=636650775792131903 +2018-06-29 16:16:50.914 +03:00 [INF] The file /libs/select2/js/select2.min.js was not modified +2018-06-29 16:16:50.914 +03:00 [INF] Request finished in 1.068ms 304 application/javascript +2018-06-29 16:16:50.914 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/datatables.net/js/jquery.dataTables.js?_v=636650775792061946 +2018-06-29 16:16:50.914 +03:00 [INF] The file /libs/datatables.net/js/jquery.dataTables.js was not modified +2018-06-29 16:16:50.914 +03:00 [INF] Request finished in 0.344ms 304 application/javascript +2018-06-29 16:16:50.914 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/sweetalert/sweetalert.min.js?_v=636650775792001923 +2018-06-29 16:16:50.914 +03:00 [INF] The file /libs/sweetalert/sweetalert.min.js was not modified +2018-06-29 16:16:50.915 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/toastr/toastr.min.js?_v=636650775792371926 +2018-06-29 16:16:50.915 +03:00 [INF] Request finished in 0.8376ms 304 application/javascript +2018-06-29 16:16:50.916 +03:00 [INF] The file /libs/toastr/toastr.min.js was not modified +2018-06-29 16:16:50.916 +03:00 [INF] Request finished in 1.0246ms 304 application/javascript +2018-06-29 16:16:50.918 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/timeago/jquery.timeago.js?_v=636650775792001923 +2018-06-29 16:16:50.919 +03:00 [INF] The file /libs/timeago/jquery.timeago.js was not modified +2018-06-29 16:16:50.919 +03:00 [INF] Request finished in 2.1315ms 304 application/javascript +2018-06-29 16:16:50.922 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/datatables.net-bs4/js/dataTables.bootstrap4.js?_v=636650775792091898 +2018-06-29 16:16:50.923 +03:00 [INF] The file /libs/datatables.net-bs4/js/dataTables.bootstrap4.js was not modified +2018-06-29 16:16:50.924 +03:00 [INF] Request finished in 2.0851ms 304 application/javascript +2018-06-29 16:16:50.925 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:16:50.929 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:16:50.941 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:16:50.954 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:16:50.969 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:16:50.978 +03:00 [INF] Authorization failed. +2018-06-29 16:16:50.978 +03:00 [INF] Authorization failed. +2018-06-29 16:16:50.978 +03:00 [INF] Authorization failed. +2018-06-29 16:16:50.978 +03:00 [INF] Authorization failed. +2018-06-29 16:16:50.978 +03:00 [INF] Authorization failed. +2018-06-29 16:16:50.978 +03:00 [INF] Authorization failed. +2018-06-29 16:16:50.978 +03:00 [INF] Authorization failed. +2018-06-29 16:16:50.978 +03:00 [INF] Authorization failed. +2018-06-29 16:16:50.979 +03:00 [INF] Authorization failed. +2018-06-29 16:16:50.979 +03:00 [INF] Authorization failed. +2018-06-29 16:16:50.995 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:16:51.011 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 36.4215ms. +2018-06-29 16:16:51.019 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:16:51.020 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 78.0374ms +2018-06-29 16:16:51.020 +03:00 [INF] Request finished in 95.3854ms 200 text/plain; charset=utf-8 +2018-06-29 16:16:51.065 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 68.764800000000008ms. +2018-06-29 16:16:51.065 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:16:51.065 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 110.5586ms +2018-06-29 16:16:51.065 +03:00 [INF] Request finished in 136.6448ms 200 text/plain; charset=utf-8 +2018-06-29 16:16:51.090 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/favicon.ico +2018-06-29 16:16:51.093 +03:00 [INF] Request finished in 2.615ms 404 +2018-06-29 16:16:52.553 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/ +2018-06-29 16:16:52.554 +03:00 [INF] Route matched with {page = "/Index", area = "", action = "", controller = ""}. Executing action /Index +2018-06-29 16:16:52.555 +03:00 [INF] Executing handler method OnGet with arguments (null) - ModelState is "Valid" +2018-06-29 16:16:52.557 +03:00 [DBG] Added bundle 'Global' to the page in 0.21 ms. +2018-06-29 16:16:52.558 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.558 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.562 +03:00 [DBG] Added bundle 'Global' to the page in 1.58 ms. +2018-06-29 16:16:52.562 +03:00 [INF] Executed action /Index in 8.3031ms +2018-06-29 16:16:52.563 +03:00 [INF] Request finished in 9.4065ms 200 text/html; charset=utf-8 +2018-06-29 16:16:52.597 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/bootstrap/css/bootstrap.css?_v=636650775792091898 +2018-06-29 16:16:52.597 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/font-awesome/css/font-awesome.css?_v=636650775792061946 +2018-06-29 16:16:52.598 +03:00 [INF] The file /libs/bootstrap/css/bootstrap.css was not modified +2018-06-29 16:16:52.598 +03:00 [INF] The file /libs/font-awesome/css/font-awesome.css was not modified +2018-06-29 16:16:52.598 +03:00 [INF] Request finished in 0.7106ms 304 text/css +2018-06-29 16:16:52.598 +03:00 [INF] Request finished in 0.6441ms 304 text/css +2018-06-29 16:16:52.650 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:16:52.652 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:16:52.653 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:16:52.654 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:16:52.654 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.1837ms. +2018-06-29 16:16:52.655 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:16:52.655 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 1.7488000000000001ms +2018-06-29 16:16:52.655 +03:00 [INF] Request finished in 2.5655ms 200 text/plain; charset=utf-8 +2018-06-29 16:16:52.657 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:16:52.658 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:16:52.659 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.660 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.660 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.660 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.660 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.660 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.660 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.660 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.660 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.660 +03:00 [INF] Authorization failed. +2018-06-29 16:16:52.662 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 3.3675ms. +2018-06-29 16:16:52.662 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:16:52.662 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 4.8649000000000004ms +2018-06-29 16:16:52.662 +03:00 [INF] Request finished in 12.0762ms 200 text/plain; charset=utf-8 +2018-06-29 16:16:54.936 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Account/Login +2018-06-29 16:16:55.663 +03:00 [INF] Route matched with {page = "/Account/Login", area = "", action = "", controller = ""}. Executing action /Account/Login +2018-06-29 16:16:55.700 +03:00 [INF] Executing handler method OnGetAsync with arguments (null) - ModelState is "Valid" +2018-06-29 16:16:55.817 +03:00 [DBG] Added bundle 'Global' to the page in 0.19 ms. +2018-06-29 16:16:55.817 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.817 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.819 +03:00 [DBG] Added bundle 'Global' to the page in 1.64 ms. +2018-06-29 16:16:55.833 +03:00 [INF] Executed action /Account/Login in 169.63410000000002ms +2018-06-29 16:16:55.842 +03:00 [INF] Request finished in 905.9647ms 200 text/html; charset=utf-8 +2018-06-29 16:16:55.903 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:16:55.904 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:16:55.904 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:16:55.904 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:16:55.904 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.904 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.905 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.905 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.905 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.905 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.905 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.905 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:16:55.905 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.905 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.905 +03:00 [INF] Authorization failed. +2018-06-29 16:16:55.905 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:16:55.905 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.0741ms. +2018-06-29 16:16:55.905 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:16:55.905 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 0.5401ms +2018-06-29 16:16:55.905 +03:00 [INF] Request finished in 1.0336ms 200 text/plain; charset=utf-8 +2018-06-29 16:16:55.905 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 1.0625ms. +2018-06-29 16:16:55.906 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:16:55.906 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 1.9068ms +2018-06-29 16:16:55.906 +03:00 [INF] Request finished in 2.7653ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:01.147 +03:00 [INF] Request starting HTTP/1.1 POST http://localhost:53929/Account/Login application/x-www-form-urlencoded 263 +2018-06-29 16:17:01.147 +03:00 [INF] Route matched with {page = "/Account/Login", area = "", action = "", controller = ""}. Executing action /Account/Login +2018-06-29 16:17:01.200 +03:00 [INF] Executing handler method OnPostAsync with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:01.393 +03:00 [INF] AuthenticationScheme: Identity.Application signed in. +2018-06-29 16:17:01.408 +03:00 [INF] Executing RedirectResult, redirecting to /. +2018-06-29 16:17:01.408 +03:00 [INF] Executed action /Account/Login in 260.6424ms +2018-06-29 16:17:01.408 +03:00 [INF] Request finished in 261.2338ms 302 +2018-06-29 16:17:01.418 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/ +2018-06-29 16:17:01.442 +03:00 [INF] Route matched with {page = "/Index", area = "", action = "", controller = ""}. Executing action /Index +2018-06-29 16:17:01.442 +03:00 [INF] Executing handler method OnGet with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:01.443 +03:00 [DBG] Added bundle 'Global' to the page in 0.16 ms. +2018-06-29 16:17:01.509 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.515 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.755 +03:00 [DBG] Added bundle 'Global' to the page in 1.04 ms. +2018-06-29 16:17:01.757 +03:00 [INF] Executed action /Index in 314.48810000000003ms +2018-06-29 16:17:01.757 +03:00 [INF] Request finished in 339.098ms 200 text/html; charset=utf-8 +2018-06-29 16:17:01.835 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:17:01.837 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:17:01.856 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:01.856 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:17:01.858 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:01.859 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:17:01.859 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.12010000000000001ms. +2018-06-29 16:17:01.859 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:01.859 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 1.0047000000000001ms +2018-06-29 16:17:01.860 +03:00 [INF] Request finished in 22.5626ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:01.868 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.873 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.875 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.878 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.881 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.881 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.884 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.888 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.891 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.892 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:01.896 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 39.8918ms. +2018-06-29 16:17:01.903 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:01.903 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 47.154900000000005ms +2018-06-29 16:17:01.903 +03:00 [INF] Request finished in 67.8168ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:04.326 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/Languages/Switch?culture=tr&uiCulture=tr +2018-06-29 16:17:04.348 +03:00 [INF] Route matched with {area = "Abp", action = "Switch", controller = "AbpLanguages", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.Localization.AbpLanguagesController.Switch (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:04.349 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.Localization.AbpLanguagesController.Switch (Volo.Abp.AspNetCore.Mvc) with arguments (["tr","tr"]) - Validation state: "Valid" +2018-06-29 16:17:04.349 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.Localization.AbpLanguagesController.Switch (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.RedirectResult in 0.30110000000000003ms. +2018-06-29 16:17:04.349 +03:00 [INF] Executing RedirectResult, redirecting to /. +2018-06-29 16:17:04.350 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.Localization.AbpLanguagesController.Switch (Volo.Abp.AspNetCore.Mvc) in 1.5425ms +2018-06-29 16:17:04.350 +03:00 [INF] Request finished in 23.5223ms 302 +2018-06-29 16:17:04.359 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/ +2018-06-29 16:17:04.376 +03:00 [INF] Route matched with {page = "/Index", area = "", action = "", controller = ""}. Executing action /Index +2018-06-29 16:17:04.377 +03:00 [INF] Executing handler method OnGet with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:04.377 +03:00 [DBG] Added bundle 'Global' to the page in 0,16 ms. +2018-06-29 16:17:04.378 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.378 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.380 +03:00 [DBG] Added bundle 'Global' to the page in 1,03 ms. +2018-06-29 16:17:04.380 +03:00 [INF] Executed action /Index in 3.6635ms +2018-06-29 16:17:04.380 +03:00 [INF] Request finished in 21.3806ms 200 text/html; charset=utf-8 +2018-06-29 16:17:04.453 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/libs/jquery-validation/localization/messages_tr.js?_v=636650775794461918 +2018-06-29 16:17:04.454 +03:00 [INF] Sending file. Request path: '/libs/jquery-validation/localization/messages_tr.js'. Physical path: 'D:\Github\abp\templates\mvc\src\MyCompanyName.MyProjectName.Web\wwwroot\libs\jquery-validation\localization\messages_tr.js' +2018-06-29 16:17:04.454 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:17:04.454 +03:00 [INF] Request finished in 1.2525ms 200 application/javascript +2018-06-29 16:17:04.456 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:17:04.483 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:04.483 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:17:04.483 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.0721ms. +2018-06-29 16:17:04.483 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:04.484 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 0.55190000000000006ms +2018-06-29 16:17:04.484 +03:00 [INF] Request finished in 27.2041ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:04.487 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:04.487 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:17:04.488 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.489 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.490 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.491 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.491 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.491 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.491 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.491 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.492 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.492 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:04.493 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 4.9919ms. +2018-06-29 16:17:04.493 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:04.493 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 5.8691ms +2018-06-29 16:17:04.493 +03:00 [INF] Request finished in 39.101ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:05.750 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/ +2018-06-29 16:17:05.769 +03:00 [INF] Route matched with {page = "/Index", area = "", action = "", controller = ""}. Executing action /Index +2018-06-29 16:17:05.769 +03:00 [INF] Executing handler method OnGet with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:05.770 +03:00 [DBG] Added bundle 'Global' to the page in 0,21 ms. +2018-06-29 16:17:05.771 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.771 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.774 +03:00 [DBG] Added bundle 'Global' to the page in 0,98 ms. +2018-06-29 16:17:05.774 +03:00 [INF] Executed action /Index in 4.5001000000000007ms +2018-06-29 16:17:05.774 +03:00 [INF] Request finished in 23.8074ms 200 text/html; charset=utf-8 +2018-06-29 16:17:05.841 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:17:05.842 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:17:05.867 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:05.867 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:05.867 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:17:05.867 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:17:05.868 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.0818ms. +2018-06-29 16:17:05.868 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:05.868 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 0.8677ms +2018-06-29 16:17:05.868 +03:00 [INF] Request finished in 25.6743ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:05.868 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.869 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.869 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.870 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.870 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.871 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.872 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.873 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.875 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.876 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:05.877 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 9.7609000000000012ms. +2018-06-29 16:17:05.878 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:05.878 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 10.930900000000001ms +2018-06-29 16:17:05.878 +03:00 [INF] Request finished in 37.0842ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:11.760 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Account/Logout +2018-06-29 16:17:11.781 +03:00 [INF] Route matched with {area = "Account", action = "Index", controller = "Logout", page = ""}. Executing action Volo.Abp.Account.Web.Areas.Account.Controllers.LogoutController.Index (Volo.Abp.Account.Web) +2018-06-29 16:17:11.782 +03:00 [INF] Executing action method Volo.Abp.Account.Web.Areas.Account.Controllers.LogoutController.Index (Volo.Abp.Account.Web) - Validation state: "Valid" +2018-06-29 16:17:11.786 +03:00 [INF] AuthenticationScheme: Identity.Application signed out. +2018-06-29 16:17:11.787 +03:00 [INF] AuthenticationScheme: Identity.External signed out. +2018-06-29 16:17:11.787 +03:00 [INF] AuthenticationScheme: Identity.TwoFactorUserId signed out. +2018-06-29 16:17:11.787 +03:00 [INF] Executed action method Volo.Abp.Account.Web.Areas.Account.Controllers.LogoutController.Index (Volo.Abp.Account.Web), returned result Microsoft.AspNetCore.Mvc.RedirectToPageResult in 5.2002000000000006ms. +2018-06-29 16:17:11.789 +03:00 [INF] Executing RedirectToPageResult, redirecting to /Account/Login. +2018-06-29 16:17:11.789 +03:00 [INF] Executed action Volo.Abp.Account.Web.Areas.Account.Controllers.LogoutController.Index (Volo.Abp.Account.Web) in 7.2706ms +2018-06-29 16:17:11.789 +03:00 [INF] Request finished in 29.4239ms 302 +2018-06-29 16:17:11.796 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Account/Login +2018-06-29 16:17:11.797 +03:00 [INF] Route matched with {page = "/Account/Login", area = "", action = "", controller = ""}. Executing action /Account/Login +2018-06-29 16:17:11.816 +03:00 [INF] Executing handler method OnGetAsync with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:11.821 +03:00 [DBG] Added bundle 'Global' to the page in 0,17 ms. +2018-06-29 16:17:11.822 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.822 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.823 +03:00 [DBG] Added bundle 'Global' to the page in 0,84 ms. +2018-06-29 16:17:11.823 +03:00 [INF] Executed action /Account/Login in 26.523500000000002ms +2018-06-29 16:17:11.823 +03:00 [INF] Request finished in 27.0705ms 200 text/html; charset=utf-8 +2018-06-29 16:17:11.898 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:17:11.898 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:17:11.898 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:11.899 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:11.899 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:17:11.899 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.899 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.899 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:17:11.899 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.899 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.0819ms. +2018-06-29 16:17:11.899 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.899 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:11.899 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.899 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.899 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.899 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 0.7034ms +2018-06-29 16:17:11.899 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.899 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.899 +03:00 [INF] Request finished in 1.253ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:11.899 +03:00 [INF] Authorization failed. +2018-06-29 16:17:11.900 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 1.3977000000000002ms. +2018-06-29 16:17:11.900 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:11.901 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 2.1465ms +2018-06-29 16:17:11.901 +03:00 [INF] Request finished in 2.8851ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:14.525 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/Languages/Switch?culture=en&uiCulture=en +2018-06-29 16:17:14.525 +03:00 [INF] Route matched with {area = "Abp", action = "Switch", controller = "AbpLanguages", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.Localization.AbpLanguagesController.Switch (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:14.526 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.Localization.AbpLanguagesController.Switch (Volo.Abp.AspNetCore.Mvc) with arguments (["en","en"]) - Validation state: "Valid" +2018-06-29 16:17:14.526 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.Localization.AbpLanguagesController.Switch (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.RedirectResult in 0.0292ms. +2018-06-29 16:17:14.526 +03:00 [INF] Executing RedirectResult, redirecting to /. +2018-06-29 16:17:14.526 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.Localization.AbpLanguagesController.Switch (Volo.Abp.AspNetCore.Mvc) in 0.4429ms +2018-06-29 16:17:14.526 +03:00 [INF] Request finished in 0.9692ms 302 +2018-06-29 16:17:14.535 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/ +2018-06-29 16:17:14.535 +03:00 [INF] Route matched with {page = "/Index", area = "", action = "", controller = ""}. Executing action /Index +2018-06-29 16:17:14.536 +03:00 [INF] Executing handler method OnGet with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:14.536 +03:00 [DBG] Added bundle 'Global' to the page in 0.15 ms. +2018-06-29 16:17:14.537 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.537 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.538 +03:00 [DBG] Added bundle 'Global' to the page in 0.97 ms. +2018-06-29 16:17:14.538 +03:00 [INF] Executed action /Index in 2.8383000000000003ms +2018-06-29 16:17:14.538 +03:00 [INF] Request finished in 3.3733ms 200 text/html; charset=utf-8 +2018-06-29 16:17:14.613 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:17:14.614 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:14.615 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:17:14.616 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:17:14.616 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.616 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.616 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.616 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.616 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.616 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.616 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.616 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.616 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:14.616 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.616 +03:00 [INF] Authorization failed. +2018-06-29 16:17:14.617 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:17:14.617 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.1658ms. +2018-06-29 16:17:14.617 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:14.617 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 0.9336000000000001ms +2018-06-29 16:17:14.617 +03:00 [INF] Request finished in 1.7025ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:14.617 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 1.7351ms. +2018-06-29 16:17:14.617 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:14.618 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 3.0973ms +2018-06-29 16:17:14.618 +03:00 [INF] Request finished in 4.7187ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:15.886 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Account/Login +2018-06-29 16:17:15.887 +03:00 [INF] Route matched with {page = "/Account/Login", area = "", action = "", controller = ""}. Executing action /Account/Login +2018-06-29 16:17:15.907 +03:00 [INF] Executing handler method OnGetAsync with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:15.911 +03:00 [DBG] Added bundle 'Global' to the page in 0.17 ms. +2018-06-29 16:17:15.912 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.912 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.913 +03:00 [DBG] Added bundle 'Global' to the page in 0.95 ms. +2018-06-29 16:17:15.913 +03:00 [INF] Executed action /Account/Login in 26.3351ms +2018-06-29 16:17:15.913 +03:00 [INF] Request finished in 26.8608ms 200 text/html; charset=utf-8 +2018-06-29 16:17:15.986 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:17:15.986 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:17:15.987 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:15.987 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:15.987 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:17:15.987 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:17:15.987 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.080700000000000008ms. +2018-06-29 16:17:15.987 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.987 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:15.987 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.987 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.987 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 0.61320000000000008ms +2018-06-29 16:17:15.987 +03:00 [INF] Request finished in 1.2185ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:15.987 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.988 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.988 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.988 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.988 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.988 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.988 +03:00 [INF] Authorization failed. +2018-06-29 16:17:15.989 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 1.4837ms. +2018-06-29 16:17:15.989 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:15.989 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 2.1994000000000002ms +2018-06-29 16:17:15.989 +03:00 [INF] Request finished in 2.9492ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:21.170 +03:00 [INF] Request starting HTTP/1.1 POST http://localhost:53929/Account/Login application/x-www-form-urlencoded 263 +2018-06-29 16:17:21.170 +03:00 [INF] Route matched with {page = "/Account/Login", area = "", action = "", controller = ""}. Executing action /Account/Login +2018-06-29 16:17:21.186 +03:00 [INF] Executing handler method OnPostAsync with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:21.202 +03:00 [INF] AuthenticationScheme: Identity.Application signed in. +2018-06-29 16:17:21.203 +03:00 [INF] Executing RedirectResult, redirecting to /. +2018-06-29 16:17:21.203 +03:00 [INF] Executed action /Account/Login in 32.4814ms +2018-06-29 16:17:21.203 +03:00 [INF] Request finished in 33.2605ms 302 +2018-06-29 16:17:21.211 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/ +2018-06-29 16:17:21.226 +03:00 [INF] Route matched with {page = "/Index", area = "", action = "", controller = ""}. Executing action /Index +2018-06-29 16:17:21.226 +03:00 [INF] Executing handler method OnGet with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:21.227 +03:00 [DBG] Added bundle 'Global' to the page in 0.15 ms. +2018-06-29 16:17:21.227 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.227 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.229 +03:00 [DBG] Added bundle 'Global' to the page in 0.93 ms. +2018-06-29 16:17:21.229 +03:00 [INF] Executed action /Index in 3.2404ms +2018-06-29 16:17:21.229 +03:00 [INF] Request finished in 17.9399ms 200 text/html; charset=utf-8 +2018-06-29 16:17:21.308 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:17:21.309 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:17:21.330 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:21.331 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:17:21.331 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.332 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.332 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.332 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:21.332 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.333 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:17:21.333 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.333 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.0961ms. +2018-06-29 16:17:21.333 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:21.333 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.333 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 0.8335ms +2018-06-29 16:17:21.333 +03:00 [INF] Request finished in 24.063ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:21.334 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.334 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.334 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.335 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:21.336 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 5.7936000000000005ms. +2018-06-29 16:17:21.337 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:21.337 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 6.7094000000000005ms +2018-06-29 16:17:21.337 +03:00 [INF] Request finished in 29.1546ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:23.250 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Identity/Roles +2018-06-29 16:17:23.465 +03:00 [INF] Route matched with {page = "/Identity/Roles/Index", area = "", action = "", controller = ""}. Executing action /Identity/Roles/Index +2018-06-29 16:17:23.470 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.471 +03:00 [INF] Executing handler method OnGet with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:23.489 +03:00 [DBG] Added bundle 'Global' to the page in 0.25 ms. +2018-06-29 16:17:23.498 +03:00 [DBG] Added bundle 'Volo.Abp.Identity.Web.Pages.Identity.Roles.IndexModel' to the page in 1.35 ms. +2018-06-29 16:17:23.499 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.499 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.501 +03:00 [DBG] Added bundle 'Global' to the page in 0.89 ms. +2018-06-29 16:17:23.508 +03:00 [DBG] Added bundle 'Volo.Abp.Identity.Web.Pages.Identity.Roles.IndexModel' to the page in 0.77 ms. +2018-06-29 16:17:23.508 +03:00 [INF] Executed action /Identity/Roles/Index in 43.0232ms +2018-06-29 16:17:23.508 +03:00 [INF] Request finished in 257.9081ms 200 text/html; charset=utf-8 +2018-06-29 16:17:23.548 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/pages/identity/roles/index.css?_v=636634801592091664 +2018-06-29 16:17:23.549 +03:00 [INF] Sending file. Request path: '/pages/identity/roles/index.css'. Physical path: 'D:\Github\abp\modules\identity\src\Volo.Abp.Identity.Web\wwwroot\pages\identity\roles\index.css' +2018-06-29 16:17:23.550 +03:00 [INF] Request finished in 1.4225ms 200 text/css +2018-06-29 16:17:23.583 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:17:23.585 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:17:23.586 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/pages/abp-permission-management/permission-management-modal.js?_v=636634798943631213 +2018-06-29 16:17:23.588 +03:00 [INF] Sending file. Request path: '/pages/abp-permission-management/permission-management-modal.js'. Physical path: 'D:\Github\abp\modules\permission-management\src\Volo.Abp.PermissionManagement.Web\wwwroot\pages\abp-permission-management\permission-management-modal.js' +2018-06-29 16:17:23.588 +03:00 [INF] Request finished in 1.87ms 200 application/javascript +2018-06-29 16:17:23.613 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:23.613 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:23.614 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:17:23.614 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:17:23.614 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.0639ms. +2018-06-29 16:17:23.614 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:23.614 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 0.5879ms +2018-06-29 16:17:23.614 +03:00 [INF] Request finished in 29.4522ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:23.614 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.614 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.615 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.615 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.615 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.615 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.616 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.616 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.616 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.616 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:23.617 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 3.362ms. +2018-06-29 16:17:23.617 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:23.618 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 3.966ms +2018-06-29 16:17:23.618 +03:00 [INF] Request finished in 34.5946ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:23.711 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/api/identity/identityRole application/json +2018-06-29 16:17:23.737 +03:00 [INF] Route matched with {area = "identity", controller = "Role", action = "GetListAsync", page = ""}. Executing action Volo.Abp.Identity.IdentityRoleController.GetListAsync (Volo.Abp.Identity.HttpApi) +2018-06-29 16:17:23.761 +03:00 [INF] Executing action method Volo.Abp.Identity.IdentityRoleController.GetListAsync (Volo.Abp.Identity.HttpApi) with arguments (["Volo.Abp.Identity.GetIdentityRolesInput"]) - Validation state: "Valid" +2018-06-29 16:17:23.775 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:24.154 +03:00 [INF] Executed action method Volo.Abp.Identity.IdentityRoleController.GetListAsync (Volo.Abp.Identity.HttpApi), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 392.8012ms. +2018-06-29 16:17:24.154 +03:00 [INF] Executing ObjectResult, writing value of type 'Volo.Abp.Application.Dtos.PagedResultDto`1[[Volo.Abp.Identity.IdentityRoleDto, Volo.Abp.Identity.Application.Contracts, Version=0.3.0.0, Culture=neutral, PublicKeyToken=null]]'. +2018-06-29 16:17:24.160 +03:00 [INF] Executed action Volo.Abp.Identity.IdentityRoleController.GetListAsync (Volo.Abp.Identity.HttpApi) in 422.8929ms +2018-06-29 16:17:24.161 +03:00 [INF] Request finished in 449.3238ms 200 application/json; charset=utf-8 +2018-06-29 16:17:24.960 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Identity/Users +2018-06-29 16:17:25.186 +03:00 [INF] Route matched with {page = "/Identity/Users/Index", area = "", action = "", controller = ""}. Executing action /Identity/Users/Index +2018-06-29 16:17:25.187 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.188 +03:00 [INF] Executing handler method OnGet with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:25.197 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.206 +03:00 [DBG] Added bundle 'Global' to the page in 0.23 ms. +2018-06-29 16:17:25.212 +03:00 [DBG] Added bundle 'Volo.Abp.Identity.Web.Pages.Identity.Users.IndexModel' to the page in 0.23 ms. +2018-06-29 16:17:25.213 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.214 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.217 +03:00 [DBG] Added bundle 'Global' to the page in 1.51 ms. +2018-06-29 16:17:25.222 +03:00 [DBG] Added bundle 'Volo.Abp.Identity.Web.Pages.Identity.Users.IndexModel' to the page in 0.34 ms. +2018-06-29 16:17:25.222 +03:00 [INF] Executed action /Identity/Users/Index in 35.5006ms +2018-06-29 16:17:25.222 +03:00 [INF] Request finished in 262.1798ms 200 text/html; charset=utf-8 +2018-06-29 16:17:25.256 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/pages/identity/users/index.css?_v=636634801592101634 +2018-06-29 16:17:25.258 +03:00 [INF] Sending file. Request path: '/pages/identity/users/index.css'. Physical path: 'D:\Github\abp\modules\identity\src\Volo.Abp.Identity.Web\wwwroot\pages\identity\users\index.css' +2018-06-29 16:17:25.258 +03:00 [INF] Request finished in 1.6622ms 200 text/css +2018-06-29 16:17:25.292 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:17:25.293 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:17:25.298 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/pages/identity/users/index.js?_v=636634801592111608 +2018-06-29 16:17:25.298 +03:00 [INF] Sending file. Request path: '/pages/identity/users/index.js'. Physical path: 'D:\Github\abp\modules\identity\src\Volo.Abp.Identity.Web\wwwroot\pages\identity\users\index.js' +2018-06-29 16:17:25.299 +03:00 [INF] Request finished in 1.0174ms 200 application/javascript +2018-06-29 16:17:25.317 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:25.317 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:17:25.318 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.318 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.318 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.319 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.319 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.319 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:25.319 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.319 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:17:25.319 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.320 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.12300000000000001ms. +2018-06-29 16:17:25.320 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:25.320 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.320 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 0.9061ms +2018-06-29 16:17:25.320 +03:00 [INF] Request finished in 26.6292ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:25.320 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.320 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.322 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 4.5589ms. +2018-06-29 16:17:25.322 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:25.322 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 5.2729ms +2018-06-29 16:17:25.322 +03:00 [INF] Request finished in 30.2892ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:25.420 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/api/identity/identityUser application/json +2018-06-29 16:17:25.448 +03:00 [INF] Route matched with {area = "identity", controller = "User", action = "GetListAsync", page = ""}. Executing action Volo.Abp.Identity.IdentityUserController.GetListAsync (Volo.Abp.Identity.HttpApi) +2018-06-29 16:17:25.459 +03:00 [INF] Executing action method Volo.Abp.Identity.IdentityUserController.GetListAsync (Volo.Abp.Identity.HttpApi) with arguments (["Volo.Abp.Identity.GetIdentityUsersInput"]) - Validation state: "Valid" +2018-06-29 16:17:25.462 +03:00 [INF] Authorization was successful. +2018-06-29 16:17:25.496 +03:00 [INF] Executed action method Volo.Abp.Identity.IdentityUserController.GetListAsync (Volo.Abp.Identity.HttpApi), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 37.591300000000004ms. +2018-06-29 16:17:25.497 +03:00 [INF] Executing ObjectResult, writing value of type 'Volo.Abp.Application.Dtos.PagedResultDto`1[[Volo.Abp.Identity.IdentityUserDto, Volo.Abp.Identity.Application.Contracts, Version=0.3.0.0, Culture=neutral, PublicKeyToken=null]]'. +2018-06-29 16:17:25.504 +03:00 [INF] Executed action Volo.Abp.Identity.IdentityUserController.GetListAsync (Volo.Abp.Identity.HttpApi) in 55.9574ms +2018-06-29 16:17:25.504 +03:00 [INF] Request finished in 83.8126ms 200 application/json; charset=utf-8 +2018-06-29 16:17:28.741 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Account/Logout +2018-06-29 16:17:28.767 +03:00 [INF] Route matched with {area = "Account", action = "Index", controller = "Logout", page = ""}. Executing action Volo.Abp.Account.Web.Areas.Account.Controllers.LogoutController.Index (Volo.Abp.Account.Web) +2018-06-29 16:17:28.767 +03:00 [INF] Executing action method Volo.Abp.Account.Web.Areas.Account.Controllers.LogoutController.Index (Volo.Abp.Account.Web) - Validation state: "Valid" +2018-06-29 16:17:28.767 +03:00 [INF] AuthenticationScheme: Identity.Application signed out. +2018-06-29 16:17:28.767 +03:00 [INF] AuthenticationScheme: Identity.External signed out. +2018-06-29 16:17:28.768 +03:00 [INF] AuthenticationScheme: Identity.TwoFactorUserId signed out. +2018-06-29 16:17:28.768 +03:00 [INF] Executed action method Volo.Abp.Account.Web.Areas.Account.Controllers.LogoutController.Index (Volo.Abp.Account.Web), returned result Microsoft.AspNetCore.Mvc.RedirectToPageResult in 0.2644ms. +2018-06-29 16:17:28.768 +03:00 [INF] Executing RedirectToPageResult, redirecting to /Account/Login. +2018-06-29 16:17:28.768 +03:00 [INF] Executed action Volo.Abp.Account.Web.Areas.Account.Controllers.LogoutController.Index (Volo.Abp.Account.Web) in 0.66870000000000007ms +2018-06-29 16:17:28.768 +03:00 [INF] Request finished in 26.5617ms 302 +2018-06-29 16:17:28.774 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Account/Login +2018-06-29 16:17:28.775 +03:00 [INF] Route matched with {page = "/Account/Login", area = "", action = "", controller = ""}. Executing action /Account/Login +2018-06-29 16:17:28.794 +03:00 [INF] Executing handler method OnGetAsync with arguments (null) - ModelState is "Valid" +2018-06-29 16:17:28.799 +03:00 [DBG] Added bundle 'Global' to the page in 0.16 ms. +2018-06-29 16:17:28.799 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.799 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.801 +03:00 [DBG] Added bundle 'Global' to the page in 1.00 ms. +2018-06-29 16:17:28.801 +03:00 [INF] Executed action /Account/Login in 26.213800000000003ms +2018-06-29 16:17:28.801 +03:00 [INF] Request finished in 26.7466ms 200 text/html; charset=utf-8 +2018-06-29 16:17:28.875 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ApplicationConfigurationScript +2018-06-29 16:17:28.876 +03:00 [INF] Route matched with {area = "Abp", action = "Get", controller = "AbpApplicationConfigurationScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:28.876 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) - Validation state: "Valid" +2018-06-29 16:17:28.876 +03:00 [INF] Request starting HTTP/1.1 GET http://localhost:53929/Abp/ServiceProxyScript +2018-06-29 16:17:28.876 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.876 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.876 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.876 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.876 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.877 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.877 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.877 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.877 +03:00 [INF] Route matched with {area = "Abp", action = "GetAll", controller = "AbpServiceProxyScript", page = ""}. Executing action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) +2018-06-29 16:17:28.877 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.877 +03:00 [INF] Authorization failed. +2018-06-29 16:17:28.877 +03:00 [INF] Executing action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) with arguments (["Volo.Abp.AspNetCore.Mvc.ProxyScripting.ServiceProxyGenerationModel"]) - Validation state: "Valid" +2018-06-29 16:17:28.878 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.1895ms. +2018-06-29 16:17:28.878 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:28.878 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ProxyScripting.AbpServiceProxyScriptController.GetAll (Volo.Abp.AspNetCore.Mvc) in 1.2824ms +2018-06-29 16:17:28.878 +03:00 [INF] Request finished in 1.924ms 200 text/plain; charset=utf-8 +2018-06-29 16:17:28.878 +03:00 [INF] Executed action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 1.9199000000000002ms. +2018-06-29 16:17:28.878 +03:00 [INF] Executing ObjectResult, writing value of type 'System.String'. +2018-06-29 16:17:28.878 +03:00 [INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationScriptController.Get (Volo.Abp.AspNetCore.Mvc) in 2.7022ms +2018-06-29 16:17:28.878 +03:00 [INF] Request finished in 3.4914ms 200 text/plain; charset=utf-8 diff --git a/templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebAutoMapperProfile.cs b/templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebAutoMapperProfile.cs new file mode 100644 index 0000000000..b1e9c4a346 --- /dev/null +++ b/templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebAutoMapperProfile.cs @@ -0,0 +1,13 @@ +using AutoMapper; + +namespace MyCompanyName.MyProjectName +{ + public class MyProjectNameWebAutoMapperProfile : Profile + { + public MyProjectNameWebAutoMapperProfile() + { + //Configure your auto mapper mappings... + // + } + } +} diff --git a/templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs b/templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs index d0e20522a8..16ac5d73cd 100644 --- a/templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs +++ b/templates/mvc/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs @@ -16,11 +16,13 @@ using Volo.Abp; using Volo.Abp.Account.Web; using Volo.Abp.AspNetCore.Modularity; using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.Autofac; +using Volo.Abp.AutoMapper; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Identity; @@ -46,12 +48,21 @@ namespace MyCompanyName.MyProjectName )] public class MyProjectNameWebModule : AbpModule { + public override void PreConfigureServices(IServiceCollection services) + { + services.PreConfigure(options => + { + options.AddAssemblyResource(typeof(MyProjectNameResource), typeof(MyProjectNameWebModule).Assembly); + }); + } + public override void ConfigureServices(IServiceCollection services) { var hostingEnvironment = services.GetHostingEnvironment(); var configuration = services.BuildConfiguration(); ConfigureDatabaseServices(services, configuration); + ConfigureAutoMapper(services); ConfigureVirtualFileSystem(services, hostingEnvironment); ConfigureLocalizationServices(services); ConfigureNavigationServices(services); @@ -71,6 +82,14 @@ namespace MyCompanyName.MyProjectName services.Configure(options => { options.UseSqlServer(); }); } + private static void ConfigureAutoMapper(IServiceCollection services) + { + services.Configure(options => + { + options.AddProfile(); //Pass validate parameter as true to validate the configuration + }); + } + private static void ConfigureVirtualFileSystem(IServiceCollection services, IHostingEnvironment hostingEnvironment) { if (hostingEnvironment.IsDevelopment()) @@ -78,8 +97,7 @@ namespace MyCompanyName.MyProjectName services.Configure(options => { options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, "..\\MyCompanyName.MyProjectName.Domain")); - - // + // options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, "..\\..\\..\\..\\framework\\src\\Volo.Abp.UI")); options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, "..\\..\\..\\..\\framework\\src\\Volo.Abp.AspNetCore.Mvc.UI")); options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, "..\\..\\..\\..\\framework\\src\\Volo.Abp.AspNetCore.Mvc.UI.Bootstrap")); @@ -88,7 +106,7 @@ namespace MyCompanyName.MyProjectName options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, "..\\..\\..\\..\\modules\\permission-management\\src\\Volo.Abp.PermissionManagement.Web")); options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, "..\\..\\..\\..\\modules\\identity\\src\\Volo.Abp.Identity.Web")); options.FileSets.ReplaceEmbeddedByPyhsical(Path.Combine(hostingEnvironment.ContentRootPath, "..\\..\\..\\..\\modules\\account\\src\\Volo.Abp.Account.Web")); - // + // }); } }