- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
查找演示此问题的完整示例应用程序 here .
我正在尝试使用 OWIN 中间件填充 WebForms 页面可访问的静态标识符,但我注意到对于某些类型,这并不直观 - 特别是 AsyncLocal<T>
.
考虑以下工作示例,使用 int
:
简单的静态容器
public static class Container
{
public static int CallId { get; set; }
}
简单的 OWIN 配置
[assembly: OwinStartup(typeof(Startup))]
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use((context, next) =>
{
Container.CallId = 5;
return next.Invoke();
});
}
}
简单的 Default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (Container.CallId != 5)
{
throw new Exception("What happened to CallId");
}
}
这按预期运行。中间件集 CallId
到 5,WebForms 页面看到一个 5。没有抛出异常。
如果我想使用 AsyncLocal<int>
,这就是事情打破直觉的地方对于我的 CallId,该值在 WebForms 页面中不再可用。例如
容器破损
public static class Container
{
public static AsyncLocal<int> CallId { get; set; }
}
损坏的 OWIN 配置
[assembly: OwinStartup(typeof(Startup))]
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use((context, next) =>
{
AsyncLocal<int> asyncId = new AsyncLocal<int>();
asyncId.Value = 5
Container.CallId = asyncId;
return next.Invoke();
});
}
}
损坏的 Default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (Container.CallId.Value != 5)
{
throw new Exception("What happened to CallId");
}
}
这没有按预期运行。标识符在中间件中创建,但在页面中不可用。 抛出异常。
为什么?
我正在努力拼凑为什么这次更新打破了直觉;我想不出任何可能导致值(value)消失的事情。
On_Load
之间都保持不变。 . Container
是静态的,因此域中只存在一个实例。 MyType
尝试了同样的事情, CallId
不返回 null
在网络表单中静态哪里去了CallId
值(value)何去何从?
如果您想亲眼看看,这里有一个 demo github repo .
最佳答案
你用错了。使用本地保存所需的值。
public static class Container {
private static AsyncLocal<int> current = new AsyncLocal<int>();
public static int CallId {
get {
return current.Value;
}
set {
current.Value = value;
}
}
}
OWIN 配置保持不变。
[assembly: OwinStartup(typeof(Startup))]
public class Startup {
public void Configuration(IAppBuilder app) {
app.Use((context, next) => {
Container.CallId = 5;
return next.Invoke();
});
}
}
AsyncLocal<T>
类现在将在跨线程的异步流中保留该值。
关于c# - 为什么 AsyncLocal 不从 OWIN 中间件流向 WebForms 页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51778597/
所以我试图将 MiniProfiler ( https://github.com/MiniProfiler/dotnet ) 用于 WebForms 网站。我所做的是: 使用 nuget 安装软件包
是否有等同于 Webforms 的 MvcBuildViews? 最佳答案 不。 另一种方法是将构建后操作添加到 Visual Studio 项目并让它运行 aspnet_compiler.exe “
是否有使用 CSP(内容安全策略)将 WebForms 项目中动态创建的脚本列入白名单的安全方法? 使用 unsafe-inline像下面它的工作原理,但不推荐。 context.Response.H
我们正在尝试使用在经典模式应用程序池中运行的 ASP.NET WebForms 应用程序配置 MiniProfiler(无法将其更改为集成)。我们无法让处理程序工作,因此加载资源失败。 为了解决这个问
是否 ASP.Net 核心 1.0 支持.Net WebForm 项目吗?或者它只是一个 MVC 环境?我也可以在那里创建经典的 Web 服务(asmx)吗? 最佳答案 简短回答:不,ASP.NET
我正在尝试将数据从 webform 传递到方法背后的代码并在 webform 中取回值,然后打印它。我最初测试了以下代码以简单地将请求发布到方法,获取字符串并在页面中打印,它可以工作,但是在尝试将数据
我创建了一个新的 ASP.NET 4.5 WebForms 项目,并发现了一堆与 GridView、DetailsView 和其他数据相关组件以及 MSAjax 相关的额外 javascript 文件
我正在使用带有模型绑定(bind)和 Entity Framework 5 的 .net 4.5 WebForms。 我的网络表单的一部分:
在搜索了很多类似的帖子、解决方法之后,我决定自己发帖。 Compilation Error Description: An error occurred during the compilation
我将在一个项目中工作,我们将在该项目中将 ASP 经典页面重写为 ASP.NET WebForm。我从未使用过 VB、VBScript、ASP Classic。好处是有大量关于 VB6、VB.NET、
在 vs2012 中,f7 键在 aspx/ascx/masterpage 文件的 Markup 和 Codebehind 之间切换。在我重新安装系统之前,Vs2013 的行为方式相同。现在它只会从
我正在尝试登录网站并自动保存 HTML 页面(我希望能够定期执行此操作)。从表面上看,这是一个典型的现代网站,如果用户直接导航到“锁定”的 URL,则会弹出一个登录表单,登录后,用户将被重定向到预期页
我看到人们在以Webform进行路由时使用星号符号。我只是不明白像下面这样的星号的重要性 routes.MapPageRoute( "View Category", /
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我正在尝试在 aspx 页面中执行类似的操作: 我收到错误“预处理器指令必须显示为行上的第一个非空白字符”。我怎样才能做到这一点?
我想渲染一个表单。字段行的 HTML 应该是这样的: 当字段类型为文本时,li.class 必须相同。 我覆盖了 field_row block : {% block
目前我所有的网络表单文件 (.aspx) 都在我的项目 (VS 2012) 的根文件夹中。 我创建了一个名为“pages”的新文件夹,并使用母版页向其中添加了一个新的网络表单 (WebForm1)。当
我正在为销售文员制作一个 asp.net、c#、webforms 网站。我在屏幕顶部有四个主要按钮,我将使用它们来实现很多功能。我想要做的是将这些按钮设置为键盘上的 F1、F2、F3 和 F4 键。
我在网络表单上有两个按钮,它们的显示高度不同。这发生在我更新 Gravity Forms 之后。 参见 http://topdek.nl/prijs/ ,输入随机名称、电子邮件地址和电话号码,单击“V
在我的 WebForms 应用程序中,我有一个 CustomValidator 控件。该控件执行我创建的 JavaScript 函数。如果此函数返回 false,则表单将不会提交。此验证器与标准 Re
我是一名优秀的程序员,十分优秀!