Я пытаюсь реализовать проверки работоспособности в своем приложении 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.
Я хотел бы знать, есть ли способ, возможно, установить тип метода и, если необходимо, отправить некоторые детали теста в конечную точку, чтобы мы действительно могли получить действительный ответ.
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("...","...");
});
});
Невозможно указать заголовки содержимого, поскольку код проверки работоспособности не отправляет тело.
Я принял ответ выше, потому что он технически ответил на мой вопрос. Тем не менее, это реализация, которую я использовал. По сути, вам придется создать свою собственную проверку работоспособности.
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);
}
Есть ли способ установить тип контента? например, application/json Кстати, ваш ответ сработал, и теперь моя проблема связана с типом контента, поэтому я просто приму ваше решение.