Вопросы по тегу: asp.net-core

(80)

как выполнить модульное тестирование основного приложения asp.net с внедрением зависимостей конструктора

У меня есть основное приложение asp.net, которое использует внедрение зависимостей, определенное в классе startup.cs приложения: public void ConfigureServices(IServiceCollection services) { services.AddDbContext(options => options.UseSqlServer(Configuration["Data:FotballConnection:DefaultConnection"])); // Repositories services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); // Services services.AddScoped(); services.AddScoped(); // new repos services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); Это позволяет что-то вроде этого: [Route("api/[controller]")] public class MatchController : AuthorizedController { private readonly IMatchService _matchService; private readonly IMatchRepository _matchRepository; private readonly IMatchBetRepository _matchBetRepository; private readonly IUserRepository _userRepository; private readonly ILoggingRepository _loggingRepository; public MatchController(IMatchService matchService, IMatchRepository matchRepository, IMatchBetRepository matchBetRepository, ILoggingRepository loggingRepository, IUserRepository userRepository) { _matchService = matchService; _matchRepository = matchRepository; _matchBetRepository = matchBetRepository; _userRepository = userRepository; _loggingRepository = loggingRepository; } Это очень аккуратно. Но становится проблемой, когда я хочу провести модульное тестирование. Потому что в моей тестовой библиотеке нет файла startup.cs, в котором я настраиваю внедрение зависимостей. Таким образом, класс с этими интерфейсами в качестве параметров будет просто нулевым.namespace TestLibrary { public class FootballAPIService { private readonly IMatchRepository _matchRepository; private readonly ITeamRepository _teamRepository; public FootballAPIService(IMatchRepository matchRepository, ITeamRepository teamRepository) { _matchRepository = matchRepository; _teamRepository = teamRepository; В приведенном выше коде в тестовой библиотеке _matchRepository и _teamRepositoryбудут просто null. :(Могу ли я сделать что-то вроде ConfigureServices, где я определяю внедрение зависимостей в моем проекте тестовой библиотеки?
g

ganjan

6 лет назад

Ответов: 8

ASP.NET Core Identity — получить текущего пользователя

Чтобы получить текущего пользователя в MVC5, нам нужно было сделать следующее:using Microsoft.AspNet.Identity; [Authorize] public IHttpActionResult DoSomething() { string currentUserId = User.Identity.GetUserId(); } Теперь с ASP.NET Core я думал, что это должно работать, но выдает ошибку.using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Http; private readonly UserManager _userManager; [HttpPost] [Authorize] public async Task StartSession() { var curUser = await _userManager.GetUserAsync(HttpContext.User); } Есть идеи?РЕДАКТИРОВАТЬ: Ответ Джерардо идет по плану, но для получения фактического «идентификатора» пользователя это, похоже, работает:ClaimsPrincipal currentUser = this.User; var currentUserID = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value;
j

jbraun

5 лет назад

Ответов: 7

Доступ к IHostingEnvironment в методе ConfigureServices

Мне нужно проверить методом ConfigureServices, является ли имя текущей среды хостинга «Разработка».Таким образом, использование метода IHostingEnvironment.IsDevelopment() может быть приемлемым для меня, но, в отличие от метода Configure, у меня нет IHostingEnvironment env.
S

Set

6 лет назад

Ответов: 5

Замена WebUtility.HtmlDecode в .NET Core

Мне нужно декодировать символы HTML в .NET Core (MVC6). Похоже, что в .NET Core нет функции WebUtility.HtmlDecode, которую раньше все использовали для этой цели. Существует ли замена в .NET Core?
s

sibvic

6 лет назад

Ответов: 6

ASP.NET Core 3.0 System.Text.Json Сериализация случая верблюда

В проекте веб-API ASP.NET Core 3.0, как указать System.Text.Json параметры сериализации для автоматической сериализации/десериализации свойств Pascal Case в Camel Case и наоборот?Дана модель со свойствами Pascal Case, такими как:public class Person { public string Firstname { get; set; } public string Lastname { get; set; } } И код для использования System.Text.Json для десериализации строки JSON до типа Person class:var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}"; var person = JsonSerializer.Deserialize(json); Десериализация невозможна, если JsonPropertyName не используется с каждым свойством, например:public class Person { [JsonPropertyName("firstname")] public string Firstname { get; set; } [JsonPropertyName("lastname")] public string Lastname { get; set; } } Я попробовал следующее в startup.cs, но это не помогло с точки зрения необходимости JsonPropertyName:services.AddMvc().AddJsonOptions(options => { options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase; options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; }); // also the following given it's a Web API project services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase; options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; }); Как настроить сериализацию/десериализацию Camel Case в ASP.NET Core 3.0 с использованием нового пространства имен System.Text.Json?Спасибо!
A

Alexander Staroselsky

2 года назад

Ответов: 6

Как получить корневой каталог проекта в ядре asp.net. Directory.GetCurrentDirectory() не работает правильно на Mac

У моего проекта структура папок примерно такая: Проект, Проект/данные Проект/движок Проект/Сервер проект/интерфейс На сервере (работающем в папке Project/Server) я обращаюсь к папке следующим образом:var rootFolder = Directory.GetCurrentDirectory(); rootFolder = rootFolder.Substring(0, rootFolder.IndexOf(@"\Project\", StringComparison.Ordinal) + @"\Project\".Length); PathToData = Path.GetFullPath(Path.Combine(rootFolder, "Data")); var Parser = Parser(); var d = new FileStream(Path.Combine(PathToData, $"{dataFileName}.txt"), FileMode.Open); var fs = new StreamReader(d, Encoding.UTF8); На моем компьютере с Windows этот код работает нормально, так как Directory.GetCurrentDirectory() ссылается на текущую папку и делаетrootFolder.Substring(0, rootFolder.IndexOf(@"\Project\", StringComparison.Ordinal) + @"\Project\".Length); дает мне корневую папку проекта (а не папки bin или debug). Но когда я запустил его на Mac, он получил «Directory.GetCurrentDirectory()» и отправил меня в /usr//[что-то еще]. Он не относился к папке, в которой лежит мой проект.Как правильно найти относительные пути в моем проекте? Где я должен хранить папку данных таким образом, чтобы она была легко доступна для всех подпроектов в решении, особенно для проекта сервера пустельги? Я предпочитаю не хранить его в папке wwwroot, потому что папка данных поддерживается другим членом команды, и я просто хочу получить доступ к последней версии. Какие у меня есть варианты?
a

akraines

5 лет назад

Ответов: 11

Были включены повторяющиеся элементы «Содержание». .NET SDK по умолчанию включает элементы «Содержимое» из каталога вашего проекта.

Всякий раз, когда я добавляю файл javascript или css в свой основной проект asp.net и запускаю dotnet run в своем терминале bash, я получаю следующую ошибку: /usr/доля/dotnet/sdk/1.0.1/Sdks/Microsoft.NET.Sdk/сборка/Microsoft .NET.Sdk.DefaultItems.targets(188,5): ошибка: Дублировать «Содержимое» предметы были включены. .NET SDK включает элементы «Содержимое» из вашего каталог проекта по умолчанию. Вы можете удалить эти элементы из файл вашего проекта или установите для свойства 'EnableDefaultContentItems' значение «false», если вы хотите явно включить их в файл проекта. Для получения дополнительной информации см. https://aka.ms/sdkimplicititems. То повторяющиеся элементы были: 'wwwroot/css/BasicQuotation.css'; 'wwwroot/js/BasicQuotation.js' [/mnt/c/Dev/myproject/MyProject/MyProject.csproj] Сбой сборки. Пожалуйста, исправьте ошибки сборки и запустите снова. Я могу исправить это, удалив ItemGroup из моего файла csproj, но я не думаю, что это очень продуктивно.Это происходит в стандартном шаблоне веб-приложения Visual Studio 2017 ASP.NET Core (.NET Core). Я добавляю файлы в свой проект, щелкнув правой кнопкой мыши папку wwwroot > js и затем выбрав Добавить > Новый элемент > Файл JavaScriptЭто мой файл .csproj: netcoreapp1.1 $(PackageTargetFallback);portable-net45+win8+wp8+wpa81; aspnet-MyProject-7e1906d8-5dbd-469a-b237-d7a563081253
j

jao

5 лет назад

Ответов: 18

Как извлечь список из appsettings.json в ядре .net

У меня есть файл appsettings.json, который выглядит так:{ "someSetting": { "subSettings": [ "one", "two", "three" ] } } Когда я создаю свой корень конфигурации и делаю что-то вроде config["someSetting:subSettings"], он возвращает ноль, а фактические доступные настройки выглядят примерно так:config["someSettings:subSettings:0"]Есть ли лучший способ получить содержимое someSettings:subSettings в виде списка?
d

devlife

5 лет назад

Ответов: 6

Не удалось настроить конечную точку HTTPS. Не указан сертификат сервера, и не удалось найти сертификат разработчика по умолчанию.

Я работаю над приложением Fabric, в котором настроен HTTPS. Он выдает исключение, хотя у меня есть действующий установленный сертификат.
B

Balanjaneyulu K

3 года назад

Ответов: 19

Установка номера версии для проектов .NET Core — CSPROJ — не для проектов JSON

Этот вопрос очень похож на Установка номера версии для проектов .NET Core, но отличается. Используя последнюю стабильную версию .NET Core на момент написания (1.1) и VS2017, .NET Core переключился с файлов проектов на основе JSON на файлы CSPROJ.Итак, то, что я пытаюсь сделать, это настроить среду CI, в которой я хотел бы иметь возможность изменять что-то перед сборкой, чтобы пометить мои сборки правильным номером версии.Если я использую такие атрибуты, как этот старый (трюк SharedAssemblyInfo.cs):[сборка: AssemblyFileVersion("3.3.3.3")] [сборка: AssemblyVersion("4.4.4.4")] где-то в проекте я получаю CS0579 - Дубликат 'System.Reflection.AssemblyFileVersionAttribute' и CS0579 - Дубликат 'System.Reflection.AssemblyVersionAttribute' ошибки при построении.Покопавшись в нем немного, я обнаружил, что есть файл, который выглядит так, сгенерированный в процессе сборки (он не существовал до того, как я собрал) в \obj\Debug\netcoreapp1.1*100003 *://------------------------------------------------------------------------ ------------------------------------ // // Этот код был сгенерирован инструментом. // Версия среды выполнения: 4.0.30319.42000 // // Изменения в этом файле могут привести к некорректному поведению и будут потеряны, если // код перегенерируется. // //------------------------------------------------ ------------------------------ с помощью системы; используя System.Reflection; [сборка: System.Reflection.AssemblyCompanyAttribute ("TestApplication")] [сборка: System.Reflection.AssemblyConfigurationAttribute ("Отладка")] [сборка: System.Reflection.AssemblyDescriptionAttribute ("Описание пакета")] [сборка: System.Reflection.AssemblyFileVersionAttribute ("1.1.99.0")] [сборка: System.Reflection.AssemblyInformationalVersionAttribute("1.1.99")] [сборка: System.Reflection.AssemblyProductAttribute ("TestApplication")] [сборка: System.Reflection.AssemblyTitleAttribute ("TestApplication")] [сборка: System.Reflection.AssemblyVersionAttribute ("1.1.99.0")] // Генерируется классом MSBuild WriteCodeFragment. Вопрос - Как мне сделать этот бит? Итак, я вижу, что это должно быть каким-то образом сгенерировано из значений, введенных на странице свойств проекта «страница пакета», но я не знаю, как правильно изменить эти значения на моей машине CI.В идеале я хотел бы указать всю эту информацию в моем (Дженкинса) сценарии CI, но я бы согласился просто установить номер версии.РЕДАКТИРОВАТЬ – Подробнее Прочитав первый ответ, я хотел дать понять, что я создаю как сервисы, так и пакеты NuGET, и я бы предпочел иметь 1 способ управления версиями всего, что было бы похоже на старый проект JSON, где я мог бы просто обновить один файл .ОБНОВЛЕНИЕ Я собираюсь написать сценарий изменения файла CSPROJ, который, на мой взгляд, довольно хакерский, поскольку раздел, который мне нужно изменить, выглядит так... Exe netcoreapp1.1 1.0.7777.0 1.0.8888.0 1.0.9999.0 Моя компания Имя автора Название продукта Авторское право © 2017 Итак, проблема в том, что существует несколько элементов "PropertyGroup"; другие кажутся помеченными, но, не зная, как устроен CSPROJ, я не могу сказать, что так будет всегда.Я исхожу из того, что сведения о пакете всегда будут заполнены, иначе теги значений (выше) не отображаются в XML, поэтому я могу использовать сценарий для обновления значений на месте. Если бы тегов значений не было, у меня не было бы четкого представления о том, в какой элемент PropertyGroup вставлять значения (а также в каком порядке, поскольку это кажется важным; изменение порядка помешало мне загрузить проект в VS2017).Я все еще жду лучшего решения, чем это!Обновление: после того, как кто-то пометил этот вопрос как возможный дубликат (Автоматическое управление версиями в Visual Studio 2017 (.NET Core)) - я не видел этот вопрос раньше и теперь читаю его, кажется, почти то же самое, за исключением того, что я не просто хочу установить номер версии. Кроме того, ответы на этот вопрос не решают мою проблему - только задают то, что я задал в своем вопросе. Принятый ответ на мой вопрос - это именно тот ответ, который мне нужен для решения моей проблемы, поэтому, хотя другой вопрос появился первым и выглядит так же, он мне совсем не помогает. Может мод поможет?
J

Jay

5 лет назад

Ответов: 10

Как мне внедрить экземпляр DbContext в IHostedService?

ВопросКак мне внедрить (с помощью стандартной инъекции зависимостей) экземпляр DbContext в IHostedService?Что я пробовалВ настоящее время мой класс IHostedService принимает экземпляр MainContext (производный от DbContext) в конструкторе.Когда я запускаю приложение, я получаю: Невозможно использовать службу "Microsoft.EntityFrameworkCore.DbContextOptions" с заданной областью действия из синглтона "Microsoft.Extensions.Hosting.IHostedService". Поэтому я попытался сделать DbContextOptions переходным, указав:services.AddDbContext(options => options.UseSqlite("Data Source=development.db"), ServiceLifetime.Transient); в моем классе Запуск.Но ошибка остается прежней, несмотря на то, что согласно этой решенной проблеме Github переданный DbContextOptions должен иметь то же время жизни, что и указанное в вызове AddDbContext .Я не могу сделать контекст базы данных одноэлементным, иначе одновременные вызовы к нему приведут к исключениям параллелизма (из-за того, что контекст базы данных не гарантирует потокобезопасность).
S

Shoe

4 года назад

Ответов: 2

Возврат 404 из контроллера ASP.NET Core API с явным типом (не IActionResult)

Контроллеры ASP.NET Core API обычно возвращают явные типы (и делают это по умолчанию, если вы создаете новый проект), например:[Route("api/[controller]")] public class ThingsController : Controller { // GET api/things [HttpGet] public async Task> GetAsync() { //... } // GET api/things/5 [HttpGet("{id}")] public async Task GetAsync(int id) { Thing thingFromDB = await GetThingFromDBAsync(); if(thingFromDB == null) return null; // This returns HTTP 204 // Process thingFromDB, blah blah blah return thing; } // POST api/things [HttpPost] public void Post([FromBody]Thing thing) { //.. } //... and so on... } Проблема в том, что return null; - возвращает HTTP 204: успех, контента нет.Многие компоненты Javascript на стороне клиента расценивают это как успех, поэтому код выглядит следующим образом:const response = await fetch('.../api/things/5', {method: 'GET' ...}); if(response.ok) return await response.json(); // Error, no content! Поиск в Интернете (например, этот вопрос и этот ответ) указывает на полезные return NotFound(); методы расширения для контроллера, но все эти вернуть IActionResult, что несовместимо с моим типом возврата Task. Этот шаблон проектирования выглядит следующим образом:// GET api/things/5 [HttpGet("{id}")] public async Task GetAsync(int id) { var thingFromDB = await GetThingFromDBAsync(); if (thingFromDB == null) return NotFound(); // Process thingFromDB, blah blah blah return Ok(thing); } Это работает, но для его использования тип возвращаемого значения GetAsync должен быть изменен на Task — явное типирование теряется, и либо все возвращаемые типы в контроллер должен измениться (т.е. вообще не использовать явную типизацию) или будет смесь, в которой одни действия имеют дело с явными типами, а другие. Кроме того, модульные тесты теперь должны делать предположения о сериализации и явно десериализовать содержимое IActionResult, где раньше они имели конкретный тип.Есть множество способов обойти это, но это кажется запутанной мешаниной, которую можно легко спроектировать, поэтому реальный вопрос: какой правильный путь задуман разработчиками ASP.NET Core?* 100003*Похоже, возможные варианты: Причудливое (беспорядочное для тестирования) сочетание явных типов и IActionResult в зависимости от ожидаемого типа. Забудьте о явных типах, они на самом деле не поддерживаются Core MVC, всегда используйте IActionResult (в таком случае, почему они вообще присутствуют?) Напишите реализацию HttpResponseException и используйте ее как ArgumentOutOfRangeException (см. этот ответ для реализации). Однако это требует использования исключений для потока программы, что, как правило, является плохой идеей, а также устарело командой MVC Core. Напишите реализацию HttpNoContentOutputFormatter, которая возвращает 404 для запросов GET. Что-то еще, что мне не хватает в том, как должен работать Core MVC? Или есть причина, по которой 204 правильно, а 404 неправильно для неудачного запроса GET? Все они включают компромиссы и рефакторинг, которые что-то теряют или добавляют то, что кажется ненужной сложностью, противоречащей дизайну MVC Core. Какой компромисс правильный и почему?
K

Keith

5 лет назад

Ответов: 5

IdentityServer4 регистрирует UserService и получает пользователей из базы данных в ядре asp.net

Я искал, как зарегистрировать UserService с IdentityServer4 в ядре asp.net, но не могу найти правильный способ сделать это.Это код для регистрации InMemoryUsers, найденный здесь, однако я хотел бы получить доступ к пользователям из моей БД MSSQL, а не к статическим пользователям, определенным в образце.var builder = services.AddIdentityServer(options => { options.SigningCertificate = cert; }); builder.AddInMemoryClients(Clients.Get()); builder.AddInMemoryScopes(Scopes.Get()); builder.AddInMemoryUsers(Users.Get()); Затем я посмотрел этот, который соответствует IdentityServer3.var factory = new IdentityServerServiceFactory() .UseInMemoryClients(Clients.Get()) .UseInMemoryScopes(Scopes.Get()); var userService = new UserService(); factory.UserService = new Registration(resolver => userService); Из чтения в Интернете кажется, что мне нужно использовать систему DI для регистрации UserService, но я не уверен, как она привязывается к IdentityServer, напримерservices.AddScoped(); Итак, мой вопрос:Как связать мой UserService с билдером (пользователи IdentityServer4)? И как мне вызвать мою базу данных для доступа и аутентификации существующих пользователей БД в UserService (я использую репозитории для подключения к БД)?С учетом этого имеет для работы с asp.net core.Спасибо!
N

Nick De Beer

6 лет назад

Ответов: 3

Вернуть представление как строку в .NET Core

Я нашел статью о том, как вернуть представление в строку в ASP.NET, но не смог ничего скрыть, чтобы запустить ее с помощью .NET Corepublic static string RenderViewToString(this Controller controller, string viewName, object model) { var context = controller.ControllerContext; if (string.IsNullOrEmpty(viewName)) viewName = context.RouteData.GetRequiredString("action"); var viewData = new ViewDataDictionary(model); using (var sw = new StringWriter()) { var viewResult = ViewEngines.Engines.FindPartialView(context, viewName); var viewContext = new ViewContext(context, viewResult.View, viewData, new TempDataDictionary(), sw); viewResult.View.Render(viewContext, sw); return sw.GetStringBuilder().ToString(); } } предполагается, что он может звонить с контроллера, используя:var strView = this.RenderViewToString("YourViewName", yourModel); Когда я пытаюсь запустить вышеуказанное в .NET Core, я получаю много ошибок компиляции.Я пытался преобразовать его для работы с .NET Core, но не удалось, может ли кто-нибудь помочь с упоминанием необходимых использования .. и необходимых "зависимостей": { «Майкрософт.Аспнеткоре.мвк»: «1.1.0», ... }, для использования в project.json.некоторые другие примеры кодов: здесь и здесь и здесьПРИМЕЧАНИЕ Мне нужно решение, чтобы преобразовать представление в строку в .NET Core, независимо от того, был ли преобразован тот же код или другим способом, который может это сделать.
H

Hasan A Yousef

5 лет назад

Ответов: 12

Как отключить ведение журнала базовой структурой ASP.NET

Как отключить ведение журнала ASP.NET для каждого запроса, например INFO 09:38:41 Профиль пользователя доступен. Использование «C:\Users\xxxx xxxx\AppData\Local\ASP.NET\DataProtection-Keys» в качестве хранилища ключей и Windows DPAPI для шифрования ключей в состоянии покоя. DEBUG 09:38:41 Запуск хостинга DEBUG 09:38:41 Хостинг запущен INFO 09:38:41 Запрос запуска HTTP/1.1 GET http://localhost:23369/ INFO 09:38:41 Запрос запуска HTTP/1.1 DEBUG http://localhost:23369/ text/html DEBUG 09:38:41 Запросы DEBUG не поддерживаются DEBUG 09:38:41 Путь запроса / не соответствует поддерживаемому типу файла DEBUG 09:38:41 Запрос успешно сопоставил маршрут с именем «по умолчанию» и шаблоном «{controller=Home}/{action=Index}/{id?}». DEBUG 09:38:41 Запрос успешно сопоставил маршрут с именем «по умолчанию» и шаблоном «{controller=Home}/{action=Index}/{id?}». DEBUG 09:38:41 Выполнение действия Forums.Controllers.HomeController.Index DEBUG 09:38:41 Выполнение действия Forums.Controllers.HomeController.Index INFO 09:38:41 Выполнение метода действия Forums.Controllers.HomeController.Index с аргументами () - ModelState is Valid' INFO 09:38:41 Выполнение метода действия Forums.Controllers.HomeController.Index .. Я пока не нашел, как отключить эту регистрацию...Это мой метод Configure в классе Startup:public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddProvider(new Log4NetProvider()); if (env.IsDevelopment()) { app.UseBrowserLink(); app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); // For more details on creating database during deployment see http://go.microsoft.com/fwlink/?LinkID=615859 try { using (var serviceScope = app.ApplicationServices.GetRequiredService() .CreateScope()) { serviceScope.ServiceProvider.GetService() .Database.Migrate(); } } catch { } } app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear()); app.UseStaticFiles(); app.UseIdentity(); // To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715 app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } А это мой файл project.json:"dependencies": { "EntityFramework.Commands": "7.0.0-rc1-final", "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final", "log4net": "2.0.5", "Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final", "Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final", "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final", "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final", "Microsoft.AspNet.Mvc": "6.0.0-rc1-final", "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final", "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final", "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final", "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final", "Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final", "Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final", "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final", "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final", "Microsoft.Extensions.Logging": "1.0.0-rc1-final", "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final" }, "commands": { "web": "Microsoft.AspNet.Server.Kestrel", "ef": "EntityFramework.Commands" }, "frameworks": { "dnx451": { } }, Обновление: Мой провайдер log4net был взят отсюда
g

gdoron is supporting Monica

6 лет назад

Ответов: 8

Как имитировать асинхронный репозиторий с помощью Entity Framework Core

Я пытаюсь создать модульный тест для класса, который вызывает асинхронный репозиторий. Я использую ASP.NET Core и Entity Framework Core. Мой общий репозиторий выглядит так.public class EntityRepository : IEntityRepository where TEntity : class { private readonly SaasDispatcherDbContext _dbContext; private readonly DbSet _dbSet; public EntityRepository(SaasDispatcherDbContext dbContext) { _dbContext = dbContext; _dbSet = dbContext.Set(); } public virtual IQueryable GetAll() { return _dbSet; } public virtual async Task FindByIdAsync(int id) { return await _dbSet.FindAsync(id); } public virtual IQueryable FindBy(Expression> predicate) { return _dbSet.Where(predicate); } public virtual void Add(TEntity entity) { _dbSet.Add(entity); } public virtual void Delete(TEntity entity) { _dbSet.Remove(entity); } public virtual void Update(TEntity entity) { _dbContext.Entry(entity).State = EntityState.Modified; } public virtual async Task SaveChangesAsync() { await _dbContext.SaveChangesAsync(); } } Затем у меня есть класс обслуживания, который вызывает FindBy и FirstOrDefaultAsync для экземпляра репозитория: public async Task GetCompanyProductURLAsync(Guid externalCompanyID, string productCode, Guid loginToken) { CompanyProductUrl companyProductUrl = await _Repository.FindBy(u => u.Company.ExternalCompanyID == externalCompanyID && u.Product.Code == productCode.Trim()).FirstOrDefaultAsync(); if (companyProductUrl == null) { return null; } var builder = new UriBuilder(companyProductUrl.Url); builder.Query = $"-s{loginToken.ToString()}"; return builder.Uri; } Я пытаюсь имитировать вызов репозитория в своем тесте ниже: [Fact] public async Task GetCompanyProductURLAsync_ReturnsNullForInvalidCompanyProduct() { var companyProducts = Enumerable.Empty().AsQueryable(); var mockRepository = new Mock>(); mockRepository.Setup(r => r.FindBy(It.IsAny>>())).Returns(companyProducts); var service = new CompanyProductService(mockRepository.Object); var result = await service.GetCompanyProductURLAsync(Guid.NewGuid(), "wot", Guid.NewGuid()); Assert.Null(result); } Однако, когда тест выполняет вызов репозитория, я получаю следующую ошибку:The provider for the source IQueryable doesn't implement IAsyncQueryProvider. Only providers that implement IEntityQueryProvider can be used for Entity Framework asynchronous operations. Как мне правильно смоделировать репозиторий, чтобы заставить его работать?
J

Jed Veatch

5 лет назад

Ответов: 7

Имя среды доступа в Program.Main в ASP.NET Core

Использование ASP.NET Mvc Core Мне нужно было настроить свою среду разработки на использование https, поэтому я добавил ниже метод Main в Program.cs:var host = new WebHostBuilder() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup() .UseKestrel(cfg => cfg.UseHttps("ssl-dev.pfx", "Password")) .UseUrls("https://localhost:5000") .UseApplicationInsights() .Build(); host.Run(); Как я могу получить доступ к среде хостинга здесь, чтобы я мог условно установить протокол/номер порта/сертификат?В идеале я бы просто использовал интерфейс командной строки для управления средой хостинга, например:dotnet run --server.urls https://localhost:5000 --cert ssl-dev.pfx password но похоже нет возможности использовать сертификат из командной строки.
M

Mike Lunn

5 лет назад

Ответов: 3

Как я могу получить базовый URL моего сайта в ASP.NET Core?

Скажем, мой веб-сайт размещен в папке mywebsite папки www.example.com, и я посещаю https://www.example.com/mywebsite/home/about.Как мне получить часть базового URL-адреса в контроллере MVC? Часть, которую я ищу, это https://www.example.com/mywebsiteПриведенный пример здесь не работает, так как у нас нет доступа к Request.Url в ASP.NET Core
j

jao

5 лет назад

Ответов: 7

.NET Core — когда использовать «dotnet new sln»

Я немного запутался - в большинстве руководств по .NET Core, которые я читал, не упоминается "dotnet new sln" - они всегда просто создают проекты отдельно без какого-либо файла решения, связывающего их вместе. Является ли "dotnet new sln" новой командой? Когда я должен использовать это? Какие преимущества я получаю от создания файла .sln вместо того, чтобы просто иметь файлы проекта? Это в основном для открытия в Visual Studio? Я использую Visual Studio Code для Mac, поэтому он может быть неприменим. Я погуглил "dotnet new sln", и результаты очень минимальны.
A

AndyNZ

5 лет назад

Ответов: 1

Файл ресурсов obj\project.assets.json не имеет цели - VS2017

Использование Visual Studio 2017, AspNetCore 1.1.2Внезапно я получаю следующую ошибку, когда пытаюсь опубликовать (выпустить сборку) любой проект в решении: Файл активов 'C:\example\obj\project.assets.json' не имеет цели для «.NETFramework, версия = v4.5.2/win7-x86». Убедитесь, что восстановление запущено и что вы включили «net452» в TargetFrameworks для вашего проект. Вам также может понадобиться включить «win7-x86» в ваш проект. Идентификаторы среды выполнения. Проверил файлы project.assets.json, у меня есть:"targets": { ".NETFramework,Version=v4.5.2": { и"runtimes": { "win7-x86": { "#import": [] } В файлах *.csproj у меня есть: net452 x86 Конфиг в проектах не менялся. Единственное, сегодня я обновил VS2017 до последней версии 15.6.3. Может ли это вызвать проблему?
P

Paolo B

4 года назад

Ответов: 17

Свойства JSON теперь строчными буквами при переходе с ASP .Net Core 1.0.0-rc2-final на 1.0.0.

Я только что заменил наш проект с ASP .Net Core 1.0.0-rc2-final на 1.0.0. Наш сайт и клиент перестали работать из-за капитализации свойств JSON. Например, эта строка JavaScript теперь дает ошибку .for (var i = 0; i потому что контроллер теперь называет массив "items" вместо "Items". Я не вносил никаких изменений, кроме установки обновленных пакетов и редактирования файла project.json. Я не изменил файлы моделей C#, которые по-прежнему используют свои свойства с заглавной буквы.Почему контроллеры ASP.Net Core начали возвращать JSON со свойствами в нижнем регистре? Как мне вернуться к ним, соблюдая регистр имен свойств из модели?
d

dumbledad

6 лет назад

Ответов: 8

ASP.NET Core – Swashbuckle не создает файл swagger.json

У меня возникли проблемы с получением пакета Swashbuckle.AspNetCore (1.0.0) для создания каких-либо выходных данных. Я читал, что файл swagger.json должен быть записан в «~/swagger/docs/v1». Однако я не получаю никакого вывода.Я начал с совершенно нового проекта ASP.NET Core API. Я должен упомянуть, что это ASP.NET Core 2. API работает, и я могу просто получать значения из контроллера значений.Конфигурация моего класса запуска точно соответствует описанию в этой статье (Swashbuckle.AspNetCore на GitHub).public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" }); }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); // Enable middleware to serve generated Swagger as a JSON endpoint. app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1"); }); } else { app.UseExceptionHandler(); } app.UseStatusCodePages(); app.UseMvc(); //throw new Exception(); } } Вы можете увидеть ссылки NuGet...Опять же, это все шаблон по умолчанию, но я включаю ValuesController для справки...[Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet] public IEnumerable Get() { return new string[] { "value1", "value2" }; } // GET api/values/5 [HttpGet("{id}")] public string Get(int id) { return "value"; } // POST api/values [HttpPost] public void Post([FromBody]string value) { } // PUT api/values/5 [HttpPut("{id}")] public void Put(int id, [FromBody]string value) { } // DELETE api/values/5 [HttpDelete("{id}")] public void Delete(int id) { } }
J

John Livermore

4 года назад

Ответов: 35

.NET Core 3.0: Razor views don't automatically recompile on change

According to the documentation, Razor views should, by default, recompile on change on local environments for ASP.NET Core 3.0. However, my project doesn't do this locally. If I change a view and refresh when I'm debugging locally, the change is not reflected. I have to stop the solution, re-run, and then see the change. I am doing this on a default ASP.NET Core Web Application template on Visual Studio 2019 with ASP.NET Core 3.0.0 Preview 2 using Razor pages. Any idea if I need to change settings to enable this feature? UPDATE NOV 2019 FOR 3.0 FULL RELEASE: This question still gets a lot of views. A few answers have cited to add services.AddControllersWithViews().AddRazorRuntimeCompilation(); To your ConfigureServices() function in Startup.cs after adding the Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet package. In my case, I am only using Razor Pages, so I don't call AddControllersWithViews(). Instead, this worked for me: services.AddRazorPages().AddRazorRuntimeCompilation();
t

tarun713

3 года назад

Ответов: 9

Установка Visual Studio 2017 прерывает основные проекты Visual Studio 2015 ASP.NET

После установки Visual Studio 2017 Professional я больше не могу собрать ASP.NET Core в Visual Studio 2015 Professional. Я никогда не открывал этот проект в VS2017Я получаю Произошла следующая ошибка при попытке запустить серверный процесс модели проекта (1.0.0-preview3-004056). Не удалось запустить процесс. Не найден исполняемый файл, соответствующий команде dotnet-projectmodel-server Затем я создал новый проект ASP.NET Core в Visual Studio 2015 и получаю точно такое же сообщение при загрузке проекта.Дополнительно, когда я хочу собрать проект, я получаю MSB1009: Файл проекта не существует. Эта же проблема не возникает с проектами ASP.NET 5, поэтому она ограничена только ASP.NET CoreОбновление Visual Studio 2017 от 7 мартаЕсли добавлен файл global.json, как в ответах ниже, получите сообщение об ошибке для любой версии .net framework, используемой в global.json и существующей в C: \ Program Files \ dotnet\sdk\ папка Error MSB4019 Импортированный проект "C:\Program Files\dotnet\sdk\X.X.X\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Props" не найден. Подтвердите правильность пути в объявлении и наличие файла на диске. Также при закрытии Visual Studio и повторном открытии я получаю исходное сообщение об ошибке
d

dfmetro

5 лет назад

Ответов: 5

ПО промежуточного слоя для проверки подлинности ASP.NET Core 2.0

В Core 1.1 последовал совет @blowdart и реализовано специальное промежуточное ПО:https://stackoverflow.com/a/31465227/29821Работало так: Промежуточное ПО запущено. Подобрали токен из заголовков запроса. Проверил токен и, если он действителен, создал идентификатор (ClaimsIdentity), содержащий несколько утверждений, которые затем были добавлены через HttpContext.User.AddIdentity(); В ConfigureServices с использованием services.AddAuthorization я добавил политику, требующую утверждения, предоставляемого промежуточным программным обеспечением. В контроллерах/действиях я бы использовал [Авторизовать(Роли = "некоторая роль, добавленная промежуточным ПО")] Это отчасти работает с 2.0, за исключением того, что если токен недействителен (шаг 2 выше) и утверждение никогда не добавляется, я получаю сообщение «Схема аутентификации не была указана, и схема DefaultChallengeScheme не была найдена».Итак, теперь я читаю, что авторизация изменилась в 2.0:https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2xКак мне правильно сделать то же самое в ASP.NET Core 2.0? Я не вижу примера действительно индивидуальной аутентификации.
p

pbz

4 года назад

Ответов: 2

Как читать ASP.NET Core Response.Body?

Я изо всех сил пытался получить свойство Response.Body из действия ASP.NET Core, и единственное решение, которое мне удалось определить, кажется неоптимальным. Решение требует замены Response.Body на MemoryStream при чтении потока в строковую переменную, а затем обратного обмена перед отправкой клиенту. В приведенных ниже примерах я пытаюсь получить значение Response.Body в пользовательском классе промежуточного ПО.Response.Body по какой-то причине является set единственным свойством в ASP.NET Core? Я просто что-то упустил, или это недосмотр/ошибка/проблема дизайна? Есть ли лучший способ прочитать Response.Body?Текущее (субоптимальное) решение:public class MyMiddleWare { private readonly RequestDelegate _next; public MyMiddleWare(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { using (var swapStream = new MemoryStream()) { var originalResponseBody = context.Response.Body; context.Response.Body = swapStream; await _next(context); swapStream.Seek(0, SeekOrigin.Begin); string responseBody = new StreamReader(swapStream).ReadToEnd(); swapStream.Seek(0, SeekOrigin.Begin); await swapStream.CopyToAsync(originalResponseBody); context.Response.Body = originalResponseBody; } } } Попытка решения с использованием EnableRewind(): Это работает только для Request.Body, а не для Response.Body. Это приводит к чтению пустой строки из Response.Body, а не фактического содержимого тела ответа.Startup.cspublic void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime appLifeTime) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); app.Use(async (context, next) => { context.Request.EnableRewind(); await next(); }); app.UseMyMiddleWare(); app.UseMvc(); // Dispose of Autofac container on application stop appLifeTime.ApplicationStopped.Register(() => this.ApplicationContainer.Dispose()); } MyMiddleWare.cspublic class MyMiddleWare { private readonly RequestDelegate _next; public MyMiddleWare(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { await _next(context); string responseBody = new StreamReader(context.Request.Body).ReadToEnd(); //responseBody is "" context.Request.Body.Position = 0; } }
J

JTW

5 лет назад

Ответов: 6

Команда dotnet ef не найдена

Я слежу за документами, чтобы создать начальную миграцию. Когда я выполняю dotnet, я получаю раздел справки, означающий, что PATH работает правильно.Затем я пытаюсь выполнить команду ниже из документации в окне консоли: миграции dotnet ef добавить InitialCreate Получаю следующую ошибку: Невозможно выполнить, поскольку указанная команда или файл не найдены. Возможные причины: Вы неправильно написали встроенную команду dotnet. Вы намеревались выполнить программу .NET Core, но dotnet-ef не существует. Вы намеревались запустить глобальный инструмент, но исполняемый файл с префиксом dotnet с таким именем не может быть найден в PATH. Я исключил первый элемент, так как скопировал команду. Я исключил второй элемент, потому что установлен пакет Microsoft.EntityFrameworkCore.SqlServer. Я исключил третий элемент, потому что я получаю раздел справки при вызове dotnet. Я ищу в Google эту проблему, но поскольку версия новая, там особо нечего делать и / или она тонет в аналогичных проблемах из более ранних версий.Я пытался принудительно установить Microsoft.EntityFrameworkCore на случай, если его нужно явно добавить. Я столкнулся с сообщением об ошибке, в котором говорилось, что последняя версия на выбор - 2.2.6, и переход на более раннюю версию запрещен. Я не уверен, как установить версию, совместимую с SQL-пакетом, который у меня уже есть в моей системе (и даже менее уверен, если это правильный подход для устранения этой проблемы). Обнаружено понижение версии пакета: Microsoft.EntityFrameworkCore с 3.0.0-preview6.19304.10 на 2.2.6. Ссылка на пакет прямо из проекта, чтобы выбрать другую версию. Интернет -> Microsoft.EntityFrameworkCore.SqlServer 3.0.0-preview6.19304.10 -> Microsoft.EntityFrameworkCore.Relational 3.0.0-preview6.19304.10 -> Microsoft.EntityFrameworkCore (> = 3.0.0-preview6.19304.10) Интернет -> Microsoft.EntityFrameworkCore (> = 2.2.6)
K

Konrad Viltersten

3 года назад

Ответов: 15

Как настроить Automapper в ASP.NET Core

Я относительно новичок в .NET и решил заняться .NET Core вместо того, чтобы изучать «старые способы». Я нашел подробную статью о настройке AutoMapper для .NET Core здесь, но есть ли более простое руководство для новичков?
t

theutz

5 лет назад

Ответов: 17

Проверка подлинности веб-API ASP.NET Core

Я не понимаю, как настроить аутентификацию в моем веб-сервисе. Служба построена с использованием веб-API ASP.NET Core.Все мои клиенты (приложения WPF) должны использовать одни и те же учетные данные для вызова операций веб-службы.После некоторого исследования я придумал базовую аутентификацию - отправку имени пользователя и пароля в заголовке HTTP-запроса. Но после нескольких часов исследований мне кажется, что базовая проверка подлинности - это не способ использовать ASP.NET Core.Большинство ресурсов, которые я нашел, реализуют аутентификацию с использованием OAuth или другого промежуточного программного обеспечения. Но это кажется слишком большим для моего сценария, а также для использования идентификационной части ASP.NET Core.Итак, каков правильный способ достичь моей цели - простая аутентификация с использованием имени пользователя и пароля в веб-службе ASP.NET Core?Заранее спасибо!
F

Felix

5 лет назад

Ответов: 9

ASP.NET Core return JSON with status code

I'm looking for the correct way to return JSON with a HTTP status code in my .NET Core Web API controller. I use to use it like this:public IHttpActionResult GetResourceData() { return this.Content(HttpStatusCode.OK, new { response = "Hello"}); } This was in a 4.6 MVC application but now with .NET Core I don't seem to have this IHttpActionResult I have ActionResult and using like this:public ActionResult IsAuthenticated() { return Ok(Json("123")); } But the response from the server is weird, as in the image below:I just want the Web API controller to return JSON with a HTTP status code like I did in Web API 2.
R

Rossco

5 лет назад

Ответов: 12

2022 WebDevInsider