0

我在玩 XSockets.NET,我花了太多时间调试应该是一个简单的问题。我正在使用 XSockets 附带的标准模板,它创建了一个名为 XSockets.DevServer 的项目,并在该项目中创建了一个名为 DebugInstance 的类。当我在我的 Web 项目中托管这个 DebugInstance 类时,一切似乎都按预期工作。但是,当我尝试在 XSockets.Debug.Console 项目中托管它时,或者当我尝试让它在我的生产 IIS 实例上运行时,我在下面的代码中得到一个 NullReferenceException:

    [ImportOne(typeof(IXBaseServerContainer))]
    public IXBaseServerContainer wss { get; set; }

    public DebugInstance()
    {
        try
        {
            Debug.AutoFlush = true;
            this.ComposeMe();

            // NullReferenceException on the next line - wss apparently never gets set.
            wss.OnServersStarted += wss_OnServersStarted;
            wss.OnServerClientConnection += wss_OnServerClientConnection;
            wss.OnServerClientDisconnection += wss_OnServerClientDisconnection;
            wss.OnError += wss_OnError;
            wss.OnIncommingTextData += wss_OnIncommingTextData;
            wss.OnOutgoingText += wss_OnOutgoingText;
            wss.OnServersStopped += wss_OnServersStopped;
            wss.StartServers();
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Exception while starting server: " + ex);
            Debug.WriteLine("Press enter to quit");
        }
    }

很明显,问题发生在 中this.ComposeMe(),但没有故障排除信息,而且由于 XSockets 显然不是开源的,所以我无法通过代码来找出问题所在。

编辑:要清楚,我知道 NullReferenceException 是什么。wss在这种情况下,它的直接原因是 null的事实。我想知道的是它的近因,即为什么ComposeMe()不分配它,即使这显然是它应该做的。显然,XSockets 用来支持其插件架构的本土 IOC 应该找到 的实例IXBaseServerContainer,但显然不是——我不知道为什么。而且没有来源,我什至不确定候选人IXBaseServerContainer是什么。

编辑 2012-11-06:这是我的 app.config 的 appSettings 元素的样子:

<appSettings>
  <add key="XSocketServerStartport" value="4502"/>
  <add key="UsePolicyServer" value="true"/>
  <add key="XSockets.PluginCatalog" value="XSockets\XSocketServerPlugins\"/>
  <add key="XSockets.PluginFilter" value="*.dll"/>
  <add key="XMessageInterceptorsEnabled" value="false"/>
  <add key="XErrorInterceptorsEnabled" value="false"/>
  <add key="XConnectionInterceptorsEnabled" value="false"/>
  <add key="XHandshakeInterceptorsEnabled" value="false"/>
  <add key="XSocketLogPath" value="XSockets\XSocketServerPlugins\Log"/>
  <add key="XBufferSize" value="8192"/>
</appSettings>

$(ProjectDir)\XSockets\XSocketServerPlugins\和我的$(TargetDir)\XSockets\XSocketServerPlugins\文件夹中都有下面提到的所有文件,例如:

10/29/2012  09:53 AM            15,872 XSockets.Core.Communication.dll
10/29/2012  09:53 AM            70,656 XSockets.Core.dll
10/29/2012  09:53 AM             8,192 XSockets.DevelopmentServer.dll
10/29/2012  09:53 AM            11,776 XSockets.Extensibility.Handlers.dll
10/29/2012  09:53 AM            10,240 XSockets.Extensibility.Interceptors.dll
10/29/2012  09:53 AM            23,040 XSockets.External.dll
10/29/2012  09:53 AM            24,064 XSockets.Protocol.dll
10/29/2012  09:53 AM            39,424 XSockets.Server.dll
11/05/2012  05:37 PM            12,288 XSockets.WebRTC.Prototype.Shared.Handlers.dll

有什么想法吗?

4

2 回答 2

1

肯,

当 XSockets.NET 的插件框架没有找到任何“插件”时,没有任何东西可以编写。我认为这是因为您的 IIS 生产实例中没有部署“插件”?

您需要将以下元素添加到配置文件 (web.config) 的 appSettings 部分

<add key="XSockets.PluginCatalog" value="XSockets\XSocketServerPlugns\" />
<add key="XSockets.PluginFilter" value="*.dll" />

在“我的情况”中,我在内部有 XSockets.NET 插件(协议、处理程序/控制器)

/XSockets/XSocketServerPlugns文件夹在我的网站。

您应该在该文件夹中有以下插件(.dll)

  1. XSockets.Core.Communication
  2. XSockets.Core
  3. XSockets.Extensibility.Handlers
  4. XSockets.Extensibility.Interceptors
  5. Xsockets.External
  6. XSockets.Protocol
  7. XSockets.Server
  8. XSockets.DevelopmentServer **

** 这是包含您的服务器的项目/类库。(即DebugInstance)

如果要配置服务器,则需要创建一个配置加载器类,请参阅此 url 以获取信息http://xsockets.net/api/net-c/creating-custom-configuration-plugin,或者发送电子邮件至contact@xsockets.net 我们会帮助你。

如果您需要进一步的帮助,请告诉我。

亲切的问候

于 2012-11-06T14:13:04.663 回答
0

首先,如果您正在运行控制台应用程序,请切换到 .NET 4 而不是默认的 .NET 4 客户端配置文件(如果尚未完成)。

第二。我们将提供一种更好的方法来了解哪些引用要添加到启动服务器的项目中。同时,您应该能够在包管理器控制台中运行它以查看需要哪些 refs

(Get-Project XSocketHandler).Object.References | Where-Object {$_.CopyLocal -eq $true}

你有我的电子邮件,所以请与我联系,我们可以进行 Skype 会议或更多讨论。

问候 Uffe,XSockets 团队

于 2012-11-06T21:00:07.750 回答