Nacho
Nacho

Reputation: 41

AddWebhookNotification to call Method in Controller

I have this configured in my StartUp.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .ConfigureEmail(Configuration)
            .AddHealthChecksUI(setupSettings: setup =>
            {
                setup
                    .AddWebhookNotification("WebHookTest", "/WebhookNotificationError",
                        "{ message: \"Webhook report for [[LIVENESS]]: [[FAILURE]] - Description: [[DESCRIPTIONS]]\"}",
                        "{ message: \"[[LIVENESS]] is back to life\"}",
                        customMessageFunc: report =>
                        {
                            var failing = report.Entries.Where(e => e.Value.Status == UIHealthStatus.Unhealthy);
                            return $"{failing.Count()} healthchecks are failing";
                        },
                        customDescriptionFunc: report =>
                        {
                            var failing = report.Entries.Where(e => e.Value.Status == UIHealthStatus.Unhealthy);
                            return $"HealthChecks with names {string.Join("/", failing.Select(f => f.Key))} are failing";
                        });
            })
            .AddControllers();
    }

    public void Configure(IApplicationBuilder app)
    {
        var pathBase = Configuration["PATH_BASE"];
        if (!string.IsNullOrEmpty(pathBase))
        {
            app.UsePathBase(pathBase);
        }
    
        app.ConfigureExceptionHandler();
        app
            .UseRouting()
            .UseEndpoints(endpoints =>
            {
                endpoints.MapHealthChecksUI(options =>
                {
                    options.ResourcesPath = string.IsNullOrEmpty(pathBase) ? "/ui/resources" : $"{pathBase}/ui/resources";
                    options.UIPath = "/hc-ui";
                    options.ApiPath = "/api-ui";
                });
                endpoints.MapDefaultControllerRoute();
            });
    }

And in the Controller:

    [HttpPost]
    [Consumes(MediaTypeNames.Application.Json)]
    public async Task<IActionResult> WebhookNotificationError([FromBody] string id)
    {
        MimeMessage mimeMessage = new MimeMessage { Priority = MessagePriority.Urgent };
        mimeMessage.To.Add(new MailboxAddress(_configuration.GetValue<string>("ConfiguracionCorreoBase:ToEmail")));
        mimeMessage.Subject = "WebHook Error";
        BodyBuilder builder = new BodyBuilder { HtmlBody = id };
        mimeMessage.Body = builder.ToMessageBody();
        await _appEmailService.SendAsync(mimeMessage);
        return Ok();
    }

The watchdog application is configured in the appSettings.json to listen to different APIs. So far everything works fine, but, if I force an error, I'd like to receive a notification email. The idea is that, when an error occurs in any of the Healths, you send an email.

Environment:

Upvotes: 0

Views: 1545

Answers (3)

Avinash
Avinash

Reputation: 801

I think you should try this. It works for me.

[HttpPost]
[Consumes(MediaTypeNames.Application.Json)]
public async Task<IActionResult> WebhookNotificationError()
{
    using (var reader = new StreamReader(
        Request.Body,
        encoding: Encoding.UTF8,
        detectEncodingFromByteOrderMarks: false))
    {
        var payload = await reader.ReadToEndAsync();

        //do whatever with your payloade here..
        //I am just returning back for a example.
        return Ok(payload);
    }
}

Upvotes: 0

procma
procma

Reputation: 1440

Try using Api/WebhookNotificationError inst. of /WebhookNotificationError if your controller is ApiController. The controller name seems to be missing

Upvotes: 0

V.Malyk
V.Malyk

Reputation: 11

It's look like you problem in routes. Did you verify that method with Postman? Also check if your webHook request body is a text, try to change your template payload:

{ "message": "Webhook report for [[LIVENESS]]: [[FAILURE]] - Description: [[DESCRIPTIONS]]"}",

and in the controller change string to object. And check what you receive in DEBUG.

Upvotes: 1

Related Questions