Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在AppPool循环后重新连接时,MVC5挂起MapSignal_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 5_Signalr - Fatal编程技术网

C# 在AppPool循环后重新连接时,MVC5挂起MapSignal

C# 在AppPool循环后重新连接时,MVC5挂起MapSignal,c#,asp.net,asp.net-mvc,asp.net-mvc-5,signalr,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 5,Signalr,我的Startup.SignalR.cs中有以下代码: using Microsoft.AspNet.SignalR; using Owin; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Admin { public partial class Startup {

我的Startup.SignalR.cs中有以下代码:

using Microsoft.AspNet.SignalR;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Admin
{
    public partial class Startup
    {
        public void ConfigureSignalR(IAppBuilder app)
        {
            var Config = new HubConfiguration()
            {
                EnableDetailedErrors = false,
                Resolver = new DefaultDependencyResolver()
            };

#if DEBUG
            Config.EnableDetailedErrors = true;
#endif
            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();

            GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(600);
        }
    }
}
在应用程序的初始加载过程中,一切正常,但是当允许线程休眠(保留约10分钟)时,AppPool被回收,线程卡在这条线上:

app.MapSignalR();
IDE被绿色箭头卡住,
这是该线程从当前函数返回时要执行的下一条语句。
。但是,我不知道此上下文中的当前函数是什么

尝试检查任何局部变量会导致
无法计算表达式,因为本机框架位于调用堆栈的顶部。
但是调用堆栈显示:
Admin.dll!Admin.Startup.configureSignal(Owin.IAppBuilder应用程序)第25行
作为顶部框架

代码永远不会从此状态恢复,必须通过重新启动调试会话来完全重新启动AppPool

有人对这种情况有什么解释吗

其他信息: 启用Debug=>Windows=>Parralell堆栈后,我看到了更详细的堆栈跟踪:

[Managed to Native Transition]  
mscorlib.dll!Microsoft.Win32.RegistryKey.OpenSubKey(string name, bool writable)
mscorlib.dll!Microsoft.Win32.RegistryKey.OpenSubKey(string name)
System.dll!System.Diagnostics.PerformanceCounterLib.FindCustomCategory(string category, out System.Diagnostics.PerformanceCounterCategoryType categoryType)
System.dll!System.Diagnostics.PerformanceCounterLib.IsCustomCategory(string machine, string category)
System.dll!System.Diagnostics.PerformanceCounter.InitializeImpl()
System.dll!System.Diagnostics.PerformanceCounter.PerformanceCounter(string categoryName, string counterName, string instanceName, bool readOnly)
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Infrastructure.PerformanceCounterManager.LoadCounter(string categoryName, string counterName, string instanceName, bool isReadOnly)
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Infrastructure.PerformanceCounterManager.LoadCounter(string categoryName, string counterName, bool isReadOnly)
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Infrastructure.PerformanceCounterManager.SetCounterProperties()
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Infrastructure.PerformanceCounterManager.Initialize(string instanceName, System.Threading.CancellationToken hostShutdownToken)
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Hosting.HostDependencyResolverExtensions.InitializePerformanceCounters(Microsoft.AspNet.SignalR.IDependencyResolver resolver, string instanceName, System.Threading.CancellationToken hostShutdownToken)
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.SignalR.Hosting.HostDependencyResolverExtensions.InitializeHost(Microsoft.AspNet.SignalR.IDependencyResolver resolver, string instanceName, System.Threading.CancellationToken hostShutdownToken)
Microsoft.AspNet.SignalR.Core.dll!Owin.OwinExtensions.UseSignalRMiddleware<Microsoft.AspNet.SignalR.Owin.Middleware.HubDispatcherMiddleware>(Owin.IAppBuilder builder, object[] args)
Microsoft.AspNet.SignalR.Core.dll!Owin.OwinExtensions.RunSignalR(Owin.IAppBuilder builder, Microsoft.AspNet.SignalR.HubConfiguration configuration)
Microsoft.AspNet.SignalR.Core.dll!Owin.OwinExtensions.MapSignalR.AnonymousMethod__0(Owin.IAppBuilder subApp)
Microsoft.Owin.dll!Owin.MapExtensions.Map(Owin.IAppBuilder app, Microsoft.Owin.PathString pathMatch, System.Action<Owin.IAppBuilder> configuration)
Microsoft.Owin.dll!Owin.MapExtensions.Map(Owin.IAppBuilder app, string pathMatch, System.Action<Owin.IAppBuilder> configuration)
Microsoft.AspNet.SignalR.Core.dll!Owin.OwinExtensions.MapSignalR(Owin.IAppBuilder builder, string path, Microsoft.AspNet.SignalR.HubConfiguration configuration)
Microsoft.AspNet.SignalR.Core.dll!Owin.OwinExtensions.MapSignalR(Owin.IAppBuilder builder, Microsoft.AspNet.SignalR.HubConfiguration configuration)
Microsoft.AspNet.SignalR.Core.dll!Owin.OwinExtensions.MapSignalR(Owin.IAppBuilder builder)
Admin.dll!Admin.Startup.ConfigureSignalR(Owin.IAppBuilder app) Line 25
[管理到本机转换]
mscorlib.dll!Microsoft.Win32.RegistryKey.OpenSubKey(字符串名称,布尔可写)
mscorlib.dll!Microsoft.Win32.RegistryKey.OpenSubKey(字符串名称)
System.dll!System.Diagnostics.PerformanceCounterLib.FindCustomCategory(字符串类别,out System.Diagnostics.PerformanceCounterCategory类别类型)
System.dll!系统.Diagnostics.PerformanceCounterLib.IsCustomCategory(字符串机器,字符串类别)
System.dll!System.Diagnostics.PerformanceCounter.InitializeImpl()
System.dll!System.Diagnostics.PerformanceCounter.PerformanceCounter(字符串类别名称、字符串计数器名称、字符串实例名称、bool只读)
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.signal.Infrastructure.PerformanceCounterManager.LoadCounter(字符串类别名称、字符串计数器名称、字符串实例名称、bool isReadOnly)
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.signal.Infrastructure.PerformanceCounterManager.LoadCounter(字符串类别名称、字符串计数器名称、bool isReadOnly)
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.signal.Infrastructure.PerformanceCounterManager.SetCounterProperties()
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.signar.Infrastructure.PerformanceCounterManager.Initialize(字符串instanceName,System.Threading.CancellationToken HostShutdowToken)
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.signal.Hosting.HostDependencyResolveX.InitializePerformanceCounters(Microsoft.AspNet.signer.IDependencyResolver解析器、字符串instanceName、System.Threading.CancellationToken HostShutdowToken)
Microsoft.AspNet.SignalR.Core.dll!Microsoft.AspNet.signer.Hosting.hostDependencyResolveXtensions.InitializeHost(Microsoft.AspNet.signer.IDependencyResolver解析器、字符串instanceName、System.Threading.CancellationToken HostShutdowToken)
Microsoft.AspNet.SignalR.Core.dll!Owin.Owin.usesignalrmidware(Owin.IAppBuilder构建器,对象[]参数)
Microsoft.AspNet.SignalR.Core.dll!Owin.Owin.runsignar(Owin.IAppBuilder builder,Microsoft.AspNet.signar.hub配置)
Microsoft.AspNet.SignalR.Core.dll!Owin.Owin.mapsigner.AnonymousMethod\uu0(Owin.IAppBuilder子应用)
Microsoft.Owin.dll!Owin.MapExtensions.Map(Owin.IAppBuilder应用程序,Microsoft.Owin.PathString路径匹配,系统操作配置)
Microsoft.Owin.dll!映射(Owin.IAppBuilder应用程序,字符串路径匹配,系统操作配置)
Microsoft.AspNet.SignalR.Core.dll!Owin.Owin.MAPSIGNAR(Owin.IAppBuilder生成器,字符串路径,Microsoft.AspNet.signal.HubConfiguration)
Microsoft.AspNet.SignalR.Core.dll!Owin.Owin.mapsigner(Owin.IAppBuilder builder,Microsoft.AspNet.signal.hub配置)
Microsoft.AspNet.SignalR.Core.dll!Owin.Owin.mapsigner(Owin.IAppBuilder)
Admin.dll!Admin.Startup.configureSignal(Owin.IAppBuilder应用程序)第25行

正如Pawel所提到的,我能够通过使用虚拟性能计数器解决我的问题,如下所述:


此问题的另一个解决方案,来自此博客帖子:


我在这里找到了解决方案:github.com/SignalR/SignalR/issues/3414 剪样:

public void Configuration(IAppBuilder app)
{
    var task = Task.Run(() => app.MapSignalR());
    task.Wait(300);
    //try again if it fails just to be sure ;)
    if (task.IsCanceled) Task.Run(() => app.MapSignalR()).Wait(300);
}

这看起来与此类似:我也遇到了同样的问题。我最初尝试了这种方法,但没有起到任何作用,我在第一个
任务中仍然遇到挂起。Run()
,尽管它有300毫秒的等待超时。请参阅下面@eladm的答案,因为这是SignalR dev分支中的官方修复。尚未在2.2.0中发布。
app.SanitizeThreadCulture();

public static void SanitizeThreadCulture(this IAppBuilder app)
{
        var currentCulture = CultureInfo.CurrentCulture;

        // at the top of any culture should be the invariant culture,
        // find it doing an .Equals comparison ensure that we will
        // find it and not loop endlessly
        var invariantCulture = currentCulture;
        while (invariantCulture.Equals(CultureInfo.InvariantCulture) == false)
            invariantCulture = invariantCulture.Parent;

        if (ReferenceEquals(invariantCulture, CultureInfo.InvariantCulture))
            return;

        var thread = Thread.CurrentThread;
        thread.CurrentCulture = CultureInfo.GetCultureInfo(thread.CurrentCulture.Name);
        thread.CurrentUICulture = CultureInfo.GetCultureInfo(thread.CurrentUICulture.Name);
}
public void Configuration(IAppBuilder app)
{
    var task = Task.Run(() => app.MapSignalR());
    task.Wait(300);
    //try again if it fails just to be sure ;)
    if (task.IsCanceled) Task.Run(() => app.MapSignalR()).Wait(300);
}