鉴于:
IIS中托管的ASP.net Web api应用程序.该应用程序为一个插件生成大约30个应用程序域,这些域可以执行一些外部工作.
该应用程序为很多用户提供服务,并且大部分时间都在运行,但有时(几天甚至几周)它会突然挂起.
问题:
一个Web应用程序有时会"挂起",导致需要重新启动w3wp.exe.
在对这种状态下的转储进行一些检查后,我们发现在这个时刻有很多线程(有时约为15.000).
在正常情况下,我们永远不会观察到超过一百个线程.
DebugDiag说有一个线程阻塞其他线程
现在我们已经看到在线程44(以及许多其他人;大约90%)中,在最后有相同的调用:
Method本身没有任何锁定或线程行为.但是它的静态构造函数有一个不常见的东西.ctor看起来像这样:
static TimeZoneHelper()
{
using (StringReader reader = new StringReader(Resources.TimeZones))
{
string line;
while ((line = reader.ReadLine()) != null)
{
string[] parts = line.Split(';');
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById(parts[1]);
timeZones[parts[0]] = timeZone;
}
}
}
Run Code Online (Sandbox Code Playgroud)
此外,调试分析表明应用程序处于活动的gc中(正如您可能会问的那样:我们永远不会手动触发gc.collect)

问题 是否有证据表明此类代码在静态ctor中存在问题?即使没有任务或线程代码?也许与GC进展本身有关的东西(因为对象是一次性的,即使没有处置代码?)
TimeZoneHelper
我创建了一个gist,其中包含了这个类的主要方法,包括ctor和被称为的方法TimeZoneHelper.ToTimeZoneOffset:
https://gist.github.com/Gentlehag/9d564555261da0e73366
该方法导致的主要是Dictionary.TryGet(在ctor中创建)
编辑Btw我还想在每个appdomain中添加一个程序集解析事件.代码可以在这里看到:
https://gist.github.com/Gentlehag/4726b6d888adb149684d
重要更新 我是同事,只想添加更多信息.我们还发现了另一个非常相似的场景.我有来自拥有该块的线程的堆栈跟踪:
000000c898897560 00007ff8855b7e5d System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].FindEntry(System.__Canon)
000000c8988975d0 00007ff8855b7d34 System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].TryGetValue(System.__Canon, System.__Canon ByRef)
000000c898897610 00007ff88f6152b3 GP.Components.Extensions.AppDomains.RemotingRunner.CurrentDomain_AssemblyResolve(System.Object, System.ResolveEventArgs)
000000c8988978a0 00007ff886f7276c …Run Code Online (Sandbox Code Playgroud) 在ASP.NET 5应用程序中,我配置了MVC和Identity框架,如下所示:
app.UseMvc(config=>{
config.MapRoute("Default", "{controller}/{action}/{id?}", new
{
controller = "Home",
action = "Index"
});
});
Run Code Online (Sandbox Code Playgroud)
并添加身份服务:
services.AddAuthentication();
services.AddAuthorization();
services.AddIdentity<CrmUser, CrmUserRole>(config => {
config.User.RequireUniqueEmail = true;
})
.AddUserStore<MongoUserStore>()
.AddRoleStore<MongoUserStore>()
.AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)
和
app.UseIdentity()
.UseCookieAuthentication(i => { i.LoginPath = "/Account/Login";});
Run Code Online (Sandbox Code Playgroud)
该示例定义如下:
public class MyApiController : Microsoft.AspNet.Mvc.Controller
{
[Authorize]
public async Task<ActionResult> Foo()
{
return Ok();
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我也有一些控制器,我想以API方式使用.在ASP.NET 5中,它们都具有相同的基类,因此API和视图控制器之间没有区别.
因此,当调用需要授权的未经授权的api时,我会得到一个HTTP 200和登录页面而不是HTTP 401.
在Shawn Wildermuth的博客文章中,我发现了这一点
services.AddCookieAuthentication(config =>
{
config.LoginPath = "/Auth/Login";
config.Events = new CookieAuthenticationEvents()
{ …Run Code Online (Sandbox Code Playgroud) asp.net asp.net-mvc asp.net-identity asp.net-core-mvc asp.net-core
我正在寻找一种在ASP.NET 5中编写自定义授权过滤器的方法,因为当前的实现依赖于策略/需求,而这些策略/需求又仅仅依赖于声明的使用,因此在最初的不断变化的身份系统中我真的厌倦了(我已经尝试了所有的味道).
我有一大堆permisions(超过200),我不想编码声明,因为我拥有自己的存储库,并且比检查数百个字符串要快得多的检查方法(这就是声称是到底).
我需要在每个属性中传递一个参数,该参数应该根据我的自定义权限存储库进行检查:
[Authorize(Requires = enumPermission.DeleteCustomer)]
Run Code Online (Sandbox Code Playgroud)
我知道这不是最常见的情况,但我认为这不是一个优势.我试图按照@leastprivilege所描述的方式在他的宏观帖子"ASP.NET 5和MVC 6中的安全状态:授权"中实现它,但我和作者打了同样的墙,甚至打开了关于ASP.NET 5 github repo的一个问题,已经以一种不太明确的方式关闭了:链接
知道怎么做到这一点?也许使用其他类型的过滤器?在那种情况下,怎么样?
给定(简化说明)
我们的一项服务在内存中有很多实例.大约85%是独一无二的.我们需要对这些项目进行非常快速的基于密钥的访问,因为它们在单个堆栈/调用中经常被查询.这个单一的上下文非常优化性能.
所以我们开始将它们放入字典中.表现还可以.
在这种情况下,尽可能快地访问项目是最重要的.确保在读取发生时没有写入操作.
问题
与此同时,我们达到了字典可以存储的项目数量的限制.
Die Arraydimensionen haben den unterstützten Bereich überschritten.
bei System.Collections.Generic.Dictionary`2.Resize(Int32 newSize, Boolean forceNewHashCodes)
bei System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
Run Code Online (Sandbox Code Playgroud)
这转化为The array dimensions have exceeded the supported range.
像Memcached这样的解决方案在这个特定情况下太慢了.它是一个封装在单个服务中的独立的非常具体的用例
因此,我们正在寻找替代此特定方案的字典.
目前我找不到一个支持这个.我错过了什么吗?有人能指出我吗?
作为替代方案,如果不存在,我们正在考虑自己实施一个.
我们想到了两种可能性.从头开始构建或包装多个词典.
包装多个词典
搜索一个项目时,我们可以看一下HasCode键,并使用它的起始编号作为包装词典列表的索引.虽然这似乎很容易让我闻到,但这意味着哈希码计算两次(内部字典一次由我们一次)(这种情况真的非常具有性能).
我知道像字典那样交换基类是绝对的最后一种可能性,我想避免它.但是目前看起来没有办法让对象更加独特,或者从数据库中获取字典的性能或者在其他地方保存性能.
我也意识到"要注意优化",但较低的性能会严重影响其背后的业务需求.
特定
asp.net 4,带有mvc 5.2.3和.net 4.6.1
我想根据一些请求相关的东西(如主机)更改CurrentCulture支持全球化.
建立文化的Owin-Middleware.
产生行为的简化版本:
public override async Task Invoke(IOwinContext context)
{
var culture = new CultureInfo("es-ES");
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
await Next.Invoke(context);
}
Run Code Online (Sandbox Code Playgroud)
问题:
文化没有被保留所以例如Web控制器没有中间件中设置的文化.
这似乎与线程culturepreserve问题无关.正如调用一些方法并等待它们一样,文化得以保留.
虽然4.5.1有效.(我已经在其他项目中使用过这种方式)当我更改httpRuntime版本时:
<httpRuntime targetFramework="4.5.1" />
Run Code Online (Sandbox Code Playgroud)
一切都像一个魅力.
我找不到任何记录在案的突破性变化.任何提示?我可以用一个空的新ASP项目重现它任何建议?
增加项.
这个问题是不是与文化保护的线程中能正常工作!
CultureInfo.CurrentCulture = new CultureInfo("en-GB");
await Foo();
Debug.WriteLine(Thread.CurrentThread.CurrentCulture);// Works is en-gb
}
private Task Foo()
{
Debug.WriteLine(Thread.CurrentThread.CurrentCulture);// Works is en-gb
return Task.FromResult(true);
}
Run Code Online (Sandbox Code Playgroud) 使用.NET 4.5,我创建了一个可扩展的Web应用程序.使用来自第三方的运行时认证代码执行.
为此,我使用app域和进程间通信.
现在我看到我使用的很多技术都不再支持.NET核心了
喜欢:
对于大多数人来说,有明显的解决方案.但删除AppDomains是一件困难的事情.
如果我理解正确,我应该使用流程.但是,如果我的应用程序有大约100个扩展(多个客户)?这意味着我必须在微服务中创建100个进程(微服务)或至少组合一些进程.
但我对任何一个都感觉不舒服.从某种意义上说,我最终会有数百个进程.如果我分组,我仍然可以在他们之间受到影响.
那么选择什么是正确的方法呢?
在 Google Container Engines Kubernetes 中,我有 3 个节点,每个节点都有 3.75 GB 的内存
\n\n现在我还有一个从单个端点调用的 api。这个端点可以像这样在 mongodb 中进行批量插入。
\n\nIMongoCollection<T> stageCollection = Database.GetCollection<T>(StageName);\n\nforeach (var batch in entites.Batch(1000))\n{\n await stageCollection.InsertManyAsync(batch);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n现在这种情况经常发生,然后我们就会陷入内存不足的情况。
\n\n一方面,我们将wiredTigerCacheSizeGB限制为1.5,另一方面,我们定义了pod的资源限制。
\n\n但结果仍然相同。\n对我来说,mongodb 似乎不知道节点 Pod 的内存限制。\n这是一个已知问题吗?如何处理它,而不扩展到“怪物”引擎?
\n\n配置 yaml 如下所示:
\n\n---\nkind: StorageClass\napiVersion: storage.k8s.io/v1\nmetadata:\n name: fast\nprovisioner: kubernetes.io/gce-pd\nparameters:\n type: pd-ssd\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: mongo\n labels:\n name: mongo\nspec:\n ports:\n - port: 27017\n targetPort: 27017\n clusterIP: None\n selector:\n role: mongo\n---\napiVersion: apps/v1beta1\nkind: StatefulSet\nmetadata:\n name: mongo\nspec:\n serviceName: "mongo"\n replicas: 1\n template:\n metadata:\n labels:\n role: mongo\n …Run Code Online (Sandbox Code Playgroud) 客户可以从域名进入网站.他们也可以从他们的联系人进入mailadresses.
知道我们需要找到哪些webted域名可以与mailadresses域相关联的客户.
所以我的想法是从webadress和url中提取主机并进行比较
那么从url获取主机名的最可靠算法是什么?
例如,主机可以是:
foo.com
www.foo.com
http://foo.com
https://foo.com
https://www.foo.com
Run Code Online (Sandbox Code Playgroud)
结果应该始终是foo.com
我想运行一个简单的clearscript程序。为此,我创建了一个新的ConsoleProject并通过nuget添加了引用。
创建引擎时(第一行代码)
using (var engine = new V8ScriptEngine())
Run Code Online (Sandbox Code Playgroud)
我得到
未处理System.TypeLoadException _HResult = -2146233054
_message =无法加载V8接口程序集;验证您的应用程序是否安装了以下文件:ClearScriptV8-32.dll,ClearScriptV8-64.dll,v8-ia32.dll,v8-x64.dll
我只找到了dll:v8-ia32.dll,v8-x64.dll,但没有任何ClearscriptV8-*。dll
我将它们复制到了编译输出中,但是在运行console.exe时没有任何改变
我还从Github下载了软件包,但其中都没有包含这样的dll。我只有一个ClearScript.dll。
运行包含的控制台项目会引发相同的错误。
我从哪里获得这些dll?我想念什么?
我的项目输出文件夹如下所示:

我还运行了update V8命令。成功,但没有任何改变

然后我还安装了C ++ Redistribueable,如此处所述:在主机上找不到Clearscript文件
特定
3 Node.js项目主要 - 框架 - 存储库
Main还有另外两个通过npm链接连接的项目.
在测试中,我在一个方法中包装了require.我在解决链接项目方面遇到了一些问题(详见下文)
简化代码如下所示:
module.export.resolve = function(file){
[...]//Some more logik to handle relative pathes
return require(file)
}
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都能正常工作 我还努力解决亲戚的问题(查找调用者并根据此路径应用pathes)
现在,这是在Project Framework中链接(npm链接)到Project Main.项目主要还与项目存储库相关联.
现在在Project Main我有:
require('ProjectRepositories/foo') // Works as expected
myRequire.resolve('ProjectRepositories/foo') // Returns MODULE_NOT_FOUND "Cannot find module 'ProjectRepositories/foo'
Run Code Online (Sandbox Code Playgroud)
我假设问题是存储库项目没有在框架项目中链接.但除了链接它们之外还有其他方法吗?
我宁愿减少依赖.有什么提示吗?
c# ×6
.net ×5
asp.net ×3
asp.net-core ×3
asp.net-mvc ×2
.net-4.6 ×1
.net-4.6.1 ×1
appdomain ×1
clearscript ×1
collections ×1
commonjs ×1
dictionary ×1
dns ×1
javascript ×1
kubernetes ×1
mongodb ×1
node.js ×1
npm ×1
parsing ×1
url ×1