Несоответствие длины содержимого ответа: записано слишком мало байтов - PullRequest
0 голосов
/ 21 апреля 2020

My ASP. NET В основном приложении используется внешняя аутентификация входа в систему "из коробки". Что я хочу реализовать - при вызове на Facebook я хочу обернуть URL перенаправления и вернуть его как json для использования в jquery интерфейсе. Но после завершения запроса я вижу ошибку 500 в браузере и следующую ошибку в консоли приложения:

ошибка: Microsoft.AspNetCore.Server.Kestrel [13] идентификатор соединения "0HLV651D6KVJ C", идентификатор запроса " 0HLV651D6KVJ C: 00000005 ": приложение выдало необработанное исключение. System.InvalidOperationException: Несоответствие длины содержимого ответа: слишком мало записано байтов (0 из 470).

Мое внешнее действие при входе в систему, ничего особенного для проверки

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public IActionResult ExternalLogin(string provider, string returnUrl = null)
{
    // Request a redirect to the external login provider.
    var redirectUrl = Url.Action(nameof(ExternalLoginCallback), "Account", new { returnUrl });
    var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
    return Challenge(properties, provider);
}

аутентификация Facebook конфигурация:

services.AddAuthentication().AddFacebook(facebookOptions =>
{
    facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"];
    facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"];

    facebookOptions.Events.OnRedirectToAuthorizationEndpoint =
        async (x) =>
        {

            UTF8Encoding encoding = new UTF8Encoding();
            var content = JsonConvert.SerializeObject(new { redirect_url = x.RedirectUri });
            byte[] bytes = encoding.GetBytes(content);

            x.Response.StatusCode = 200;
            x.Response.ContentLength = bytes.Length;
            x.Response.ContentType = "text/plain";
            x.Response.Body = new MemoryStream();

            await x.Response.WriteAsync(content);
            // at this point I see that x.Response.Body.Length == 470, but message states there are 0 of 470 written
        };
});

Есть ли способ заставить его работать?

1 Ответ

0 голосов
/ 05 мая 2020

Изменен код для записи в исходный поток ответов, и теперь он работает.

facebookOptions.Events.OnRedirectToAuthorizationEndpoint =
    async (x) =>
    {
        var content = JsonConvert.SerializeObject(new { redirect_url = x.RedirectUri });

        x.Response.StatusCode = 200;
        x.Response.ContentType = "text/plain";

        await x.Response.WriteAsync(content);
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...