我在MVC4中使用了structuremap构造函数依赖解析器。应用程序运行成功,但在signalR javascript客户端没有连接到我的集线器(对象引用未设置为对象的实例。)
请告诉我下面的代码有什么问题:
SignalRStructureMapResolver.cs
public class SignalRStructureMapResolver : DefaultDependencyResolver
{
private readonly IContainer _container;
public SignalRStructureMapResolver(IContainer container)
{
_container = container;
}
public override object GetService(Type serviceType)
{
object service;
if (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass)
{
// Concrete type resolution
service = _container.GetInstance(serviceType);
}
else
{
// Other type resolution with base fallback
service = _container.TryGetInstance(serviceType) ?? base.GetService(serviceType);
}
return service;
}
public override IEnumerable<object> GetServices(Type serviceType)
{
var objects = _container.GetAllInstances(serviceType).Cast<object>();
return objects.Concat(base.GetServices(serviceType));
}
}
UiRegistry.cs
public class UiRegistry : Registry
{
public UiRegistry()
{
Scan(x =>
{
x.TheCallingAssembly();
x.WithDefaultConventions();
x.AssemblyContainingType<IMappingEngine>();
});
KeepAlive.Start();
For<IUnitOfWork>()
.Singleton()
.HybridHttpOrThreadLocalScoped()
.Use<UnitOfWork>();
For<IMappingEngine>().Use(ctx => Mapper.Engine);
For<IDependencyResolver>().Add<SignalRStructureMapResolver>();
}
}
AppStartUpModule.cs
public class AppStartUpModule : IHttpModule
{
public static void BootStrapper()
{
ConfigureSignalR();
}
private static void ConfigureSignalR()
{
GlobalHost.DependencyResolver = ObjectFactory.GetInstance<IDependencyResolver>();
}
}
ChatHub.cs
public class ChatHub : Hub
{
private readonly IViewRepository<MemberView> _memberRepository;
public ChatHub(IViewRepository<MemberView> memberRepository)
{
_memberRepository = memberRepository;
}
public void Send(string message)
{
var name = HttpContext.Current.User.Identity.Name;
var mem = _memberRepository.GetByKey(Property.Of<MemberView>(x => x.Code), name);
var currentDateTime = SystemTime.Now();
Clients.All.sendMessage(name, message, currentDateTime);
}
}
但是在运行应用程序时遇到了错误:
在Chrome控制台中
GET http://localhost:9095/signalr/negotiate?connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&clientProtocol=1.3&_=1392969587574 500 (Internal Server Error)
网络获取请求错误
<!DOCTYPE html>
<html>
<head>
<title>Object reference not set to an instance of an object.</title>
<meta name="viewport" content="width=device-width" />
<style>
body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;}
p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
pre {font-family:"Consolas","Lucida Console",Monospace;font-size:11pt;margin:0;padding:0.5em;line-height:14pt}
.marker {font-weight: bold; color: black;text-decoration: none;}
.version {color: gray;}
.error {margin-bottom: 10px;}
.expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }
@media screen and (max-width: 639px) {
pre { width: 440px; overflow: auto; white-space: pre-wrap; word-wrap: break-word; }
}
@media screen and (max-width: 479px) {
pre { width: 280px; }
}
</style>
</head>
<body bgcolor="white">
<span><H1>Server Error in '/' Application.<hr width=100% size=1 color=silver></H1>
<h2> <i>Object reference not set to an instance of an object.</i> </h2></span>
<font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">
<b> Description: </b>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
<br><br>
<b> Exception Details: </b>System.NullReferenceException: Object reference not set to an instance of an object.<br><br>
<b>Source Error:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
<code>
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.</code>
</td>
</tr>
</table>
<br>
<b>Stack Trace:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
<code><pre>
[NullReferenceException: Object reference not set to an instance of an object.]
Microsoft.AspNet.SignalR.PersistentConnection.ProcessNegotiationRequest(HostContext context) +400
Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context) +318
Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequest(HostContext context) +526
Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(IDictionary`2 environment) +222
Microsoft.AspNet.SignalR.Owin.Middleware.HubDispatcherMiddleware.Invoke(IOwinContext context) +249
Microsoft.Owin.Mapping.<Invoke>d__0.MoveNext() +523
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +22
Microsoft.Owin.Host.SystemWeb.Infrastructure.ErrorState.Rethrow() +33
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar) +150
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) +42
System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +415
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
</pre></code>
</td>
</tr>
</table>
<br>
<hr width=100% size=1 color=silver>
<b>Version Information:</b> Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34009
</font>
</body>
</html>
<!--
[NullReferenceException]: Object reference not set to an instance of an object.
at Microsoft.AspNet.SignalR.PersistentConnection.ProcessNegotiationRequest(HostContext context)
at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context)
at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequest(HostContext context)
at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(IDictionary`2 environment)
at Microsoft.AspNet.SignalR.Owin.Middleware.HubDispatcherMiddleware.Invoke(IOwinContext context)
at Microsoft.Owin.Mapping.MapMiddleware.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.Owin.Host.SystemWeb.Infrastructure.ErrorState.Rethrow()
at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar)
at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar)
at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
-->
答案 0 :(得分:3)
试用此代码,如有必要,请根据需要进行更改:
[assembly: OwinStartup(typeof(WebApp.Initialization.OwinStartup))]
namespace WebApp.Initialization
{
public class OwinStartup
{
public static IBus Bus { get; private set; }
public void Configuration(IAppBuilder app)
{
BootStrapper();
var resolver = ObjectFactory.GetInstance<IDependencyResolver>();
var config = new HubConfiguration
{
Resolver = resolver
};
app.MapSignalR(config);
}
public static void ConfigureNServiceBus()
{
Bus = Configure.With()
.StructureMapBuilder(ObjectFactory.Container)
.MsmqSubscriptionStorage()
.PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(false)
.CreateBus()
.Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
}
}
}
如果有任何疑问,请发帖给我。 :)