2016-03-27 2 views
1

Ich habe einen Dienst, in der alle Methoden gut funktionieren mit einer Ausnahme berufen, die eine list<Module>WCF Test Client Fehler Fehler beim Service (beim Senden Entities Durch WCF)

Meine Module Class zurückgibt (juristische Person) ist wie folgt

[DataContract(IsReference = true)] //prevents Infinite loop 
[KnownType(typeof(SubModule))] 
public class ModuleMst 
{ 
    public ModuleMst() 
    { } 

    [Key] 
    [DataMember] 
    public int moduleid { get; set; } 

    [StringLength(100)] 
    [DataMember] 
    public string modulename { get; set; } 

    [StringLength(1)] 
    [DataMember] 
    public string status { get; set; } 

    [DataMember] 
    public string crby { get; set; } 

    [DataMember] 
    public DateTime crdt { get; set; } 

    [DataMember] 
    public string modby { get; set; } 

    [DataMember] 
    public DateTime moddt { get; set; } 

    //[DataMember] 
    public virtual List<SubModule> SubModules { get; set; } 

} 

Die Ausnahme WcfTestClient zeigt als

An error occurred while receiving the HTTP response to http://localhost:8888/ArchService/. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details. 

Server stack trace: 
    at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) 
    at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 
    at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
    at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at IArchService.GetAllModules() 
    at ArchServiceClient.GetAllModules() 

Inner Exception: 
The underlying connection was closed: An unexpected error occurred on a receive. 
    at System.Net.HttpWebRequest.GetResponse() 
    at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) 

Inner Exception: 
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. 
    at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
    at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
    at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead) 

Inner Exception: 
An existing connection was forcibly closed by the remote host 
    at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) 
    at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 

Die Konfiguration

ist
<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="LargeSettingsWS" maxBufferPoolSize="524288" maxReceivedMessageSize="6553600"> 
      <readerQuotas maxDepth="32" maxStringContentLength="100000" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="None" /> 
     </binding> 
     </wsHttpBinding> 
     <netTcpBinding> 
     <binding name="LargeSettingsTcp" maxBufferSize="524288" maxBufferPoolSize="524288" maxReceivedMessageSize="524288"> 
      <readerQuotas maxDepth="32" maxStringContentLength="100000" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="Transport" > 
      <transport clientCredentialType="Windows" /> 
      <message clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </netTcpBinding> 
     <netNamedPipeBinding> 
     <binding name="LargeSettingsPipe" maxBufferSize="524288" maxBufferPoolSize="524288" maxReceivedMessageSize="524288"> 
      <readerQuotas maxDepth="32" maxStringContentLength="100000" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <security mode="Transport" /> 
     </binding> 
     </netNamedPipeBinding> 
    </bindings> 
    <services> 
     <service name="AppService.ArchService"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://localhost:8808/ArchService" /> 
      <add baseAddress="net.pipe://localhost/ArchService/" /> 
      <add baseAddress="http://localhost:8888/ArchService/" /> 
      </baseAddresses> 
     </host> 
     <!-- Service Endpoints --> 
     <!-- Unless fully qualified, address is relative to base address supplied above --> 
     <endpoint address="" binding="wsHttpBinding" bindingConfiguration="LargeSettingsWS" contract="AppService.IArchService"> 

      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="" binding="netTcpBinding" bindingConfiguration="LargeSettingsTcp" name="netTcpEndPoint" contract="AppService.IArchService" listenUriMode="Explicit"> 
      <identity> 
      <certificateReference storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectDistinguishedName" /> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="NetSvc" binding="netNamedPipeBinding" bindingConfiguration="LargeSettingsPipe" name="netPipeEndPoint" contract="AppService.IArchService" /> 

     <endpoint address="mex" binding="mexTcpBinding" name="MetadatEndpointTcp" contract="IMetadataExchange" endpointConfiguration="" /> 
     <endpoint address="mex" binding="mexNamedPipeBinding" name="MetadatEndpointNetPipe" contract="IMetadataExchange" /> 
     <endpoint address="mex" binding="mexHttpBinding" name="MetadatEndpointHttpDual" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <dataContractSerializer maxItemsInObjectGraph="2147483646" /> 

      <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" /> 

      <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Die Ausnahme ist nicht sehr hilfreich.

Auch alle Bindungen schlagen mit dieser bestimmten Methode fehl.

Was habe ich vermisst?

EDIT

Es scheint, wie jede Methode, die eine Liste zurückzukehren versucht (wobei T eine beliebige Einheit sein kann) mit dem Fehler

Client-Konfiguration wie An existing connection was forcibly closed by the remote host

EDIT schlägt fehl folgen

<bindings> 
    <netNamedPipeBinding> 
    <binding name="netPipeEndPoint" maxBufferPoolSize="524288" maxReceivedMessageSize="6553600" > 
     <readerQuotas maxDepth="32" maxStringContentLength="100000" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="Transport" /> 
    </binding> 
    </netNamedPipeBinding> 
    <netTcpBinding> 
    <binding name="netTcpEndPoint" maxBufferPoolSize="524288" maxReceivedMessageSize="6553600"> 
     <readerQuotas maxDepth="32" maxStringContentLength="100000" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="Transport" /> 
    </binding> 
    </netTcpBinding> 

    <wsHttpBinding> 
    <binding name="WSHttpBinding_IArchService" maxBufferPoolSize="524288" maxReceivedMessageSize="6553600"> 
     <readerQuotas maxDepth="32" maxStringContentLength="100000" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None" /> 
    </binding> 
    </wsHttpBinding> 
</bindings> 




<client> 
    <endpoint address="http://localhost:8888/ArchService/" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IArchService" contract="ServiceReference.IArchService" name="WSHttpBinding_IArchService"> 
    <identity> 
     <dns value="localhost" /> 
    </identity> 
    </endpoint> 
    <endpoint address="net.tcp://localhost:8808/ArchService" binding="netTcpBinding" bindingConfiguration="netTcpEndPoint" contract="ServiceReference.IArchService" name="netTcpEndPoint"> 
    <identity> 
     <dns value="localhost" /> 
    </identity> 
    </endpoint> 
    <endpoint address="net.pipe://localhost/ArchService/NetSvc" binding="netNamedPipeBinding" bindingConfiguration="netPipeEndPoint" contract="ServiceReference.IArchService" name="netPipeEndPoint"> 
    <identity> 
     <userPrincipalName value="SYS1\deb" /> 
    </identity> 
    </endpoint> 
</client> 

EDIT 3

Meine anderen zugehörigen Entitätsklassen verursachen den Fehler. Ich weiß nicht warum. Hier sind sie

[Table("SubModuleMst", Schema = "setp")] 
[DataContract(IsReference = true)] //prevents Infinite loop 
[KnownType(typeof(ModuleMst))] 
[KnownType(typeof(List<PageMst>))] 

public class SubModule 
{ 
    public SubModule() 
    { } 

    #region SubModule 

    [Key] 
    [DataMember] 
    public int submoduleid { get; set; } 
    [DataMember] 
    public int moduleid { get; set; } 
    [DataMember] 
    [StringLength(100)] 
    public string submodulename { get; set; } 
    [DataMember] 
    public int orderno { get; set; } 
    [DataMember] 
    [StringLength(1)] 
    public string status { get; set; } 
    [DataMember] 
    public string crby { get; set; } 
    [DataMember] 
    public DateTime crdt { get; set; } 
    [DataMember] 
    public string modby { get; set; } 
    [DataMember] 
    public DateTime moddt { get; set; } 
    #endregion 

    [DataMember] 
    public virtual ModuleMst Module { get; set; } 
    [DataMember] 
    public virtual List<PageMst> Pages { get; set; } 
} 

[Table("PageMst", Schema = "setp")] 
[DataContract(IsReference = true)] //prevents Infinite loop 
[KnownType(typeof(SubModule))] 
public class PageMst 
{ 
    public PageMst() 
    { } 

    #region PageMst 

    [Key] 
    [DataMember] 
    public int pageid { get; set; } 
    [DataMember] 
    [Required] 
    [ForeignKey("SubModule")] 
    public int submoduleid { get; set; } 
    [DataMember] 
    [StringLength(1000)] 
    [Required] 
    public string pagename { get; set; } 
    [DataMember] 
    [StringLength(1000)] 
    public string pageurl { get; set; } 
    [DataMember] 
    public int orderno { get; set; } 
    [DataMember] 
    [StringLength(1)] 
    public string menuitm { get; set; } 
    [DataMember] 
    public int rptparentid { get; set; } 
    [DataMember] 
    [StringLength(1)] 
    public string alertflag { get; set; } 
    [DataMember] 
    [StringLength(1)] 
    public string status { get; set; } 
    [DataMember] 
    public string crby { get; set; } 
    [DataMember] 
    public DateTime crdt { get; set; } 
    [DataMember] 
    public string modby { get; set; } 
    [DataMember] 
    public DateTime moddt { get; set; } 
    [DataMember] 
    [StringLength(200)] 
    public string paramids { get; set; } 
    [DataMember] 
    [StringLength(500)] 
    public string repurl { get; set; } 
    #endregion 

    [DataMember] 
    public virtual SubModule SubModule { get; set; } 
} 

EDIT 4

Jetzt bin ich bestätigt, dass der Fehler auf aufgrund der Proxy von EF erstellt sind nicht serialisierbar als solche Nach diesem MSDN Artikel https://msdn.microsoft.com/en-us/library/ee705457(v=vs.100).aspx Und auch nach this SO Article

+0

WCF/SOAP hat kein Problem mit Listen. Ich gehe davon aus, dass dies auf einen bestimmten Teil des DataContract zurückzuführen ist. Ich würde empfehlen, wenn möglich dem Dienst beizutreten, um die Ausnahmedetails auf der Dienstseite zu sehen. –

+0

@Glen Thomas Das Lustige ist, dass ich ein Objekt des gleichen Typs zurückgeben kann. Das Problem passiert nur mit der Liste des genannten Typs !! – Deb

+0

Wenn Sie das Ausnahmedetail bekommen können, können wir das viel schneller lösen –

Antwort

1

Da niemand meine Frage beantwortet hat, poste ich hier, was ich getan habe, damit es funktioniert in der Hoffnung, dass es jemandem anderen hilft Ike mich.

Es stellt sich heraus, dass der Proxy-Typ POCO nicht direkt von der Windows Communication Foundation (WCF) as per this MSDN Article serialisiert oder deserialisiert werden kann.

Dies ist, weil EF einen Wrapper rund um die POCO für Entity Tracking erstellt, die nicht die gleiche Klasse wie die POCO-Klasse ist und WCF kann daher nicht serialisieren, da es nur bekannte Typen serialisieren kann.

Um Entitäten Serializable bis WCF zu machen, muss einer der folgenden Schritte ausgeführt werden.

  1. Proxy-Erstellung in der DBContext Konfiguration deaktivieren.(See this)
  2. Verwenden .AsNoTracking() (See this SO Post)
  3. Verwenden Sie ein Attribut Ihre Service-Methoden dekorieren, die Entitäten mit ProxyDataContractResolver (siehe oben MSDN-Artikel für einen Lösungsweg) zurückzukehren

ich den dritten Ansatz verwendet und meinen Service gibt POCO Entities schließlich zurück. Der Code im Artikel ist selbsterklärend und wird hier nicht veröffentlicht.

Und schließlich denke ich DTOs sind der beste Weg zu gehen, soweit EF berücksichtigt wird.