Нет ответа от web-сервиса на запрос
От: nekoriu Россия  
Дата: 21.12.21 09:02
Оценка:
Добрый день.

Разрабатываю web-сервис, C#, ASP.NET, .NET Core 3.1. Использую Postman.

Вызываю метод login, получаю bearer token. Вызываю Метод 1, ответ от сервиса приходит. Жду одну минуту. Снова вызываю Метод 1, ответа нет. Если вызывать Метод 1 раз в 30 секунд, то можно сделать много успешных вызовов.

Есть Метод 2. Если сделать минутную паузу между его вызовами, то на оба вызова прийдут ответы от сервиса.

Почему нет ответа на второй вызов Метода 1?
Re: Нет ответа от web-сервиса на запрос
От: bnk СССР http://unmanagedvisio.com/
Дата: 21.12.21 09:37
Оценка:
Здравствуйте, nekoriu, Вы писали:

N>Почему нет ответа на второй вызов Метода 1?


Может, сервер ресурсы экономит, потому и отвечает редко, чтобы всякие непонятные типы его по пустякам не беспокоили.
Хотя джентльмены вроде отвечают 409 в этом случае, а не молчат.
Re: Нет ответа от web-сервиса на запрос
От: vaa  
Дата: 21.12.21 09:43
Оценка:
Здравствуйте, nekoriu, Вы писали:

N>Добрый день.


N>Разрабатываю web-сервис, C#, ASP.NET, .NET Core 3.1. Использую Postman.


N>Вызываю метод login, получаю bearer token. Вызываю Метод 1, ответ от сервиса приходит. Жду одну минуту. Снова вызываю Метод 1, ответа нет.


код давай
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Нет ответа от web-сервиса на запрос
От: nekoriu Россия  
Дата: 21.12.21 11:24
Оценка:
vaa>код давай

getempsubdiv — Метод 1.

    [ApiController]
    [Route("api/v1/auth")]
    public class AuthController : Controller
    {
        [HttpPost("login")]
        public async Task<IActionResult> Login()
        {
            byte[] buff = new byte[kMaxAuthDataLen];
            int len = await Request.Body.ReadAsync(buff, 0, kMaxAuthDataLen);
            if (len < 10)
            {
                return BadRequest("Неверные данные аутентификации");
            }
            string workplaceCode = Encoding.ASCII.GetString(buff, 0, len);

            string ip = IPTools.GetClientIp(HttpContext, Request);

            var wi = await identityService.GetWorkplaceIdentityAsync(workplaceCode);
            if (wi == null)
            {
                return BadRequest("Рабочее место не зарегистрировано");
            }
            return Ok(await tokenService.CreateToken(wi));
        }
    }

    [ApiController]
    [Route("api/v1/apdecls")]
    [Authorize(Roles = "EDUser")]
    public class APDeclsController : ControllerBase
    {
        [HttpGet("getempsubdiv")]
        [Produces("application/json")]
        public async Task<IActionResult> GetEmpSubDiv()
        {
            string pccode = "";
            string ip = "";
            string orgname = "";
            string orgpto = "";
            try
            {
                pccode = HttpContext.User.FindFirst(ClaimTypes.WorkplaceCodeType)?.Value;
                ip = IPTools.GetClientIp(HttpContext, Request);
                orgname = HttpContext.User.FindFirst(ClaimTypes.OrganizationNameType)?.Value;
                orgpto = HttpContext.User.FindFirst(ClaimTypes.PTOIdType)?.Value;

                logger.LogInformation("{QueryId}; {Query}; {ComputerCode}; {Company}; IP-адрес: {IPAddress}. Begin.",
                    HttpContext.TraceIdentifier, "APDeclsGetEmpSubDiv", pccode, orgname, ip);

                await DBUserRequestRepository.WriteRequest(UserRequestTypeConst.csApdeclsGetEmpSubDiv, pccode, ip, orgname, orgpto, "");

                MethodResult mr = new MethodResult();
                var dbemp = await DBEmployeeRepository.FindEmpid(mr, HttpContext);
                if (mr.resCode == -1)
                {
                    WriteErrToLog("APDeclsGetEmpSubDiv", pccode, orgname, ip, "FindEmpid(). " + mr.resDescription);
                    var r = new MethodResult((int)ErrorCodes.ApDeclsGetEmpSubDiv, "Ошибка APDeclsGetEmpSubDiv. Ошибка при поиске сотрудника.", null);
                    return await Task.FromResult(new ObjectResult(r));
                }

                string PCCode = await BodyReader.ReadReqBody(Request);

                DBEmpSubDiv SubDiv = null;
                string ErrMsg = null;

                if (!DBEmployeeRepository.GetEmpSubDiv(PCCode, ref SubDiv, ref ErrMsg))
                {
                    WriteErrToLog("APDeclsGetEmpSubDiv", pccode, orgname, ip, "GetEmpSubDiv(). " + ErrMsg);
                    var r = new MethodResult((int)ErrorCodes.ApDeclsGetEmpSubDiv, "Ошибка APDeclsGetEmpSubDiv.", null);
                    return await Task.FromResult(new ObjectResult(r));
                }

                logger.LogInformation("{QueryId}; {Query}; {ComputerCode}; {Company}; IP-адрес: {IPAddress}. End",
                    HttpContext.TraceIdentifier, "APDeclsGetEmpSubDiv", pccode, orgname, ip);

                var res = new MethodResult(0, "", SubDiv);
                return await Task.FromResult(new ObjectResult(res));
            }
            catch (Exception e)
            {
                WriteErrToLog("APDeclsGetEmpSubDiv", pccode, orgname, ip, e.Message);
                var res = new MethodResult((int)ErrorCodes.ApDeclsGetEmpSubDiv, "Ошибка APDeclsGetEmpSubDiv.", null);
                return await Task.FromResult(new ObjectResult(res));
            }
        }
    }
Re[3]: Нет ответа от web-сервиса на запрос
От: vaa  
Дата: 22.12.21 14:59
Оценка: 1 (1)
Здравствуйте, nekoriu, Вы писали:

vaa>>код давай


N>getempsubdiv — Метод 1.


N>

N>        public async Task<IActionResult> GetEmpSubDiv()
N>        {
N>                    return await Task.FromResult(new ObjectResult(r));
N>    }

N>


это точно лишнее, сразу отдавайте результат.
 return Ok(r);
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Нет ответа от web-сервиса на запрос
От: vaa  
Дата: 22.12.21 15:02
Оценка:
Здравствуйте, nekoriu, Вы писали:

N>Добрый день.


N>Разрабатываю web-сервис, C#, ASP.NET, .NET Core 3.1. Использую Postman.

кстати, да. код постмэн что-нибудь сообщает?
или второй запрос вообще без ответа у вас? т.е. просто висит соединение или разрывается?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Нет ответа от web-сервиса на запрос
От: vaa  
Дата: 22.12.21 15:05
Оценка: 1 (1)
Здравствуйте, nekoriu, Вы писали:

N>Добрый день.


N>Разрабатываю web-сервис, C#, ASP.NET, .NET Core 3.1. Использую Postman.


N>Вызываю метод login, получаю bearer token. Вызываю Метод 1, ответ от сервиса приходит. Жду одну минуту. Снова вызываю Метод 1, ответа нет. Если вызывать Метод 1 раз в 30 секунд, то можно сделать много успешных вызовов.


N>Есть Метод 2. Если сделать минутную паузу между его вызовами, то на оба вызова прийдут ответы от сервиса.


N>Почему нет ответа на второй вызов Метода 1?


неплохое интро. вместо постмэна нормальная тулза
https://docs.microsoft.com/ru-ru/aspnet/core/tutorials/first-web-api?view=aspnetcore-6.0&amp;tabs=visual-studio
и да срочно переходите на .NET6
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Нет ответа от web-сервиса на запрос
От: nekoriu Россия  
Дата: 22.12.21 17:45
Оценка:
vaa>кстати, да. код постмэн что-нибудь сообщает?
vaa>или второй запрос вообще без ответа у вас? т.е. просто висит соединение или разрывается?
После второго вызова Метода 1 нет кода, проходит таймаут 10 с.
Re[2]: Нет ответа от web-сервиса на запрос
От: nekoriu Россия  
Дата: 22.12.21 18:05
Оценка:
vaa>или второй запрос вообще без ответа у вас? т.е. просто висит соединение или разрывается?

Путь к сервису лежит через Apache. Провел небольшой эксперимент. Сервис был выключен. Беру свой Метод 1 и вызываю. Ответа не приходит, таймаут в Postman. Убираю тело из запроса, вызываю Метод1, получаю ответ с кодом 503. В начальной версии запроса с Методом 1 меняю метод с GET на POST, отправляю запрос и снова получаю 503. Получается Apache отвечает на запросы определенных форматов.
Re[3]: Нет ответа от web-сервиса на запрос
От: vaa  
Дата: 23.12.21 02:22
Оценка:
Здравствуйте, nekoriu, Вы писали:

vaa>>или второй запрос вообще без ответа у вас? т.е. просто висит соединение или разрывается?


N>Путь к сервису лежит через Apache. Провел небольшой эксперимент. Сервис был выключен. Беру свой Метод 1 и вызываю. Ответа не приходит, таймаут в Postman. Убираю тело из запроса, вызываю Метод1, получаю ответ с кодом 503. В начальной версии запроса с Методом 1 меняю метод с GET на POST, отправляю запрос и снова получаю 503. Получается Apache отвечает на запросы определенных форматов.

у вас там в методе логирование. поставьте логирование в самое начало метода. если не приходит. значит по дороге потерялся.
если проходит, значит где-то в коде либо лок(может на базе) либо просто длительное выполнение.
10 сек это мало, установите бесконечное время ожидания ответа сервера. в апаче проверьте какое-нибудь хитрое кэширование может быть.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Придирка
От: Sharov Россия  
Дата: 04.01.22 15:23
Оценка:
Здравствуйте, nekoriu, Вы писали:


N> var dbemp = await DBEmployeeRepository.FindEmpid(mr, HttpContext);

Прощу прощения за оффтоп и придирку: зачем смешивать DAL (repo) и Http слой? Сильно лишняя связанность.
Кодом людям нужно помогать!
Re[4]: Придирка
От: MaxRos  
Дата: 04.01.22 15:36
Оценка: 5 (1)
Здравствуйте, Sharov, Вы писали:

S>Прощу прощения за оффтоп и придирку: зачем смешивать DAL (repo) и Http слой? Сильно лишняя связанность.


Всё засунуто в метод контроллера и методы репозитория (которые не нужны, если там EF) возвращают коды и булеаны. Тут одними лишь придирками вряд ли можно обойтись.
Re[5]: Придирка
От: Sharov Россия  
Дата: 04.01.22 18:37
Оценка:
Здравствуйте, MaxRos, Вы писали:

S>>Прощу прощения за оффтоп и придирку: зачем смешивать DAL (repo) и Http слой? Сильно лишняя связанность.

MR>Всё засунуто в метод контроллера и методы репозитория

Ну а где еще, если не по DDD? Т.е в контроллере и должна быть эта логика, связывающая сервисный\сетевой
уровень с уровнем данных.

MR>(которые не нужны, если там EF) возвращают коды и булеаны. Тут одними лишь придирками вряд ли можно обойтись.


Ой, этого я не приметил
Кодом людям нужно помогать!
Re[6]: Придирка
От: MaxRos  
Дата: 04.01.22 19:10
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Ну а где еще, если не по DDD? Т.е в контроллере и должна быть эта логика, связывающая сервисный\сетевой

S>уровень с уровнем данных.

А где тут сервисный уровень. В идеале в методе контроллера должен быть один вызов и возврат результата. Это же обвязка, отвечающая за http api. Плюс всякие сквозные штуки типа логирования и обработки ошибок захламляют код. А передача HttpContext внутрь репозитория это вообще за гранью.
Re[7]: Придирка
От: Sharov Россия  
Дата: 04.01.22 19:51
Оценка:
Здравствуйте, MaxRos, Вы писали:

S>>Ну а где еще, если не по DDD? Т.е в контроллере и должна быть эта логика, связывающая сервисный\сетевой

S>>уровень с уровнем данных.
MR>А где тут сервисный уровень. В идеале в методе контроллера должен быть один вызов и возврат результата.

Сервисным в данном случае я назвал сетевой уровень, т.е. уровень отвечающих за взаимодействие с http,
ну или обработка соотв. rest api. Ну т.е. взять что-то из сети и передать в dal -- самое то для
контроллера.
Кодом людям нужно помогать!
Re: Нет ответа от web-сервиса на запрос
От: Vladek Россия Github
Дата: 20.01.22 22:16
Оценка:
Здравствуйте, nekoriu, Вы писали:

N>Добрый день.


N>Разрабатываю web-сервис, C#, ASP.NET, .NET Core 3.1. Использую Postman.


N>Вызываю метод login, получаю bearer token. Вызываю Метод 1, ответ от сервиса приходит. Жду одну минуту. Снова вызываю Метод 1, ответа нет. Если вызывать Метод 1 раз в 30 секунд, то можно сделать много успешных вызовов.


N>Есть Метод 2. Если сделать минутную паузу между его вызовами, то на оба вызова прийдут ответы от сервиса.


N>Почему нет ответа на второй вызов Метода 1?


Вот хорошее руководство, как застраховаться от сюрпризов: https://docs.microsoft.com/ru-ru/dotnet/architecture/microservices/implement-resilient-applications/implement-http-call-retries-exponential-backoff-polly
Re: Нет ответа от web-сервиса на запрос
От: Слава  
Дата: 20.01.22 23:11
Оценка: -2
Здравствуйте, nekoriu, Вы писали:

N>Почему нет ответа на второй вызов Метода 1?


Потому что хозяин сервиса — мудак. Спросите его напрямую, желательно предварительно приложив ему клавиатурой по уху.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.