Как получить тело ответа, используя пользовательское промежуточное ПО?

проблема

Как получить тело ответа при вызове следующего контекста, используя пользовательское промежуточное ПО??

После достижения строки ожидания _next.Invoke(context) из отладки;

не возвращать данные json из результата действия getusermenu

[HttpGet(Contracts.ApiRoutes.Security.GetUserMenus)]
 public IActionResult GetUserMenu(string userId)
        {
            string strUserMenus = _SecurityService.GetUserMenus(userId);
            return Ok(strUserMenus);
        }

Мне нужно получить тело ответа из результата действия выше

header :
key : Authorization
value : ehhhheeedff .

мой код, я пробую:

public async Task InvokeAsync(HttpContext context, DataContext dataContext)
        {


            // than you logic to validate token              

            if (!validKey)
            {
                context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                await context.Response.WriteAsync("Invalid Token");
            }
            //if valid than next middleware Invoke
            else
            {
                await _next.Invoke(context);
// i need after that get result on last of thread meaning return data of usermenu

            }
        }
    }
 public static class TokenExtensions
    {
        public static IApplicationBuilder UseTokenAuth(this IApplicationBuilder builder)
        {
              return builder.UseMiddleware<TokenValidateMiddleware>();

        }
    }


          [no return data from access token][1]

https://i.stack.imgur.com/PHUMs.png

if(validtoken)
{
continue display getusermenuaction and show result

}

когда действительный токен, он возвращает данные, как показано ниже, в браузере googlechrom

[
  {
    "form_name": "FrmAddPrograms",
    "title": "Adding Screens",
    "url": "",
    "permissions": {
      "Insert": "True",
      "Edit": "True",
      "Read": "True",
      "Delete": "True",
      "Print": "True",
      "Excel": "False",
      "RecordList": "False"
    }
  },

но в моем браузере приложений возвращается недействительный токен


person ahmed abed elaziz    schedule 14.09.2019    source источник
comment
Какого ответа вы ожидаете? Вызов next для делегата запроса просто перенаправляет запрос следующему промежуточному программному обеспечению в очереди, или запрос достигает обработчика поддержки, предоставленного ASP.NET Core, при создании конвейера, который отправляет запрос обратно по конвейеру в другом направлении.   -  person Dennis1679    schedule 15.09.2019
comment
forword запрос к строке nextmiddleware и показать тело ответа   -  person ahmed abed elaziz    schedule 16.09.2019


Ответы (1)


Попробуйте получить тело ответа в пользовательском промежуточном программном обеспечении, используя следующий код:

public class CustomMiddleware
{
    private readonly RequestDelegate next;

    public CustomMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context)
    {

        if (!validKey)
        {
            context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
            await context.Response.WriteAsync("Invalid Token");
        }
        //if valid than next middleware Invoke
        else
        {
            Stream originalBody = context.Response.Body;

            try
            {
                using (var memStream = new MemoryStream())
                {
                    context.Response.Body = memStream;

                    await next(context);

                    memStream.Position = 0;
                    string responseBody = new StreamReader(memStream).ReadToEnd();//get response body here after next.Invoke()

                    memStream.Position = 0;
                    await memStream.CopyToAsync(originalBody);
                }

            }
            finally
            {
                context.Response.Body = originalBody;
            }
        }          
    }
}
person Ryan    schedule 16.09.2019
comment
спасибо за ответ, все еще возвращает неверный токен в браузере, хотя из отладки он достигает isvalid = true, а из отладки получает значение строки responseBody, как мне нужно, и на почтальоне показывает правильный результат, но в браузере показывает недопустимое сообщение о токене, это сообщение я пишу в коде в строке недопустимого токена, но почему это сообщение отображается, хотя код не попал в недопустимый токен - person ahmed abed elaziz; 16.09.2019
comment
@ahmed abed elaziz Вы имеете в виду, что токен действителен, а код await context.Response.WriteAsync("Invalid Token"); никогда не срабатывает при добавлении точек останова, но браузер выводит сообщение об ошибке? Токен должен начинаться с Bearer xxxxx. Вы добавляете app.UseTokenAuth непосредственно перед app.UseMvc? На основе ваш код без токена. Он работает хорошо, я думаю, что это связано с проверкой вашего токена. - person Ryan; 16.09.2019
comment
при настройке класса startup.cs я делаю app.UseMiddleware‹TokenValidateMiddleware›(); app.UseHttpsRedirection(); приложение.UseAuthentication(); приложение.UseCors(CorsData); приложение.UseMvc(); но, согласно Bearer, я не начинаю, потому что не знаю, можете ли вы сказать мне, как - person ahmed abed elaziz; 16.09.2019
comment
я уже использую app.class промежуточного программного обеспечения, у меня есть app.tokenauth перед app.usemvc, но носитель не может ничего знать об этом, можете ли вы сказать мне, как начать с носитель? - person ahmed abed elaziz; 16.09.2019
comment
@ahmed abed elaziz О, забудьте, что если вы хорошо работаете, используя почтальон с тем же токеном ... Но аутентификация JWT сама аутентифицирует токен и возвращает результат, нет необходимости писать собственное промежуточное программное обеспечение. Опять же, это не связано с заголовок вашего вопроса. Вы можете задать новую тему и опубликовать необходимый код. - person Ryan; 16.09.2019
comment
можете ли вы прояснить больше, ваш ответ означает, что вы начинаете с носителя или нет, это то, что мне нужно только - person ahmed abed elaziz; 16.09.2019
comment
@ahmed abed elaziz Нет, если вы не используете токен Bearer, вам это не нужно. Bearer-token" title="в чем разница между jwts и токеном-носителем"> stackoverflow.com/questions/40375508/ - person Ryan; 17.09.2019
comment
спасибо за ответ, результат вашего кода выше показывает успех на почтальоне, но не показывает в моем браузере, почему. мой используемый браузер - браузер google chrome - person ahmed abed elaziz; 19.09.2019
comment
@ahmed abed elaziz, как вы отправляете запрос в своем браузере? Имеет ли он действительный токен и входит ли он в if (!validKey)? - person Ryan; 19.09.2019