【问题标题】:ASP.Net WebApi do not return form data via ContentASP.Net WebApi 不通过 Content 返回表单数据
【发布时间】:2017-12-08 00:41:34
【问题描述】:

我不知道这是否是一个错误,但我无法在服务器端获取原始请求。

考虑以下控制器方法:

[AllowAnonymous]
[Route("api/sayHello")]
[HttpPost]
public string SayHello([FromBody] string userName)
{
    return $"Hello, {userName}.";
}

我通过 cUrl 调用它:

curl -X POST 'https://localhost:809/api/sayHello' --insecure -d "=userName"

它工作正常。

现在我正在尝试添加一些日志记录。我添加了一个执行以下操作的全局过滤器:

public async Task LogFilterAction(HttpActionContext context)
{
    if (context == null)
        throw new ArgumentNullException(nameof(context));
    LogFilterAction(context.ActionDescriptor?.ControllerDescriptor?.ControllerType,
        context.ActionDescriptor?.ActionName,
        context.Request?.RequestUri,
        await GetDataAsString(context.Request?.Content),
        context.Response?.StatusCode
    );
}

private static async Task<string> GetDataAsString(HttpContent content)
{
    if (content == null)
        return null;
    var contentBytes = await content.ReadAsByteArrayAsync();
    return Encoding.UTF8.GetString(contentBytes);
}

但问题是:由于未知原因,contentBytes 始终是一个空数组。我看到它的实际长度是 9(它的长度是 =userName 字符串)

甚至

如您所见,ASP.Net 已成功请求参数,但是它不会以原始方式返回。 Stream 的 position=0,contentConsumed=false,其他一切都很好。但我无法读取传递给控制器​​的数据。

这里有什么问题?

【问题讨论】:

  • 你明白了吗?

标签: c# asp.net asp.net-web-api


【解决方案1】:

ASP.NET Web API 只读取一次内容,因此在您访问内容流时,它已经被读取并且流位于其末尾。再次尝试读取内容将不会返回任何内容。

但是,在一个小示例中,我能够重置流并再次读取它:

private async Task<string> GetDataAsString(HttpContent content)
{
    if (content == null)
        return null;
    using (var str = await content.ReadAsStreamAsync())
    {
        if (str.CanSeek)
            str.Seek(0, System.IO.SeekOrigin.Begin);
        using (var rdr = new StreamReader(str))
        {
            return rdr.ReadToEnd();
        }
    }
}

但是,为了避免副作用,您可能需要考虑使用ActionContextActionArguments 属性。您可以使用此属性来检索传递给操作以进行日志记录的值。这不会干扰 ASP.NET Web API 的内部管道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2015-11-26
    相关资源
    最近更新 更多