Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
a4e931b
New Dotnet project added to the samples
axtox Jun 5, 2025
ccc7347
Add .NET sample task and S3 connection example
axtox Jun 5, 2025
25af41a
Enhance S3 sample: add bucket listing and error handling in TryExecut…
axtox Jun 5, 2025
4b73121
Add README.md for .NET S3 sample with usage instructions and requirem…
axtox Jun 5, 2025
7a6598f
Fix formatting in README.md: add line breaks for better readability
axtox Jun 6, 2025
44e2b66
Refactor S3 sample: improve error handling and enhance JSON output fo…
axtox Jun 6, 2025
c5fb1f5
Enhance S3 sample: add file upload, object retrieval, and bucket dele…
axtox Jun 7, 2025
d6f507c
Refactor S3 client creation: validate S3 settings using IsValid method
axtox Jun 7, 2025
8c4c401
Add Docker support for .NET sample: create tasks for building and run…
axtox Jun 7, 2025
87a1db3
Update README.md: change shell to bash for code blocks and improve Do…
axtox Jun 8, 2025
4d12f27
Update README.md: change code block syntax from bash to console for c…
axtox Jun 8, 2025
e8e2792
Add .NET example link to main README.md
axtox Jun 8, 2025
bbe474c
Refactor S3 settings loading: encapsulate logic in LoadS3Settings met…
axtox Jun 8, 2025
24c3406
Update .NET link in README.md to point to the directory instead of RE…
axtox Jun 8, 2025
201ca63
Errors will now show stacktrace and inner exceptions
axtox Jun 18, 2025
582adef
Region was missing in the s3 config
axtox Jun 20, 2025
147a91d
Added Timeweb S3 compatibility issue in Readme
axtox Jun 20, 2025
e154c3e
AWS SDK updated to 4.0.2 with remarks
axtox Jun 27, 2025
a2d6692
S3 Object tagging example added
axtox Jun 27, 2025
026fb18
S3 Object Lifecycle example added
axtox Jun 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
{
"version": "2.0.0",
"tasks": [
{
"label": ".NET Sample. Local: Run .NET Sample Locally",
"detail": "Run a .NET sample application locally. Requires .NET SDK 10 to be installed.",
"type": "shell",
"command": "dotnet",
"args": ["run", "sample.cs"],
"options": {
"cwd": "${workspaceFolder}/dotnet/src"
},
"group": {
"kind": "build"
}
},
{
"label": ".NET Sample. Docker: Build Docker Image",
"detail": "Build a Docker image for the .NET sample application. Requires Docker to be installed.",
"type": "docker-build",
"dockerBuild": {
"context": "${workspaceFolder}/dotnet/src",
"dockerfile": "${workspaceFolder}/dotnet/Dockerfile",
"tag": "dotnet-s3-example:latest"
}
},
{
"label": ".NET Sample. Docker: Build an Image and Run Container",
"detail": "Run a .NET sample application in a Docker container. Requires Docker to be installed.",
"type": "process",
"command": "docker",
"args": [
"run",
"--rm",
"-it",
"--name",
"dotnet-s3-example",
"--env-file",
"${workspaceFolder}/dotnet/src/.env",
"dotnet-s3-example:latest"
],
"dependsOn": ".NET Sample. Docker: Build Docker Image",
"group": {
"kind": "build"
}
}
]
}
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@
- [Node.js](https://github.com/timeweb-cloud/s3-examples/tree/master/nodejs)
- [Python](https://github.com/timeweb-cloud/s3-examples/tree/master/python3)
- [PHP](https://github.com/timeweb-cloud/s3-examples/tree/master/php)
- [.NET](./dotnet)
1 change: 1 addition & 0 deletions dotnet/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.env
57 changes: 57 additions & 0 deletions dotnet/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
## A streamlined .gitignore for modern .NET projects
## including temporary files, build results, and
## files generated by popular .NET tools. If you are
## developing with Visual Studio, the VS .gitignore
## https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
## has more thorough IDE-specific entries.
##
## Get latest from https://github.com/github/gitignore/blob/main/Dotnet.gitignore

# Environment files
.env

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg

# Others
~$*
*~
CodeCoverage/

# MSBuild Binary and Structured Log
*.binlog

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
18 changes: 18 additions & 0 deletions dotnet/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Stage 1: Convert to regular project and build the app
FROM mcr.microsoft.com/dotnet/sdk:10.0-preview-alpine AS build
WORKDIR /src

# convert the sample to a regular project to reduce image size
COPY sample.cs .
RUN dotnet project convert sample.cs

RUN dotnet publish sample/ \
-c Release

# Stage 2: Use ~<100mb image and run the app
FROM mcr.microsoft.com/dotnet/runtime:10.0-preview-alpine AS runtime
WORKDIR /app

COPY --from=build /src/sample/bin/Release/net10.0/publish .

ENTRYPOINT ["./sample"]
74 changes: 74 additions & 0 deletions dotnet/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Использование dotnet-sdk Для Работы с S3 Хранилищем Timeweb Cloud
## Описание
> [!WARNING]
> Версия NuGet пакета `AWS.SDK` в примере `<=4.0.2`, однако, на Июнь 2025 года она не работает полноценно с методами `PutObject` (для работы `PutObject` необходимо либо установить флаг `DisableDefaultChecksumValidation` в `true` во время создания запроса `PutObjectRequest`, либо использовать версию SDK `<=3.5.10.2`), поскольку Timeweb S3 пока что не поддерживает самые последние версии .NET клиентов. Предположительно, это связано с обновлением не самого S3 API, который так и остался в версии `2006-03-01`, но с новыми требованиями к сети (HTTP/2), валидацией checksum (DefaultChecksumValidation), `nullable` поля и др.

Приложение показывает использование S3 хранилища Timeweb Cloud в `dotnet`, при запуске будут выполнены следующие команды:
1. Создание бакета (если уже существует - вернет детали существующего бакета)
1. Регион бакета
1. Список бакетов
1. Отправка текста в файл
1. Отправка файла
1. Получение списка файловы
1. Скачивание файла
1. Получение метаданных файла
1. Копирование файла
1. Присвоение тега файлу
1. Получение информации о тегах в файле
1. Создание правил жизненного цикла файлов (правила по тегу, по названию папок)
1. Получение правил жизненного цикла файлов
1. Удаление всех тегов файла
1. Удаление правил жизненного цикла файлов
1. Удаление всех файлов
1. Удаление бакета

> [!CAUTION]
> Во время выполнения этой программы будет выполнено удаление бакета и всех файлов в нем! Будьте аккуратны когда указываете имя существующего бакета в `.env`

При успешном завершении операции будет выведен ответ от S3 API в формате JSON, при неудаче - детали ошибки. Если в качестве ответа приходит файл, будет выведено его содержимое (поддерживаются только текстовые файлы).

В качестве клиента к S3 хранилищем Timeweb Cloud используется официальный SDK от Amazon (`AWS.SDK`) версии `4.0.2`, ендпоинт Timeweb Cloud S3 API `https://s3.twcstorage.ru`
В [sample.cs](./src/sample.cs) описаны основные ендпоинты для работы с API, для запуска потребуется переименовать [.env.example](./src/.env.example) в `.env` и вписать настоящие данные для подключения к S3 хранилищу Timeweb Cloud, которые можно найти во вкладке `Дашборд` в разделе `Хранилище S3` в личном кабинете Timeweb Cloud.

Больше информации об объектном S3 хранилище Timeweb Cloud в [документации](https://timeweb.cloud/docs/s3-storage).

## Требования
- Linux/Windows/macOS
- dotnet 10/Docker
### Запуск через CLI
Для локального запуска требуется установка [dotnet SDK версии >=10](https://dotnet.microsoft.com/en-us/download/dotnet/10.0) и заполненный `.env` файл.

После установки достаточно выполнить эту команду в любой консоли (убедитесь что выполняете команду из папки ./dotnet/src):
```console
dotnet run sample.cs
```

### Запуск через Docker
Для запуска и сборки через Docker требуется установка [Docker](https://www.docker.com/) и заполненный `.env` файл.

В проекте присутствует [Dockerfile](./Dockerfile) с двумя стейджами для уменьшения размера docker image:

**Stage 1**: Использует dotnet 10.0 SDK и конвертирует файл [sample.cs](./src/sample.cs) в классический формат проекта dotnet чтобы иметь возможность собрать исполняемый файл (пока что для direct file запуска требуется SDK, он довольно тяжеловесный). Из-за требований S3 библиотеки к функциям рефлексии, ради экономии времени было решено не идти по пути AOT (размер докер образа можно было бы уменьшить до ~<10mb)
**Stage 2**: Копирует компилированные файлы в исполняемый образ и создает `ENTRYPOINT`

Для сборки проекта достаточно выполнить следующую CLI команду, находясь в папке `./dotnet`:
```console
docker build -t dotnet-s3-example:latest ./src
```

Для запуска приложения после сборки:
```console
docker run --rm -it --name dotnet-s3-example --env-file ./src/.env dotnet-s3-example:latest
```

### Запуск через Visual Studio Code
> [!NOTE]
> Так как приложение писалось когда .NET 10 был еще в Preview 4, запуск через F5 с дебаггером на тот момент не был реализован для direct file приложений, поэтому опция с дебагом отсутствует так же как и файл launch.json

Для Visual Studio Code поддерживаются 2 варианта запуска:
1. [Локальный запуск](#запуск-через-cli)
2. [Запуск через Docker](#запуск-через-docker)

Так как это просто шорткаты для двух описанных выше вариантов запуска, при выборе определенного варианта все требования необходимо удовлетворить.

Для удобства в проекте создан файл `tasks.json` благодаря которому программу можно запустить через сочетание клавиш `CTRL + SHIFT + B` для Windows и `CMD + SHIFT + B` для MacOS -> `Run .NET Sample`
11 changes: 11 additions & 0 deletions dotnet/src/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Данные для подключения к S3 хранилищу Timeweb Cloud
# можно найти во вкладке `Дашборд` в разделе `Хранилище S3`
# в личном кабинете Timeweb Cloud.

# Ковычки в значениях использовать не следует, так как они плохо распознаются командой docker run.
S3__SERVICEURL=https://s3.twcstorage.ru
S3__REGION=ru-1
# Имя нового или существующего бакета, лучше всего работает UUID
S3__BUCKETNAME=
S3__ACCESSKEY=
S3__SECRETKEY=
Loading