ASP.NET Core 6 случайным образом возвращает 200 с пустым ответомC#

Место общения программистов C#
Ответить
Anonymous
 ASP.NET Core 6 случайным образом возвращает 200 с пустым ответом

Сообщение Anonymous »

У меня есть веб-приложение, развернутое в Azure. Во время тестирования я обнаружил, что одна из моих конечных точек не работает... иногда. Точнее, эта конечная точка POST всегда работает в моей среде разработки и случайным образом работает в Prod.
При сбое конечная точка моего контроллера не затрагивается (обнаруживается путем добавления журналов ), и возвращается «успешный» код 200, но содержимое ответа не отправляется. Тело моего POST крошечное, всего около 50 байт.
Я не уверен, является ли это подсказкой или нет, но, похоже, оно работает сразу после обновления браузера. , то, когда мой токен аутентификации обновляется, он терпит неудачу. Хотя это довольно анекдотично.
Погуглив, я обнаружил, что некоторым людям это помогает:

Код: Выделить всё

var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(options =>
{
options.Limits.MinRequestBodyDataRate = null;
options.Limits.MinResponseDataRate = null;
});
Однако здесь не повезло. Есть идеи, что еще могло вызвать это? ИЛИ, есть идеи, как мне лучше .NET сказать мне, что не так? В моих журналах ничего нет.
Спасибо!
РЕДАКТИРОВАТЬ:
У меня есть два промежуточных программного обеспечения. :

Код: Выделить всё

public class ExceptionHandlingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
private readonly JsonSerializerOptions jsonPolicy = new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };

public ExceptionHandlingMiddleware(RequestDelegate next, ILogger logger)
{
_next = next;
_logger = logger;
}

public async Task InvokeAsync(HttpContext httpContext)
{
try
{
await _next(httpContext);
}
catch (Exception ex)
{
await HandleExceptionAsync(httpContext, ex);
}
}

private async Task HandleExceptionAsync(HttpContext context, Exception exception)
{
context.Response.ContentType = "application/json";
var response = context.Response;

string msg;
switch (exception)
{
case ApplicationException ex:
if (ex.Message.Contains("Invalid Token"))
{
response.StatusCode = (int)HttpStatusCode.Forbidden;
msg = ex.Message;
break;
}
response.StatusCode = (int)HttpStatusCode.BadRequest;
msg = ex.Message;
break;
default:
response.StatusCode = (int)HttpStatusCode.InternalServerError;
msg = exception.Message;
break;
}
var errorResponse = new
{
Failed = true,
ErrorMessage = msg
};

_logger.LogError(exception, exception.Message);
var result = JsonSerializer.Serialize(errorResponse, jsonPolicy);
await context.Response.WriteAsync(result);
}
}
и:

Код: Выделить всё

public class UserStatusMiddleware
{
private readonly RequestDelegate _next;
private readonly DbContextFactory DbContextFactory;
private readonly ILogger _logger;
private readonly JsonSerializerOptions jsonPolicy = new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };

public UserStatusMiddleware(RequestDelegate next, DbContextFactory dbrderMonkeyContextFactory, ILogger logger)
{
_next = next;
_logger = logger;
DbContextFactory = dbContextFactory;
}

public async Task InvokeAsync(HttpContext httpContext)
{
using (DBContext dbContext = DbContextFactory.CreateDbContext())
{
var user = httpContext.User.FindFirst(ClaimTypes.NameIdentifier);
if (user == null)
{
throw new ArgumentException();
}
AspNetUser dbUser = dbContext.AspNetUsers.FirstOrDefault(x => x.Id == user.Value);
if (dbUser.IsDisabled || !dbUser.IsApproved)
{
httpContext.Response.ContentType = "application/json";
var response = httpContext.Response;

string msg;
var errorResponse = new
{
Failed = true,
IsDisabled = dbUser.IsDisabled,
IsApproved = dbUser.IsApproved,
ErrorMessage = "User is either disabled or not approved"
};
response.StatusCode = (int)HttpStatusCode.Unauthorized;

var result = JsonSerializer.Serialize(errorResponse, jsonPolicy);
await httpContext.Response.WriteAsync(result);
}
else
{
_next(httpContext);
}
}
}
}

public static class UserStatusMiddlewareExtensions
{
public static IApplicationBuilder UseUserStatusCheck(
this IApplicationBuilder builder)
{
return builder.UseMiddleware();
}
}
РЕДАКТИРОВАНИЕ № 2: Похоже, что если я удалю второе промежуточное программное обеспечение, проблема исчезнет. Но почему? Есть ли какие-то ограничения по времени для промежуточного программного обеспечения?

Подробнее здесь: https://stackoverflow.com/questions/782 ... y-response
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»