小编Boa*_*ler的帖子

ThreadLocks和静态构造函数

鉴于:

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)

.net c# asp.net multithreading garbage-collection

6
推荐指数
1
解决办法
178
查看次数

ASP.NET在控制器上的未授权访问应该返回401而不是200和登录页面

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

6
推荐指数
1
解决办法
1166
查看次数

DI进入ASP.NET MVC 6中的需求/策略

我正在寻找一种在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的一个问题,已经以一种不太明确的方式关闭了:链接

知道怎么做到这一点?也许使用其他类型的过滤器?在那种情况下,怎么样?

c# asp.net-identity asp.net-core-mvc asp.net-core

6
推荐指数
1
解决办法
581
查看次数

替换.net字典

给定(简化说明)

我们的一项服务在内存中有很多实例.大约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键,并使用它的起始编号作为包装词典列表的索引.虽然这似乎很容易让我闻到,但这意味着哈希码计算两次(内部字典一次由我们一次)(这种情况真的非常具有性能).

我知道像字典那样交换基类是绝对的最后一种可能性,我想避免它.但是目前看起来没有办法让对象更加独特,或者从数据库中获取字典的性能或者在其他地方保存性能.

我也意识到"要注意优化",但较低的性能会严重影响其背后的业务需求.

.net c# collections dictionary .net-4.6.1

6
推荐指数
1
解决办法
169
查看次数

ASP.NET中间件不再保留文化

特定

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 asp.net asp.net-mvc .net-4.6

6
推荐指数
1
解决办法
875
查看次数

最佳实践如何使用.net CORE隔离动态代码/程序集

使用.NET 4.5,我创建了一个可扩展的Web应用程序.使用来自第三方的运行时认证代码执行.

为此,我使用app域和进程间通信.

现在我看到我使用的很多技术都不再支持.NET核心了

喜欢:

  • 应用程序域
  • 远程处理
  • BinarySerzializers

对于大多数人来说,有明显的解决方案.但删除AppDomains是一件困难的事情.

如果我理解正确,我应该使用流程.但是,如果我的应用程序有大约100个扩展(多个客户)?这意味着我必须在微服务中创建100个进程(微服务)或至少组合一些进程.

但我对任何一个都感觉不舒服.从某种意义上说,我最终会有数百个进程.如果我分组,我仍然可以在他们之间受到影响.

那么选择什么是正确的方法呢?

.net c# appdomain asp.net-core-mvc asp.net-core

6
推荐指数
1
解决办法
887
查看次数

Kubernetes Pod 中的 MongoDb RAM 使用情况 - 不知道节点限制

在 Google Container Engines Kubernetes 中,我有 3 个节点,每个节点都有 3.75 GB 的内存

\n\n

现在我还有一个从单个端点调用的 api。这个端点可以像这样在 mongodb 中进行批量插入。

\n\n
IMongoCollection<T> stageCollection = Database.GetCollection<T>(StageName);\n\nforeach (var batch in entites.Batch(1000))\n{\n  await stageCollection.InsertManyAsync(batch);\n}\n
Run 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)

mongodb kubernetes google-kubernetes-engine

6
推荐指数
1
解决办法
1666
查看次数

解析Domain/hostName的字符串

客户可以从域名进入网站.他们也可以从他们的联系人进入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

.net c# dns url parsing

5
推荐指数
1
解决办法
7802
查看次数

C#ConsoleApp中缺少ClearScriptV8-64.dll,v8-ia32.dll,v8-x64.dll

我想运行一个简单的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文件

c# clearscript

5
推荐指数
1
解决办法
6290
查看次数

包装要求

特定

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)

我假设问题是存储库项目没有在框架项目中链接.但除了链接它们之外还有其他方法吗?

我宁愿减少依赖.有什么提示吗?

javascript commonjs node.js npm

5
推荐指数
1
解决办法
105
查看次数