gpt4 book ai didi

c# - WCF:StackoverFlow 异常

转载 作者:行者123 更新时间:2023-11-30 12:16:56 25 4
gpt4 key购买 nike

我在尝试对 .NET ServiceController 类进行序列化时遇到异常。当它为 null 时,它可以很好地序列化,但是一旦我填充它,我就会得到一个 stackoverflow 异常。

所以这是可行的:

    [DataMember]
public ServiceController MyServiceController
{
get { return null; }
}

但是这给出了错误“System.ServiceProcess.dll 中出现类型为‘System.StackOverflowException’的未处理异常”:

public class TestClass
{
private ServiceController _serviceController;
[DataMember]
public ServiceController MyServiceController
{
get { return ServiceController.GetServices()[0];
}
}

奇怪的是,日志里一点错误都没有。当出现错误时,我可以在日志中看到它,所以这不是因为我的日志不工作。这是我的配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyCompany.Wcf.RdbmsServer.RdbmsServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" httpHelpPageEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="MyCompany.Wcf.RdbmsServer.RdbmsServiceBehavior"
name="MyCompany.Wcf.RdbmsServer.RdbmsService">
<endpoint address="" binding="wsHttpBinding" contract="MyCompany.Wcf.RdbmsServer.IRdbmsService" bindingConfiguration="IncreaseMaxMessageSize">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/Design_Time_Addresses/MyCompany.Wcf.RdbmsServer/RdbmsService/" />
</baseAddresses>
</host>
</service>
</services>

<bindings>
<wsHttpBinding>
<binding name="IncreaseMaxMessageSize"
maxReceivedMessageSize="655360000">
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>

<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="All"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>

</configuration>

这是我的服务界面

[ServiceContract]
public interface IRdbmsService
{
[OperationContract]
TestClass GetServiceControllerList();
}

实现是:

    public TestClass GetServiceControllerList()
{
return new TestClass();
}

有什么想法吗?

最佳答案

您正在导致序列化程序递归:

public class TestClass
{
private ServiceController _serviceController;
[DataMember]
public ServiceController MyServiceController
{
get { return ServiceController.GetServices()[0]; // <-- this returns your service
}
}

返回的服务是您的 IRdbmsService,它返回 TestClass。这然后需要序列化等。

编辑:澄清:

当 TestClass 被序列化时,序列化程序会查看其所有 DataMember 属性,其中之一是 ServiceController。然后它序列化此属性,它在 get 上执行此操作:

return ServiceController.GetServices()[0];

由于 IRdbmsService 是您范围内定义的唯一服务,它位于 GetServices 调用响应的索引 0 处,因此必须对其进行序列化。由于 GetServiceControllerList 的返回类型是 TestClass,因此 TestClass 必须被序列化,这让我们回到了开始(因此,递归)。

至于如何解决这个问题,这取决于您要做什么。该服务目前正在做的是将有关自身的信息返回给调用者,这对我来说没有意义;调用者在消费时(调用之前)已经有了这些信息。你能阐明你的意图吗?

关于c# - WCF:StackoverFlow 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4450435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com