'HttpRequest' 不包含 'EnableRewind' 的定义
'HttpRequest' does not contain a definition for 'EnableRewind'
我正在尝试在我创建的自定义授权处理程序中使用 EnableRewind 方法,但出现错误“'HttpRequest' 不包含 'EnableRewind' 的定义”我需要访问正文,但如果我按照代码所示进行操作,我会在控制器中收到错误消息“输入不包含任何 JSON 标记。预期输入以有效的 JSON 标记开头,.. .." 这是我的处理程序,我从启动文件中注入了 IHttpContextAccessor
public class ForPrivateProfileBodyMustOwnRecordOrShouldBeInAdminRoleHandler : AuthorizationHandler<ForPrivateProfileBodyMustOwnRecordOrShouldBeInAdminRole>
{
private readonly IHttpContextAccessor _httpContextAccessor;
public ForPrivateProfileBodyMustOwnRecordOrShouldBeInAdminRoleHandler(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
ForPrivateProfileBodyMustOwnRecordOrShouldBeInAdminRole requirement)
{
var reader = new System.IO.StreamReader(_httpContextAccessor.HttpContext.Request.Body);
var body = reader.ReadToEndAsync().Result;
//this line is producing error
var req = _httpContextAccessor.HttpContext.Request.EnableRewind();
var request = Newtonsoft.Json.JsonConvert.DeserializeObject<PrivateProfileModel>(body);
var ownerId = context.User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;
if (request.UserId.ToString() != ownerId && !context.User.IsInRole("Admin"))
{
context.Fail();
return Task.CompletedTask;
}
//all checks pass
//_httpContextAccessor.HttpContext.Request.Body.Seek(0, System.IO.SeekOrigin.Begin);
context.Succeed(requirement);
return Task.CompletedTask;
}
}
我终于解决了这个问题,实际上这个问题是 ASP .NET Core 使用的特定流 –Microsoft.AspNetCore.Server.Kestrel.Internal.Http.FrameRequestStream – 不可倒带(发现这篇文章很有帮助 http://www.palador.com/2017/05/24/logging-the-body-of-http-request-and-response-in-asp-net-core/)所以通过创建新流并将其放在正文中来解决它:
var body = reader.ReadToEndAsync().Result;
var request = Newtonsoft.Json.JsonConvert.DeserializeObject<PrivateProfileModel>(body);
using (var injectedRequestStream = new MemoryStream())
{
var bytesToWrite = System.Text.Encoding.UTF8.GetBytes(body);
injectedRequestStream.Write(bytesToWrite, 0, bytesToWrite.Length);
injectedRequestStream.Seek(0, SeekOrigin.Begin);
_httpContextAccessor.HttpContext.Request.Body = injectedRequestStream;
}
我正在尝试在我创建的自定义授权处理程序中使用 EnableRewind 方法,但出现错误“'HttpRequest' 不包含 'EnableRewind' 的定义”我需要访问正文,但如果我按照代码所示进行操作,我会在控制器中收到错误消息“输入不包含任何 JSON 标记。预期输入以有效的 JSON 标记开头,.. .." 这是我的处理程序,我从启动文件中注入了 IHttpContextAccessor
public class ForPrivateProfileBodyMustOwnRecordOrShouldBeInAdminRoleHandler : AuthorizationHandler<ForPrivateProfileBodyMustOwnRecordOrShouldBeInAdminRole>
{
private readonly IHttpContextAccessor _httpContextAccessor;
public ForPrivateProfileBodyMustOwnRecordOrShouldBeInAdminRoleHandler(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
ForPrivateProfileBodyMustOwnRecordOrShouldBeInAdminRole requirement)
{
var reader = new System.IO.StreamReader(_httpContextAccessor.HttpContext.Request.Body);
var body = reader.ReadToEndAsync().Result;
//this line is producing error
var req = _httpContextAccessor.HttpContext.Request.EnableRewind();
var request = Newtonsoft.Json.JsonConvert.DeserializeObject<PrivateProfileModel>(body);
var ownerId = context.User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;
if (request.UserId.ToString() != ownerId && !context.User.IsInRole("Admin"))
{
context.Fail();
return Task.CompletedTask;
}
//all checks pass
//_httpContextAccessor.HttpContext.Request.Body.Seek(0, System.IO.SeekOrigin.Begin);
context.Succeed(requirement);
return Task.CompletedTask;
}
}
我终于解决了这个问题,实际上这个问题是 ASP .NET Core 使用的特定流 –Microsoft.AspNetCore.Server.Kestrel.Internal.Http.FrameRequestStream – 不可倒带(发现这篇文章很有帮助 http://www.palador.com/2017/05/24/logging-the-body-of-http-request-and-response-in-asp-net-core/)所以通过创建新流并将其放在正文中来解决它:
var body = reader.ReadToEndAsync().Result;
var request = Newtonsoft.Json.JsonConvert.DeserializeObject<PrivateProfileModel>(body);
using (var injectedRequestStream = new MemoryStream())
{
var bytesToWrite = System.Text.Encoding.UTF8.GetBytes(body);
injectedRequestStream.Write(bytesToWrite, 0, bytesToWrite.Length);
injectedRequestStream.Seek(0, SeekOrigin.Begin);
_httpContextAccessor.HttpContext.Request.Body = injectedRequestStream;
}