Неверный ответ от webhook TelegramBot
Проект asp.net.core 5.0 web-api. Внутри проекта создал контроллер с методом, которого должен дергать TelegramBot, а он в ответ оправлять ответ в чат:
[ApiController]
[Route("api/TelegramListener")]
public class TelegramListenerController : ControllerBase
{
private readonly ILogger<TelegramListenerController> _logger;
private readonly HttpClient httpClient;
private TelegramBotClient telegramBotClient;
private string currentPath;
private string _token { get; set; } = "19чч785959:ччччч";
public TelegramListenerController(ILogger<TelegramListenerController> logger)
{
_logger = logger;
telegramBotClient = new TelegramBotClient(_token);
httpClient = new HttpClient();
currentPath = Environment.CurrentDirectory;
}
[HttpPost]
public async Task<IActionResult> Post([FromBody] Update update)
{
List<string> listlogs = new List<string>();
listlogs.Add(update.ToString());
ReadWriteFileTxt.WriteFile(listlogs, currentPath, "logs "+ DateTime.Now.ToString().Replace('.', '_').Replace(' ', '_').Replace(':', '_'), "txt");
var message = update.Message;
if (message != null)
{
MessageData requestMessage = new MessageData { TextMessage = message.Text, PhoneNumber = message.Contact.PhoneNumber, UserName = message.Contact.FirstName };
await telegramBotClient.SendTextMessageAsync(message.From.Id, message.Contact.PhoneNumber, replyToMessageId: message.MessageId);
}
return Ok();
}
}
Зарегистрировал:
https://api.telegram.org/bot195285959:ххххххххlk/setwebhook?url=https://messager.хххх.рф/api/TelegramListener
Регистрация прошла.
Потом запросил информацию:
https://api.telegram.org/bot1956785959:AAHbzkyMAzp6b6houFkvZyAMoPVgK5hxmlk/getWebhookInfo
Получил 500 ошибку:
{"ok":true,"result":{"url":"https://messager.\u043e\u0440\u0435\u043d\u0431\u0443\u0440\u0433\u0432\u0441\u0435.\u0440\u0444/api/TelegramListener","has_custom_certificate":false,"pending_update_count":2,"last_error_date":1632146544,"last_error_message":"Wrong response from the webhook: 500 Internal Server Error","max_connections":40,"ip_address":"чч.ччччч.100"}}
Попробовал протестировать в режиме отладки с помощью ngrok. Точка остановы в контроллере не срабатывает, хотя вроде как слушает:

{"ok":true,"result":{"url":"https://c0bb-195-226-209-21.ngrok.io/api/TelegramListener","has_custom_certificate":false,"pending_update_count":6,"last_error_date":1632203484,"last_error_message":"Wrong response from the webhook: 503 Service Unavailable","max_connections":40,"ip_address":"3.14.182.203"}}
Запрос через Postman проходит только с заголовком UserSecretId, без него пишет что Cloud Agent Error: Can not send requests to localhost. Select a different agent..
Startup.cs:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "TLmessanger", Version = "v1" });
});
services.AddControllers()
.AddNewtonsoftJson();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "TLmessanger v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
//Add
app.UseCors();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Нашел ещё, что Telegram API only supports the ports 443, 80, 88 or 8443., в режиме отладки у меня не получается запустить на этих портах получается на 44315, может причина в этом:
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:35145",
"sslPort": 44315
}
При отправке в режиме отладки через swagger VS, запрос попадает в нужный
метод контроллера и отрабатывает:

Не пойму где ошибка? Подскажите.
Ответы (2 шт):
Проблема заключалась в том, что запросы не доходили до метода контроллера из-за требования указания в заголовках запросы заголовка UserSecretId, который телеграмбот не отправляет. Это связано с тем, что по умолчанию при создании проекта в классе Startup.cs прописывается внедрение зависимости app.UseAuthorization(), а в файле настроек запуска приложения launchsettings.json прописывается sslPort. Необходимо удалить зависимость
app.UseAuthorization(), а порт ssl установить - "sslPort": 0, тогда требования наличия заголовка UserSecretId не будет.
Когда у меня была подобного рода проблема, её суть заключалась в UseHttpsRedirection(). Когда вы получаете запрос через ngrok https://c0bb-195-226-209-21.ngrok.io/api/TelegramListener на ваш сервер, где указан протокол HTTP — http://localhost:44352, middleware UseHttpsRedirection редиректит запрос на HTTPS, который запущен на другом порту.
Попробуйте убрать вызов UseHttpsRedirection() в Startup, если вы его используете, чтобы проект мог корректно работать по HTTP.