#c# #asp.net-core
Вопрос:
У меня есть этот метод POST, который получает уведомления от API TinkoffPayments, и теперь я возвращаюсь Tasklt;HttpResponseMessagegt;
, но Tinkoff не получает статус ОК 200 ответа. Вот как они советуют сделать этот ответ в своей документации
@POST @Path("/ok") public Response NotifyResponse() { return Response.status(200).entity("OK").build(); }
Но я не похож на профессионального программиста, я не знаю, как провести правильную аналогию в asp.net. Я попытался вернуть значение моего метода IActionResult
и вернуть Ok(«ОК»). Я пытался определить значения HttpContext.Response
, но ничего не работает. Тинькофф всегда показывает эту ошибку в тестах: "Notification Error: we don't receive answer "OK" for next notification requests: CONFIRMED. Check and fix notification management: CONFIRMED. Then try test case again"
в чем может быть проблема?
[HttpPost] public async Tasklt;HttpResponseMessagegt; New() { string t1 = ""; try { StreamReader sr = new StreamReader(Request.Body); t1 = await sr.ReadToEndAsync(); } catch (Exception e){} BotContext _dbContext = new BotContext(Environment.GetEnvironmentVariable("ConnectionString")); Notification notification = new Notification(); try { TinkoffNotification tn = JsonConvert.DeserializeObjectlt;TinkoffNotificationgt;(t1); notification.Amount = tn.Amount; notification.Status = tn.Status; notification.OrderId = tn.OrderId; notification.PaymentId = tn.PaymentId; notification.Pan = tn.Pan; notification.RebillId = tn.RebillId; notification.Amount = tn.Amount; notification.CardId = tn.CardId; } catch{} try { _dbContext.Notifications.Add(not); _dbContext.SaveChanges(); _dbContext.Database.Connection.Close(); } catch { } HttpResponseMessage ht = new HttpResponseMessage(); ht.StatusCode = HttpStatusCode.OK; ht.Content = JsonContent.Create("OK"); ht.ReasonPhrase = "OK"; return ht; }
Комментарии:
1. Я не уверен, на каком языке написан этот пример, но, похоже, вам просто нужно
return Ok("OK");
?2. Как насчет того, чтобы использовать что-то вроде Fiddler4 и точно видеть, какой контент работает, а какой нет.
3. Это говорит о
notification requests: CONFIRMED
том , в то время как ваше действие названоNew
. Может быть, в этом что-то есть?4. В настройках учетной записи Тинькофф есть поле «URI уведомлений», и только одно. Итак, я полагаю, что мне нужен только один метод для управления всеми уведомлениями. И в уведомлениях есть много разных статусов, таких как «ПОДТВЕРЖДЕНО», «ОТКЛОНЕНО» и т. Д. Так что я не думаю, что в этом проблема.
Ответ №1:
Вы не должны возвращать an HttpResponseMessage
, так как это конструкция более низкого уровня. Измените тип возвращаемого значения на Tasklt;IActionResultgt;
и верните OK
объект.
public async Tasklt;IActionResultgt; New() { ... return Ok(); }
Комментарии:
1. Ты уверен, что это одно и то же? А как насчет
OK
текста?2. Вы можете поставить
return Ok("OK")
, если хотите, но если это действительно не требуется, обычно достаточно 200 ок.3. Ну, это зависит от того, чего ожидает их API. Я просто отхожу от их примера кода.
4. И ошибка, которую ОП получает от них, похоже, предполагает именно это.
5. Если Ok(«ОК») не работает, я бы предположил, что проблема не в вашем конце. Как я предлагал ранее, используйте что-то вроде fiddler, чтобы точно изучить, что отправляется обратно из вашего приложения.
Ответ №2:
Совет Нила использовать скрипача действительно помог.Тинькофф действительно хотел ответить.Тело должно быть «В порядке», а не просто стандартно реагировать на 200 ок. И когда я написал «ОК» ранее Телу, они не приняли его, потому что я не установил длину содержимого и мой фактический запрос.Тело было чем-то вроде этого:
2 OK 0
Использование скрипача помогло понять это. Итак, этот код работает
[HttpPost] public async Tasklt;IActionResultgt; New() ... StreamWriter sw = new StreamWriter(Response.Body); Response.ContentType = "application/json"; Response.ContentLength = 2; Response.StatusCode = 200; await sw.WriteAsync("OK"); await sw.FlushAsync(); return Ok(); }