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
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. –
@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
Wenn Sie das Ausnahmedetail bekommen können, können wir das viel schneller lösen –