gpt4 book ai didi

c#-4.0 - 无法读取 Web API 操作过滤器内容

转载 作者:行者123 更新时间:2023-12-02 19:18:10 25 4
gpt4 key购买 nike

相关问题:Web API action parameter is intermittently nullhttp://social.msdn.microsoft.com/Forums/vstudio/en-US/25753b53-95b3-4252-b034-7e086341ad20/web-api-action-parameter-is-intermittently-null

嗨!

我在 ASP.Net MVC WebAPI 4 中创建一个 ActionFilterAttribute,以便我可以在 Controller 的操作方法中应用该属性,我们需要在执行 token 之前验证 token ,如下代码:

public class TokenValidationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext filterContext)
{
//Tried this way
var result = string.Empty;
filterContext.Request.Content.ReadAsStringAsync().ContinueWith((r)=> content = r.Result);

//And this
var result = filterContext.Request.Content.ReadAsStringAsync().Result;

//And this
var bytes = await request.Content.ReadAsByteArrayAsync().Result;
var str = System.Text.Encoding.UTF8.GetString(bytes);

//omit the other code that use this string below here for simplicity
}
}

我正在尝试将内容读取为字符串。尝试了这段代码中的3种方式,都返回空。我知道在 WebApi 中我只能读取一次请求的正文内容,因此我注释了代码中的其他所有内容,并尝试运行它以查看是否得到结果。重点是,客户端甚至Fiddler都会报告请求的内容长度315。服务器内容标题上也有相同的大小,但是当我们尝试读取内容时,它是空的。

如果我删除该属性并发出相同的请求,则 Controller 会正常调用,并且 Json 的反序列化会完美无缺。如果我放置该属性,我得到的只是内容中的空字符串。这种事总是会发生。不像相关问题所述那样是间歇性的。

我做错了什么?请记住,我使用的是 ActionFilter 而不是 DelegatingHandler,因为只有选定的操作需要在执行前进行 token 验证。

感谢您的帮助!我真的很感激。

问候...

古腾堡

最佳答案

默认情况下,Web 主机 (IIS) 方案的缓冲策略是始终缓冲传入请求的流。您可以查看System.Web.Http.WebHost.WebHostBufferPolicySelector。现在,正如您所想到的,Web Api 的格式化程序将消耗该流,并且不会尝试将其倒回。这是故意的,因为可以更改缓冲策略以使传入请求的流成为非缓冲的,在这种情况下倒带将失败。

因此,在您的情况下,由于您知道请求将始终被缓冲,因此您可以像下面一样获取传入流并将其倒回。

Stream reqStream = await request.Content.ReadAsStreamAsync();

if(reqStream.CanSeek)
{
reqStream.Position = 0;
}

//now try to read the content as string
string data = await request.Content.ReadAsStringAsync();

关于c#-4.0 - 无法读取 Web API 操作过滤器内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18340487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com