System.NullReferenceException 用于在 Windows 服务器 IIS 上运行但在 Visual Studio IIS Express 中运行时在本地运行的 .NET 服务

Posted

技术标签:

【中文标题】System.NullReferenceException 用于在 Windows 服务器 IIS 上运行但在 Visual Studio IIS Express 中运行时在本地运行的 .NET 服务【英文标题】:System.NullReferenceException for .NET service running on windows server IIS but works locally when running in Visual Studio IIS Express 【发布时间】:2020-05-28 15:02:56 【问题描述】:

我有一个继承的 .NET 项目,在 Windows Server IIS 上运行时,我无法让服务正确返回。

异常类型是System.NullReferenceException

堆栈跟踪是at Integra.HLX.SB.Web.WS_Reps..ctor() at CreateIntegra.HLX.SB.Web.WS_Reps() at System.ServiceModel.InstanceContext.GetServiceInstance(Message message) at System.ServiceModel.Dispatcher.InstanceBehavior.EnsureServiceInstance(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

当我尝试 POST 到服务的端点时会引发此错误。我假设我在 web.config 中遗漏了一些东西,以允许它在 Windows Server 上的 IIS 上工作,或者可能在 Windows Server 上的 IIS 中遗漏了功能设置。

这里是相关的 web.config 设置...

<system.serviceModel> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> <bindings> <webHttpBinding> <binding name="binding1"> <security mode="Transport" /> </binding> </webHttpBinding> </bindings> <behaviors> <endpointBehaviors> <behavior name="Integra.HLX.SB.Web.WS_RepsAspNetAjaxBehavior"> <enableWebScript /> </behavior> <behavior name="Integra.HLX.SB.Web.WS_ClientContactsAspNetAjaxBehavior"> <enableWebScript /> </behavior> <behavior name="Integra.HLX.SB.Web.WS_ContactUniverseNameAddressesAspNetAjaxBehavior"> <enableWebScript /> </behavior> <behavior name="Integra.HLX.SB.Web.WS_UsersAspNetAjaxBehavior"> <enableWebScript /> </behavior> <behavior name="jsonBehavior"> <webHttp /> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="RESTbehavior"> <serviceMetadata httpGetEnabled="true" /> </behavior> <behavior> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors> </behaviors> <services> <service name="Integra.HLX.SB.Web.WS_Reps"> <endpoint address="" behaviorConfiguration="Integra.HLX.SB.Web.WS_RepsAspNetAjaxBehavior" bindingConfiguration="binding1" binding="webHttpBinding" contract="Integra.HLX.SB.Web.WS_Reps" /> </service> <service name="Integra.HLX.SB.Web.WS_ClientContacts"> <endpoint address="" behaviorConfiguration="Integra.HLX.SB.Web.WS_ClientContactsAspNetAjaxBehavior" bindingConfiguration="binding1" binding="webHttpBinding" contract="Integra.HLX.SB.Web.WS_ClientContacts" /> </service> <service name="Integra.HLX.SB.Web.WS_ContactUniverseNameAddresses"> <endpoint address="" behaviorConfiguration="Integra.HLX.SB.Web.WS_ContactUniverseNameAddressesAspNetAjaxBehavior" bindingConfiguration="binding1" binding="webHttpBinding" contract="Integra.HLX.SB.Web.WS_ContactUniverseNameAddresses" /> </service> <service name="Integra.HLX.SB.Web.WS_Users"> <endpoint address="" behaviorConfiguration="Integra.HLX.SB.Web.WS_UsersAspNetAjaxBehavior" bindingConfiguration="binding1" binding="webHttpBinding" contract="Integra.HLX.SB.Web.WS_Users" /> </service> <service name="Integra.HLX.SB.Web.WS_SpeakerDataFeed" behaviorConfiguration="RESTbehavior"> <endpoint address="" bindingConfiguration="binding1" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="Integra.HLX.SB.Web.IWS_SpeakerDataFeed" /> </service> <service name="Integra.HLX.SB.Web.WS_DashboardDataFeed" behaviorConfiguration="RESTbehavior"> <endpoint address="" bindingConfiguration="binding1" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="Integra.HLX.SB.Web.IWS_DashboardDataFeed" /> </service> </services> </system.serviceModel>

任何帮助将不胜感激。谢谢!

【问题讨论】:

当异常清楚地给你调用堆栈时,我想知道是什么阻止你从那里调试。你必须更具体并分享更多细节。差别太多了,blog.lextudio.com/… 所以你不能让别人帮你猜。 我尝试使用远程调试,但我无法在服务代码中添加断点(我相信它会抱怨未定义符号)。我能够在我的 Web 应用程序源代码中插入断点,并且在使用远程调试时这些断点确实会受到影响。 ***.com/questions/151966/… @LexLi:感谢您花时间研究这个问题,但正如我上面所指出的,我可以远程调试。如果我在调试模式下构建我的应用程序,该模式构建所有 .PDB 文件,并将其部署到我的 Windows 服务器,我能够成功调试我的 Web 应用程序源,但我无法调试存在于 App_Code 中的服务代码项目目录。 我修好了。显然,web.config 缺少这一行,&lt;serviceHostingEnvironment aspNetCompatibilityEnabled="true" /&gt; 我通过检查 Windows 事件查看器日志找到了更多信息,并发现了这一关键信息The service cannot be activated because it requires ASP.NET compatibility. ,它为我指明了正确的方向。只希望原始异常有更多相关信息。 【参考方案1】:

我能够回答我自己的问题。在这种情况下,我的解决方法是生产服务器上的 web.config 缺少 &lt;serviceHostingEnvironment aspNetCompatibilityEnabled="true" /&gt;

我通过查看 Windows 事件查看器日志了解了更多信息,并找到了这一关键信息The service cannot be activated because it requires ASP.NET compatibility.

将上述行插入web.config并重新启动AppPool和服务器后,服务开始正常工作。我希望这对将来的任何人都有帮助。

【讨论】:

以上是关于System.NullReferenceException 用于在 Windows 服务器 IIS 上运行但在 Visual Studio IIS Express 中运行时在本地运行的 .NET 服务的主要内容,如果未能解决你的问题,请参考以下文章