WCF: StackoverFlow exception

I get an exception when trying to connect to the .NET ServiceController class. It serializes fine when it is null, but after filling it, I get a stackoverflow exception.

So this works:

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

But this gives the error "an unhandled exception of type" System.StackOverflowException "occurred in System.ServiceProcess.dll":

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

It is strange that there are no errors in the magazines at all. When there is an error, I see this in the logs, so this is not because my logs do not work. Here is my configuration file

<?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>

Here is my service interface

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

And implementation:

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

Any ideas?

+3
source share
2 answers

You cause a serializer reboot:

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 - , , 0 GetServices, . GetServiceControllerList TestClass, TestClass , (, ).

, , . , , , ; ( ). ?

+3

, ServiceController CLASS , , - , , , - , , , , stop, , , StackOverFlow.

: , . .

0

Source: https://habr.com/ru/post/1780436/


All Articles