MJJ*_*mes 5 asp.net-mvc asp.net-mvc-4 signalr
我从早期版本开始就使用SignalR并一路升级但是我已经将我的应用程序部署到我的Windows Server 2008 R2生产服务器上,现在应用程序因"无法解决集线器"而崩溃.例外.
编辑:StackTrace已添加:
[InvalidOperationException: 'stockitems' Hub could not be resolved.]
Microsoft.AspNet.SignalR.Hubs.HubManagerExtensions.EnsureHub(IHubManager hubManager, String hubName, IPerformanceCounter[] counters) +426
Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Initialize(IDependencyResolver resolver, HostContext context) +716
Microsoft.AspNet.SignalR.Owin.CallHandler.Invoke(IDictionary`2 environment) +1075
Microsoft.AspNet.SignalR.Owin.Handlers.HubDispatcherHandler.Invoke(IDictionary`2 environment) +363
Microsoft.Owin.Host.SystemWeb.OwinCallContext.Execute() +68
Microsoft.Owin.Host.SystemWeb.OwinHttpHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object extraData) +414
[TargetInvocationException: Exception has been thrown by the target of an invocation.]
Microsoft.Owin.Host.SystemWeb.CallContextAsyncResult.End(IAsyncResult result) +146
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288
Run Code Online (Sandbox Code Playgroud)
在我的开发机器和本地测试服务器上,我没有遇到任何问题.
有问题的中心非常简单:
[HubName("StockItems")]
public class StockItemHub : Hub
{
}
Run Code Online (Sandbox Code Playgroud)
最初我认为这是HubName的一个问题所以删除它但它仍然炸弹.
最初我认为这是由于依赖注入,所以我然后改变我的Global.asax看起来如下:
var signalRResolver = new SignalRDependencyResolver();
GlobalHost.DependencyResolver = signalRResolver;
var configuration = new HubConfiguration { Resolver = signalRResolver };
RouteTable.Routes.MapHubs(configuration);
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters, config.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
Run Code Online (Sandbox Code Playgroud)
编辑:什么是SignalRDependencyResolver?在我尝试解决此问题之前,SignalRDependencyResolver不存在.因为我认为它是一个依赖注入问题,我将DefaultDependencyResolver包装起来覆盖GetService和GetServices,首先检查我的Ninject内核的类型,如果没有回退到DefaultDependencyResolver
有任何想法吗?
服务器运行IIS7,Windows Server 2008与.Net 4.5该应用程序是MVC 4 .Net 4.5
我刚刚遇到这个问题,我深入挖掘,并找到了一个可能的解决方案.我的集线器类不在Web项目的汇编中,它们在一些引用的程序集中.这是多层应用程序中非常常见的情况.
启动时,signalR将尝试通过IAssemblyLocator实例查找集线器类.在IIS站点中部署时,此IAssemblyLocator实例将查找所有引用的程序集.但是在这个时间点,应用程序只是在启动期间,这意味着许多(已引用但尚未加载)的程序集可能尚未被owin主机环境收集.因此,集线器类的查找失败.
因此,只需将程序集添加到Web.Config的system.web/compilation/assemblies部分:
<system.web>
<compilation targetFramework="4.5">
<assemblies>
<add assembly="HubAssembly, Version=1.0.0.0, Culture=neutral"/>
</assemblies>
</compilation>
</system.web>
Run Code Online (Sandbox Code Playgroud)
或者,如果您愿意,也可以通过实现自定义IAssemblyLocator类来解决此问题,并在调用app.MapSignalR后立即将其注册到依赖项解析器中.
using Microsoft.AspNet.SignalR.Hubs;
public class AssemblyLocator : IAssemblyLocator {
public IList<System.Reflection.Assembly> GetAssemblies()
{
// list your hubclass assemblies here
return new List<System.Reflection.Assembly>(new []{typeof(HubAssembly.HubClass).Assembly});
}
}
// add following code to OwinStartup class's Configuration method
app.MapSignalR();
GlobalHost.DependencyResolver.Register(typeof(Microsoft.AspNet.SignalR.Hubs.IAssemblyLocator), () => new AssemblyLocator());
Run Code Online (Sandbox Code Playgroud)
这是一个老问题了,但这个周末又再次出现了。经过花费大量时间调查后,我发现 SignalR 并不是部署中唯一损坏的东西,我的 WebAPI 也抛出找不到控制器异常。
事实证明,这是由 SignalR 和 WebApi 的内部结构反映了 Sites 程序集中的所有类型引起的。在我的例子中,由于有一个类派生 RoleEntryPoint(它是 Azure 类型)而引发了 TypeLoadException,但由于该站点部署在非 Azure 环境中,所以事情崩溃了。只需从非 Azure 版本中排除此类型即可解决该问题。
如果这些 TypeLoadException 更明显,那就太好了,但事实就是如此。
| 归档时间: |
|
| 查看次数: |
6339 次 |
| 最近记录: |