Как выполнить проверку работоспособности URL-адреса POST в ASP.NET/blazor

Я пытаюсь реализовать проверки работоспособности в своем приложении blazor. Для этого я использовал среди прочих пакет Microsoft.AspNetCore.Diagnostics.HealthChecks. Ниже вы можете увидеть проверки работоспособности sql и URL.

startup.cs

//using AjuaBlazorServerApp.Data;
using HealthChecks.UI.Client;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace AjuaBlazorServerApp
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddHostedService<PeriodicExecutor>();
            services.AddHealthChecks().AddUrlGroup(new Uri("https://api.example.com/post"),
                name: "Example Endpoint",
                failureStatus: HealthStatus.Degraded)
            .AddSqlServer(Configuration["sqlString"],
                healthQuery: "select 1",
                failureStatus: HealthStatus.Degraded,
                name: "SQL Server");
            services.AddHealthChecksUI(opt =>
            {
                opt.SetEvaluationTimeInSeconds(5); //time in seconds between check    
                opt.MaximumHistoryEntriesPerEndpoint(60); //maximum history of checks    
                opt.SetApiMaxActiveRequests(1); //api requests concurrency    
                opt.AddHealthCheckEndpoint("Ajua API", "/api/health"); //map health check api    
            }).AddInMemoryStorage();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
            }

            app.UseStaticFiles();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
                endpoints.MapHealthChecks("/api/health", new HealthCheckOptions()
                {
                    Predicate = _ => true,
                    ResponseWriter = UIResponseWriter.
                    WriteHealthCheckUIResponse
                });
                endpoints.MapHealthChecksUI();
            });
        }
    }
}

SQL работает отлично. Однако проверка работоспособности URL возвращает следующую ошибку:

Discover endpoint #0 is not responding with code in 200...299 range, the current status is MethodNotAllowed.

Я хотел бы знать, есть ли способ, возможно, установить тип метода и, если необходимо, отправить некоторые детали теста в конечную точку, чтобы мы действительно могли получить действительный ответ.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

AddUrlGroup имеет перегрузку, который позволяет указать метод через параметр httpMethod. Попробуйте использовать:

.AddUrlGroup(new Uri("https://api.example.com/post"),
            httpMethod: HttpMethod.Post,
            name: "Example Endpoint",
            failureStatus: HealthStatus.Degraded)

Еще одна перегрузка позволяет явно настроить HttpClient и HttpMessageHandler, чтобы добавить определенные заголовки по умолчанию, например, включить сжатие или перенаправление.

.AddUrlGroup(new Uri("https://api.example.com/post"),
            httpMethod: HttpMethod.Post,
            name: "Example Endpoint",
            configureClient: client => {
                client.DefaultRequest.Headers.IfModifiedSince=
                                DateTimeOffset.Now.AddMinutes(-10);
            },
            failureStatus: HealthStatus.Degraded)

Еще одна перегрузка позволяет явно настроить класс UriHealthCheckOptions, сгенерированный другими AddUrlGroup перегрузками:

.AddUrlGroup(uriOptions=>{
    uriOptions
        .UsePost()
        .AddUri(someUrl,setup=>{
            setup.AddCustomHeader("...","...");
    });
});

Невозможно указать заголовки содержимого, поскольку код проверки работоспособности не отправляет тело.

Есть ли способ установить тип контента? например, application/json Кстати, ваш ответ сработал, и теперь моя проблема связана с типом контента, поэтому я просто приму ваше решение.

Brokoth 16.03.2022 15:02

Я принял ответ выше, потому что он технически ответил на мой вопрос. Тем не менее, это реализация, которую я использовал. По сути, вам придется создать свою собственную проверку работоспособности.

  1. Добавьте новую папку в основной каталог ваших проектов и назовите ее соответствующим образом.

2. Создайте новый класс в этой папке и добавьте код, аналогичный приведенному ниже.

EndpointHealth.cs

using Microsoft.Extensions.Diagnostics.HealthChecks;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using Microsoft.Extensions.Configuration;

namespace BlazorServerApp.HealthChecks
{
    public class EndpointHealth : IHealthCheck
    {
        public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken =
         default)
        {
            
                //create a json string of parameters and send it to the endpoint
                var data = new
                {
                    test = "Example",
                };
                string jsonString = JsonSerializer.Serialize(data);
                var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.example.com/post");
                httpWebRequest.ContentType = Configuration["application/json"];
                httpWebRequest.Method = Configuration["POST"];
                using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                {
                    streamWriter.Write(jsonString);
                }
                //Get the endpoint result and use it to return the appropriate health check result
                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                if (((int)httpResponse.StatusCode) >= 200 && ((int)httpResponse.StatusCode) < 300)
                return Task.FromResult(HealthCheckResult.Healthy());
                else
                return Task.FromResult(HealthCheckResult.Unhealthy());
        }
    }
}

Затем добавьте следующий код в начало файла startup.cs using BlazorServerApp.HealthChecks;

и, наконец, приведенный ниже код:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddHealthChecks()
            .AddCheck<EndpointHealth>("Endpoint",null);

        }

Другие вопросы по теме