Как настроить хранилище таблицы Azure в локальном контейнере Docker?C#

Место общения программистов C#
Ответить
Anonymous
 Как настроить хранилище таблицы Azure в локальном контейнере Docker?

Сообщение Anonymous »

Я пытаюсь настроить класс репозитория, который создаст таблицу, если ее не существует в моей базе данных хранения Azure. Вот конструктор: < /p>

Код: Выделить всё

    public TableStorageRepository(string storageAccountConnectionString, string tableName)
{

var options = new TableClientOptions
{
Retry =
{
MaxRetries = 5,
Delay = TimeSpan.FromSeconds(2),
MaxDelay = TimeSpan.FromSeconds(10),
Mode = RetryMode.Exponential
}
};
var serviceClient = new TableServiceClient(storageAccountConnectionString, options);
_tableClient = serviceClient.GetTableClient(tableName);
_tableClient.CreateIfNotExists();
}
< /code>
Вот логика, которая вызывает ее /настраивает di в программе .cs: < /p>
builder.Services.AddScoped(provider =>
{
var connectionString = builder.Configuration["AzureTableStorage:ConnectionString"]; //use appsettings.[Development].json
var tableName="Deployment";
return new TableStorageRepository(connectionString, tableName);
});
< /code>
Когда я пытаюсь запустить метод на моем контроллере, получает развертывание, логика репозитория является триггером, но он не работает, когда он пытается метод createifnotexists ().
ошибка: ошибка: < /p>

system.aggregateException: повторный рит после 4 попыток. Настройки повторения могут быть скорректированы в ClientOptions.retry или путем настройки пользовательской политики повторной попытки в ClientOptions.retrypolicy. (При отправке запроса произошла ошибка при отправке запроса.) (При отправке запроса произошла ошибка. произошел при отправке запроса.
system.net.http.httprequestexception: произошла ошибка при отправке запроса.
system.net.http.httpioexception: ответ был завершен преждевременно. (Ответ)
at system.net.http.httpconnection.sendasync (httprequestmessage, логический асинхро .HttpConnection.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net. Http.diagnosticshandler.sendasynccore (httprequestmessage, логический асинхро Osects, CancellationTokenSource wendingRequestScts, CancellationToken OriginalCancellationToken)
at azure.core.pipeline.httpclienttransport.processsyncorasync (httpmessage, Boolean async)
end Inner Exception Trace ---
at azure.core.pipeline.httpclienttranspors. Сообщение, логическое асинхро1 pipeline) at Azure.Core.Pipeline.ResponseBodyPolicy.ProcessAsync(HttpMessage message, ReadOnlyMemory< /code> 1 трубопровод, логический асинхро1 pipeline, Boolean async) at Azure.Core.Pipeline.RetryPolicy.ProcessAsync(HttpMessage message, ReadOnlyMemory
1 Pipeline, Boolean Async)
End of Inner Exception Stack Trace ---

Любые предложения будут оценены.
Я попытался изменить код, поэтому вместо строки подключения он передает отдельные параметры. Что -то подобное: < /p>

Код: Выделить всё

    public TableStorageRepository(string accountName, string accountKey, string tableName, string endpointUri = null)
{
var serviceUri = endpointUri != null ? new Uri(endpointUri) : new Uri($"https://{accountName}.table.core.windows.net");
var credential = new TableSharedKeyCredential(accountName, accountKey);
_tableClient = new TableClient(serviceUri, tableName, credential);
// Ensure the table exists asynchronously
_tableClient.CreateIfNotExistsAsync().GetAwaiter().GetResult();
}
< /code>
Я получаю те же результаты - что имеет смысл, потому что я думаю, что само подключение производится правильно.  По крайней мере, это моя интерпретация. Система хранения отвечает.

у меня есть следующий раздел в docker-compose.yml: < /p>
azureTableStorage:
image: mcr.microsoft.com/azure-storage/azurite:latest #Todo: replace with a real version once everyting is working
container_name: azureTableStorage
ports:
- "10000:10000" # Blob service
- "10001:10001" # Queue service
- "10002:10002" # Table service
command: "azurite-table --loose --location /data --debug /dev/stdout"
volumes:
- .azureTableStorage/data:/azureTableStorage/data
environment:
- AZURITE_ACCOUNTS=devstoreaccount1:Eby8vdM02xNOcqFevkbPZRvz1FclJ7t3YvsZ6Eby8vdM02xNOcqFevkbPZRvz1FclJ7t3YvsZ6 #sdk expects base64.  But docker file just expects plain
< /code>
Контейнер не запускает проблем.  Но ... я не могу запустить каких -либо команд завивки внутри контейнера (или за его пределами), чтобы увидеть данные таблицы. 
Вот что я попробовал в контейнере: 
/opt/azurite # curl -X GET \
>   -H "Authorization: SharedKey devstoreaccount1:RWJ5OHZkTTAyeE5PY3FGZXZrYlBaUnZ6MUZjbEo3dDNZdnNaNkVieTh2ZE0wMnhOT2NxRmV2a2JQWlJ2ejFGY2xKN3QzWXZzWjY=" \
>   -H "Accept: application/json;odata=fullmetadata" \
>   -H "x-ms-version: 2019-02-02" \
>   http://127.0.0.1:10002/devstoreaccount1/Tables


AuthorizationFailure
Server failed to authenticate the request. Make sure the value of the Authorization header is formed correctly including the signature.
RequestId:5376245b-4fd1-4db9-992f-6bb88c1c658c
Time:2025-02-10T19:22:24.822Z
/opt/azurite #
< /code>
Значение ключа, которое я отправляю, - это значение, которое я получаю от этой команды PowerShell:

Код: Выделить всё

[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("Eby8vdM02xNOcqFevkbPZRvz1FclJ7t3YvsZ6Eby8vdM02xNOcqFevkbPZRvz1FclJ7t3YvsZ6"))  

Редактировать 1
Я следовал инструкциям.
< ol>
[*] Обновил мой Docker-Compose, чтобы включить переменную среды.
[*] Моя программа. >

[*] Правильная строка коннекции передается из appsettings.development.json:

< /ol>
Но конструктор сбой с ошибкой: < /p>

Исключение произошло: clr /system.formatexception исключение из
type 'system.formatexception' произошел в system.private.corelib.dll
, но не обрабатывался в коде пользователя: «Ввод не является действительной строкой BASE-64
, поскольку она содержит НЕ-базовый 64 символ, более двух символов накладки
или незаконной символ среди символов. /> at System.Convert.Frombase64String (String S) AT
accountkey) at
azure.data.tables.tableSharedKeyCredential String accountname,
String accountKey) at
zaure.data.tables.tableconnectionstring.getcredentials(connectionString
Настройки) на
/> ConnectionString, TableConnectionString & AccountInformation, String &
Error) на azure.data.tables.tableconnectionString.parse (string
connectionString) at azure.data.tables.tableclient..cor (строка
connectionStringString. , String TableName, опции TableClientOptions) по адресу
tableName) на
vovider.gateway.infrastructure.storage.tablestorage.tablestoragerepority. 1..ctor (String
ConnectionString, String TableName) в
/users/me/src/projects/provider-gateway/provider.gateway/infrastructure/storage/tablestoragerepository.cs:line
46


Подробнее здесь: https://stackoverflow.com/questions/794 ... -container
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»