Задать вопрос
Контакты

Достижения

Все достижения (1)

Наибольший вклад в теги

Все теги (7)

Лучшие ответы пользователя

Все ответы (13)
  • Приложение для винды -- на чем написать новичку?

    @mxelgin
    Если в долгую в разработку хотите запрыгнуть то только си шарп, других вариантов нет.
    Ответ написан
    Комментировать
  • Как из docker контейнера стучаться в другие сети?

    @mxelgin
    Чтобы из Docker-контейнера обращаться к другим сетям или сервисам, нужно учесть несколько моментов. Вот основные шаги и рекомендации:

    1. Подключение к внешним сетям
    Если вы хотите, чтобы ваш контейнер мог обращаться к внешним сетям (например, к другим контейнерам, которые находятся в разных сетях), убедитесь, что:

    Контейнер находится в той же сети, что и целевые сервисы.

    2. Создание сети в Docker Compose
    Можно создать пользовательскую сеть в docker-compose.yml, чтобы контейнеры могли видеть друг друга:
    version: '3'
    
    services:
      web:
        volumes:
          - ./web:/app
        env_file:
          - ./web/.env
        build: ./web
        ports:
          - '8000:8000'
        networks:
          - my_network
    
      other_service:
        image: some_image
        networks:
          - my_network
    
    networks:
      my_network:
        driver: bridge

    3. Обращение к сервисам
    Внутри контейнера вы можете обращаться к другим контейнерам по имени сервиса, указанному в docker-compose.yml. Например, если у вас есть другой сервис с именем other_service, вы можете обращаться к нему по адресу http://other_service:port.
    4. Обращение к внешним ресурсам
    Если вы хотите обращаться к ресурсам вне Docker (например, к API или к базе данных на внешнем сервере), просто используйте их IP-адрес или доменное имя. Например:

    environment:
      - API_URL=http://external.api.com

    5. Проверка сетевых настроек
    Если возникают проблемы с соединением, проверьте следующее:

    Убедитесь, что у контейнера есть доступ к интернету.
    Проверьте настройки брандмауэра на хосте.
    Убедитесь, что целевые сервисы доступны из контейнера.
    Пример
    Вот пример docker-compose.yml, который включает подключение к сети и другой сервис:

    version: '3'
    
    services:
      web:
        volumes:
          - ./web:/app
        env_file:
          - ./web/.env
        build: ./web
        ports:
          - '8000:8000'
        networks:
          - my_network
    
      db:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: example
        networks:
          - my_network
    
    networks:
      my_network:
        driver: bridge

    В этом примере контейнер web может подключаться к контейнеру db по адресу db:3306.
    Ответ написан
    Комментировать
  • Как собрать общий конфиг для docker и asp net?

    @mxelgin Автор вопроса
    Вот мое решение
    public class DockerContext: DbContext
        {
            private bool InDocker { get { return Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true"; } }
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                if (!InDocker)
                {
    // Здесь переопределяем ConnectionString для миграций
                }
            }


    или так
    program.cs
    public static bool InDocker { get { return Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true"; } }
    public static void Main(string[] args)
    {
      var builder = WebApplication.CreateBuilder(args);
      builder.Services.AddDbContext<DockerContext>(options =>
                    options.UseSqlServer(builder.Configuration.GetConnectionString(InDocker ? "DockerContext" : "MigrationContext") ?? throw new InvalidOperationException("Connection string 'DockerContext' not found.")));
    }
    Ответ написан
    7 комментариев
  • Как лучше всего возвращать ответы?

    @mxelgin
    для ошибок уже есть RFC 7807, в c# уже есть готовый ProblemDetail
    https://datatracker.ietf.org/doc/html/rfc7807

    не выявленные ошибки также нужно отлавливать в middlware

    вот пример

    public class ResponseResult<T> : IResponseResult<T>
        {
            public bool IsSuccess { get; private set; }
    
            public ProblemDetails? Error { get; private set; }
    
            public T? Data { get; private set; }
    
            public static ResponseResult<T> Success(T data) => new ResponseResult<T> { IsSuccess = true, Data = data };
            public static ResponseResult<T> Success() => new ResponseResult<T> { IsSuccess = true};
            public static ResponseResult<T> Failure(Exception exception) => new ResponseResult<T>
            {
                IsSuccess = false,
                Error = new ProblemDetails
                {
                    Title = GetTitleByException(exception),
                    Detail = exception.Message,
                    Status = exception switch
                    {
                        ArgumentException => StatusCodes.Status400BadRequest,
                        KeyNotFoundException => StatusCodes.Status404NotFound,
                        UnauthorizedAccessException => StatusCodes.Status401Unauthorized,
                        _ => StatusCodes.Status500InternalServerError
                    },
                    Instance = Guid.NewGuid().ToString()
                }
            };
    
            private static string GetTitleByException(Exception exception) =>
                exception switch
                {
                    ArgumentException => "Invalid argument",
                    KeyNotFoundException => "Resource not found",
                    UnauthorizedAccessException => "Unauthorized",
                    _ => "Internal server error"
                };
        }


    Слой бизнес логики
    return ResponseResult<bool>.Failure(
                        new KeyNotFoundException(
                            string.Format("User with login '{0}' not found", request.Login))
                        );


    Презентационный слой
    [HttpGet("verify")]
            public async Task<ActionResult> VerifyUser(
                [FromQuery] string login,
                [FromQuery] string password,
                CancellationToken cancellationToken)
            {
                var result = await mediator.Send(new VerifyQuery() { Login = login, Password = password }, cancellationToken);
    
                if (result.IsSuccess)
                {
                    return Ok(new { verify = result.Data });
                }
    
                return StatusCode(result.Error?.Status ?? 400, result.Error);
            }
    Ответ написан
    Комментировать

Лучшие вопросы пользователя

Все вопросы (6)