asp.net-core – 访问Raw Request Body
|
我正在尝试在ASP.net 5中访问请求的原始输入正文/流.过去,我能够将输入流的位置重置为0并将其读入内存流但是当我尝试这样做时从上下文输入流为null或抛出错误(System.NotSupportedException =>“不支持指定的方法.”). 在下面的第一个例子中,如果我将控制器方法的参数对象类型声明为动态,我可以在控制器中访问原始请求.由于各种原因,这不是一个解决方案,我需要在身份验证过滤器中访问原始请求正文. 此示例有效,但不是一个合理的解决方案: [HttpPost("requestme")]
public string GetRequestBody([FromBody] dynamic body)
{
return body.ToString();
}
引发错误: [HttpPost("requestme")]
public string GetRequestBody()
{
var m = new MemoryStream();
Request.Body.CopyTo(m);
var contentLength = m.Length;
var b = System.Text.Encoding.UTF8.GetString(m.ToArray());
return b;
}
引发错误: [HttpPost("requestme")]
public string GetRequestBody()
{
Request.Body.Position = 0;
var input = new StreamReader(Request.Body).ReadToEnd();
return input;
}
引发错误: [HttpPost("requestme")]
public string GetRequestBody()
{
Request.Body.Position = 0;
var input = new MemoryStream();
Request.Body.CopyTo(input);
var inputString = System.Text.Encoding.UTF8.GetString(input.ToArray());
return inputString;
}
我需要访问我正在构建的API的每个请求的原始请求主体. 任何帮助或方向将不胜感激! 编辑: 这是我想要阅读请求正文的代码. using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Http;
namespace API.Filters
{
public class CustomAuthorizationAttribute : Attribute,IAuthorizationFilter
{
public CustomAuthorizationAttribute()
{ }
public void OnAuthorization(AuthorizationContext context)
{
if (context == null)
throw new ArgumentNullException("OnAuthorization AuthorizationContext context can not be null.");
else
{
if (this.AuthorizeCore(context.HttpContext) == false)
{
// Do Other Stuff To Check Auth
}
else
{
context.Result = new HttpUnauthorizedResult();
}
}
}
protected virtual bool AuthorizeCore(HttpContext httpContext)
{
var result = false;
using (System.IO.MemoryStream m = new System.IO.MemoryStream())
{
try
{
if (httpContext.Request.Body.CanSeek == true)
httpContext.Request.Body.Position = 0;
httpContext.Request.Body.CopyTo(m);
var bodyString = System.Text.Encoding.UTF8.GetString(m.ToArray());
return CheckBody(bodyString); // Initial Auth Check returns true/false <-- Not Shown In Code Here on Stack Overflow
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
}
}
return false;
}
}
}
当调用标记有CustomAuthorization属性的控制器方法时,将访问此代码. [Filters.CustomAuthorizationAuthorization]
[HttpPost]
public ActionResult Post([FromBody]UserModel Profile)
{
// Process Profile
}
解决方法Request.Body的实现取决于控制器操作.如果操作包含参数,则由Microsoft.AspNet.WebUtilities.FileBufferingReadStream实现,它支持搜索(Request.Body.CanSeek == true).此类型还支持设置Request.Body.Position. 但是,如果您的操作不包含任何参数,则由Microsoft.AspNet.Loader.IIS.FeatureModel.RequestBody实现,它不支持搜索(Request.Body.CanSeek == false).这意味着您无法调整Position属性,只需开始阅读流即可. 这种差异可能与MVC需要从请求体中提取参数值的事实有关,因此它需要读取请求. 在您的情况下,您的操作没有任何参数.因此使用Microsoft.AspNet.Loader.IIS.FeatureModel.RequestBody,如果您尝试设置Position属性,则会引发异常. 解决方案:要么不设置位置,要么检查您是否可以先设置位置: if (Request.Body.CanSeek)
{
// Reset the position to zero to read from the beginning.
Request.Body.Position = 0;
}
var input = new StreamReader(Request.Body).ReadToEnd(); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- WPF的Page介绍及Page Window Frame 之间的链接使用示例,嵌
- 在内联代码ASP.NET中连接两个或多个字符串
- 在ASP.Net网站项目中混合VB.Net和C#代码?
- 解决“这个操作需要IIS集成管道模式”在ASP.net MVC2
- Asp.net System.Web.HttpContext.Current.Session null in
- ASP.NET MVC中是否有嵌套主页?
- asp.net-mvc – 确定哪个控制器和操作在ASP.NET MVC中处理特
- asp.net – 从中等信任环境的Web.config读取system.net/mai
- asp.net-mvc – 使用ASP.NET MVC的IIS应用程序请求路由(ARR
- 如何在ASP.Net内容页面中添加元标记
- asp.net-mvc-3 – 如何在ASP.NET MVC中创建递归结
- .net – 为每个用户创建子域
- 用ADO.NET处理层次数据
- asp.net – 如何在回发中保存asp:HiddenField值
- ASP.NET表单认证在iPad上显示登录页面
- asp.net – 有没有比升级到Visual Studio 2010 U
- asp.net-mvc-3 – MVC站点地图提供程序 – 在痕迹
- asp.net – Windows Workflow Foundation的替代方
- asp.net-mvc – 在MVC3中,我应该有独立的“编辑”
- asp.net-mvc – Mvc4绑定,缩小和AngularJS服务
