Я пытаюсь реализовать функции Azure v2 с подключениями к хранилищу BLOB-объектов и базе данных SQL.
Существует множество пакетов, которые больше не поддерживаются;и я обнаружил, что Microsoft.WindowsAzure.Configuration
больше не поддерживается и что мне нужно использовать ASP.NET Core Configuration
.
. Я пытался реализовать это, как описано в этой статье , но я получаю сообщение об ошибкевнутри лазурного кли:
System.Private.CoreLib: Exception while executing function: QueueProcessor. QueueProcessorAzureFunction: Could not load file or assembly 'Microsoft.Extensions.Configuration.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Could not find or load a specific file. (Exception from HRESULT: 0x80131621). System.Private.CoreLib: Could not load file or assembly 'Microsoft.Extensions.Configuration.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.
Также при попытке доступа к базе данных sql, как обычно:
using (var context = new DBEntities)
{
[…]
}
Я получаю еще одну ошибку в кли:
System.Private.CoreLib: Exception while executing function: QueueProcessor. EntityFramework: The type initializer for 'System.Data.Entity.Internal.AppConfig' threw an exception. EntityFramework: Could not load file or assembly 'System.Configuration.ConfigurationManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
Чего мне не хватает?Может ли кто-нибудь помочь, пожалуйста?
Спасибо
РЕДАКТИРОВАТЬ:
Запрошенный код:
namespace QueueProcessorAzureFunction
{
public class StorageContext
{
private CloudStorageAccount _storageAccount;
public StorageContext(ExecutionContext context)
{
var config = new ConfigurationBuilder()
.SetBasePath(context.FunctionAppDirectory)
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
_storageAccount = CloudStorageAccount.Parse(config.GetConnectionString("BlobStorage"));
}
public CloudBlobClient BlobClient
{
get { return _storageAccount.CreateCloudBlobClient(); }
}
public CloudTableClient TableClient
{
get { return _storageAccount.CreateCloudTableClient(); }
}
public CloudQueueClient QueueClient
{
get { return _storageAccount.CreateCloudQueueClient(); }
}
}
}
Внутри очереди триггера Azureфункция:
public static void Run([QueueTrigger("stack", Connection = "AzureWebJobsStorage")]string myQueueItem, TraceWriter log, ExecutionContext context)
{
var storageContext = new StorageContext(context);
[…]
}
Внутри local.settings.json
:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "[…]",
"AzureWebJobsDashboard": "",
"BlobStorage": "[…]"
},
"ConnectionStrings": {
"DBEntities": {
"ConnectionString": "[…]",
"ProviderName": "System.Data.EntityCLient"
},
"BlobStorage": "[…]"
}
}
РЕДАКТИРОВАТЬ 2
ОК, поэтому ошибка возникает, когда я определяю varконфигурации;сейчас я просто передам строку подключения в конструкторе контекста Storage следующим образом:
public StorageContext(ExecutionContext context)
{
_storageAccount = CloudStorageAccount.Parse("CompleteConnectionString");
}
EDIT 3
Итак, для проблемы с базой данных SQL,учитывая, что моя база данных находится во втором проекте, где я добавляю модель данных сущности ADO.NET;Я не уверен, как я могу решить эту проблему.
Из того, что я понял, в .NET Standard мне нужно сейчас использовать инъекцию зависимостей в контекст БД.Но, учитывая, что у меня есть модель базы данных первой, у меня нет контекста БД ...
РЕДАКТИРОВАТЬ 4
Entity Framework Core ... Я думаю, вынеобходимо использовать Entity Framework Core с функцией Azure v2 ... попробуйте ЭТО .
РЕДАКТИРОВАТЬ 5
ОК.Во-первых, попытка использовать Scaffold-DbContext с консолью NuGet для генерации DBContext в проекте .NET Standard не работает.Следовательно, функции Azure v2 стандарта .NET 2.0 не могут использовать Scaffold-Dbcontext
для генерации своего DbContext.
Чтобы обойти это, я создал второй проект .Net Core, использовавший команду Scaffold-DBcontext длясоздайте Dbcontext и таблицы, а затем просто скопируйте их в мой проект функции Azure.На самом деле я использовал командную строку разработчика для VS, но я предполагаю, что использование консоли NuGet будет таким же.Вот полезная ссылка, чтобы сделать it .
Далее вы должны использовать внедрение зависимостей.И вот тут я застрял ... И это из-за управления версиями пакетов NuGet. Здесь - полезная ссылка, чтобы понять, как внедрить Dependency Injection в функциях Azure.
Просто: после установки пакета AzureFunctions.Autofac.2.0.0
(обратите внимание на версию) и Autofac.4.8.1
добавьте новый файл класса (давайте назовем его config.cs
); Внутри:
public class Config
{
public Config()
{
DependencyInjection.Initialize(builder =>
{
builder.RegisterType<DBContext>();
});
}
}
Теперь вы передаете Context как параметр, такой как [Inject]DBContext context
, затем вам нужно добавить [DependencyInjectionConfig(typeof(AutofacConfig))]
прямо под пространством имен, и я полагаю, вы можете получить доступ к базе данных сейчас;используя Linq, я могу написать что-то вроде: var a = context.Studies.Where(s => s.Id == 10569).FirstOrDefault();
Вот почему я предполагаю, что это работает.
В целом, так выглядит моя функция:
namespace FunctionApp10
{
[DependencyInjectionConfig(typeof(Config))]
public static class Function1
{
[FunctionName("Function1")]
public static void Run([QueueTrigger("queue", Connection = "AzureWebJobsStorage")]string myQueueItem, TraceWriter log, [Inject]DBContext context)
{
var a = context.Studies.Where(s => s.Id == 10569).FirstOrDefault();
}
}
}
Но когда я собираю, я получаюошибка
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Azure.WebJobs, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.
И я думаю, это потому, что он ищет версию 2.1.0, а у меня 3.0.0-бета5.Я попытался отредактировать csproj безуспешно.
Теперь, если вы попытаетесь загрузить AzureFunctions.Autofac.3.0.5
, он удаляет Windows.Azure.Storage.8.6.0
, и даже если вы переустановите его вручную, вы получите такие ошибки, как:
The type or namespace name 'QueueTriggerAttribute' could not be found (are you missing a using directive or an assembly reference?)
Мой выпуск на GitHub.
Вот и все ... Надеюсь, кто-нибудь это выяснит.