2016-07-01 5 views
0

Ich habe Klasse unten, aber nur die SayHello könnte funktionieren. Wusstest du irgendjemanden den Grund?Datenverträge und Rundschreiben in WCF

public class Service1 : IService1 
{ 
    public Department GetDepartment() 
    { 
     Department d1 = new Department() { DepartmentName = "dep1" }; 

     d1.employees = new List<Employee>() { 
       new Employee() { 
        username="user1", 
        department=d1 
       }, 
       new Employee() { 
        username="user2", 
        department=d1 
       } 
      }; 

     return d1; 
    } 

    public string SayHello(string username) 
    { 
     return "Hello " + username + "!"; 
    } 
} 

[DataContract] 
public class Department 
{ 
    [DataMember] 
    public string DepartmentName { get; set; } 
    [DataMember] 
    public List<Employee> employees { get; set; } 
} 

[DataContract] 
public class Employee 
{ 
    [DataMember] 
    public string username { set; get; } 
    [DataMember] 
    public Department department { get; set; } 
} 

Der SayHello konnte funktioniert gut, aber das GetDepartment ist fehlgeschlagen mit Fehlern unter:

* Ein Fehler ist aufgetreten, während die HTTP-Antwort auf http://localhost:8080/ empfängt. Dies könnte daran liegen, dass die Service-Endpunktbindung das HTTP-Protokoll nicht verwendet. Dies kann auch daran liegen, dass ein HTTP-Anforderungskontext vom Server abgebrochen wird (möglicherweise aufgrund des Herunterfahrens des Dienstes). Weitere Informationen finden Sie in den Serverprotokollen. Server-Stack-Trace: bei

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 IService1.GetDepartment() 
    at Service1Client.GetDepartment() 
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)* 
+0

mit zu starten, haben Sie debuggen? –

+0

Versuchen Sie, WCF-Ablaufverfolgung einzuschalten, können Sie einige Hinweise auf das Problem geben: http://weblogs.asp.net/seaniannuzzi/wcf-diagnostics-implementation-in-5-easy-steps –

+1

Es wäre auch hilfreich für Sie poste deine WCF-Bindings ... –

Antwort

1

hinzufügen IsReference=true zu Ihrem DataContract wie hier erklärt: Data Contracts and Circular References.

[DataContract(IsReference=true)] 
public class Department 
{ 
    [DataMember] 
    public string DepartmentName { get; set; } 
    [DataMember] 
    public List<Employee> employees { get; set; } 
} 

[DataContract(IsReference=true)] 
public class Employee 
{ 
    [DataMember] 
    public string username { set; get; } 

    [DataMember] 
    public Department department { get; set; } 

} 

Der Test Client eine erfolgreiche Durchführung von GetDepartment() Methode zeigt:

enter image description here

0

Einschalten WCF Tracing werden Sie wahrscheinlich alles sagen, was Sie wissen müssen. Ich würde erwarten, dass Sie wahrscheinlich etwas auf der Detailebene sehen, das Ihnen mehr Informationen zur Ausnahmebedingung gibt, sobald Sie den WCF-Trace im Trace-Viewer-Tool öffnen. Mein anfänglicher Verdacht würde sein, dass Sie möglicherweise Knotentype für die eine oder andere Klasse deklarieren müssen. Die zyklische Art der Abteilung, die Mitarbeiter und Mitarbeiter enthält, die Abteilung enthalten, kann ebenfalls ein Serialisierungsproblem verursachen. Ich kann mich nicht erinnern, ob ich das schon einmal gemacht habe.

Schauen Sie hier für weitere Informationen über KnownTypes und WCF:

https://msdn.microsoft.com/en-us/library/ms730167(v=vs.110).aspx

+0

Wenn er eine Schnittstelle oder eine abstrakte Klasse zurückgegeben hat, können KnownTypes ins Spiel kommen. Soweit ich das beurteilen kann, hat er nur 2 einfache Betone. Also ich denke nicht, dass das ein Problem ist. Aber Ihr "zyklisches" Ding ist vielleicht ein guter Baum, um zu bellen. – granadaCoder