gpt4 book ai didi

c# - ASP.NET Web API 跨请求缓存操作过滤器属性

转载 作者:可可西里 更新时间:2023-11-01 07:55:41 25 4
gpt4 key购买 nike

在 ASP.NET Web API (4.0.30506) 中似乎有一些我以前从未见过的奇怪行为。

我看到的是相同的操作过滤器属性实例在 Web API 请求中重复使用。如果此属性被注入(inject)依赖项,这尤其是一个问题,因为这些依赖项可能特定于 Web 请求。我知道属性最好是 passive ,但我的假设是操作过滤器属性未缓存。

我搜索了任何描述此问题及其背后原因的文章、博客文章或 Microsoft 更改日志,但我找不到任何东西。这让我想知道我的配置是否有问题导致这种情况发生。然而,我能够在一个新的空 Visual Studio 2012 Web API 项目中重现这个问题。

我所做的是使用带有“Web API”模板的 Visual Studio 2012 ASP.NET MVC 4 Web 应用程序 项目创建一个新的空项目。它附带 Web API 4.0.20710.0 NuGet 包。之后我添加了以下属性:

[DebuggerDisplay("{id}")]
public class TestFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute {
private static readonly List<int> used = new List<int>();

private static int counter;
private readonly int id;

public TestFilterAttribute() {
this.id = Interlocked.Increment(ref counter);
}

public override void OnActionExecuting(HttpActionContext actionContext) {
// Just for testing: I would expect this line never to throw, but it does.
if (used.Contains(this.id)) throw new Exception("WAT?");
used.Add(this.id);
base.OnActionExecuting(actionContext);
}
}

然后我将此属性添加到 ValuesController(默认模板的一部分):

public class ValuesController : ApiController {
// GET api/values
[TestFilterAttribute]
public IEnumerable<string> Get() {
return new string[] { "value1", "value2" };
}

// ...
}

现在,当我启动项目时,转到浏览器中的/api/values 并刷新该页面几次,“WAT?”抛出异常。

这是 Web API 的正常行为吗?如果是,原因是什么?或者我是否在某处遗漏了有关此更改的一些备忘录?这是否会使 Web API 属性更加不适合进行依赖注入(inject)?还是我做错了什么?

最佳答案

Web API 构建在 MVC 之上,因此它使用了它的很多功能。

属性实例的可重用性是 MVC 3 引入的积极缓存的一部分。这意味着同一个 Attribute 实例很可能会与它所应用的所有 Actions 一起使用。 MVC 管道将尽力将您的 Attribute 类视为 Singleton

因为相同的 Attribute instance 被重用,它的 Constructor 没有被调用并且 id 没有递增。例如,如果您在 OnActionExecuting 中增加 id,一切都会正常进行。

你仍然可以用你的属性做任何你想做的事。您只需要记住,您不能保证总是会创建一个新的实例构造函数 不应包含初始初​​始化以外的任何内容。

public TestFilterAttribute() {
// Instance will be reused thus this will not be called for each Action
}

public override void OnActionExecuting(HttpActionContext actionContext) {
// Called on each Action
}

关于c# - ASP.NET Web API 跨请求缓存操作过滤器属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27646196/

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