public static class HttpRequestHelper
{
public static string RequestBody()
{
var bodyStream = new StreamReader(HttpContext.Current.Request.InputStream);
bodyStream.BaseStream.Seek(0, SeekOrigin.Begin);
var bodyText = bodyStream.ReadToEnd();
return bodyText;
}
}
我计划从ActionFilters调用它来记录传入的请求。当然,可能会有多个同时请求。
这种方法可以吗?
您的问题是从并发性的角度还是从一般的 Web API ASP.NET 角度提出的?每个请求都有自己的上下文,您可以并行处理多个请求。但这里有两件事供您查看。
(1)由于您使用的是HttpContext
,因此您将自己锁定在虚拟主机(IIS)上,这在许多情况下应该没问题。但我希望你意识到这一点。
(2) 如前所述,您的代码HttpRequestHelper.RequestBody()
在从操作过滤器调用时将起作用。但是,如果您尝试从其他地方调用它,例如消息处理程序,这将不起作用。当我说这行不通时,将请求正文绑定到操作方法参数的参数绑定将不起作用。一旦你完成,你将需要寻求开始。它从操作筛选器工作的原因是,当操作筛选器在管道中运行时,绑定已经发生。这是您可能需要注意的另一件事。
我需要使用Cookie请求的InputStream。我有一个导航到 aspx 页面的 WebApp 和 IOS 应用程序,如果 url 请求包含一些参数,我会读取数据库中的信息,如果我在 url 请求中找不到任何参数,我会阅读请求正文,我工作正常!
protected void Page_Load(object sender, EventArgs e)
{
try
{
if (string.IsNullOrEmpty(Request.QueryString["AdHoc"]) == false)
{
string v_AdHocParam = Request.QueryString["AdHoc"];
string [] v_ListParam = v_AdHocParam.Split(new char[] {','});
if (v_ListParam.Length < 2)
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(WS_DemandeIntervention));
WS_DemandeIntervention response = (WS_DemandeIntervention)jsonSerializer.ReadObject(Request.InputStream);
....
}
if (string.IsNullOrEmpty(Request.QueryString["IdBonDeCommande"])==false)
{
....