WCF - nicht jede Klasse wird exportiert
-
Hallo,
ich habe meinen WebService in einem WebService-Project erzeugt und eine ServiceReference in einem anderen Projekt auf den Development-Server gelegt.
Ich kann von dort aus auch auf meinen Service, samt seiner Methoden, zugreifen. Ich habe jedoch mehrere Exception-Klassen als DataContract deklariert, jedoch wird mir nur eine einzige in der ServiceReference auch angezeigt.
Welchen Grund kann es dafür geben, dass eine spezielle Klasse nicht mit exportiert wird, obwohl sie sich im gleichen Namespace wie die andere befindet und als DataContract gekennzeichnet ist.
-
Guckst du hier.
-
FreakY<4Cpp schrieb:
Guckst du hier.
Sehr witzig. Laut meinen Informationen die ich von MSDN und aus Büchern habe, reicht es die entsprechenden Klassen als DataContract zu kennzeichnen, damit sie serialisiert werden können.
Dies habe ich getan. Ich denke mal die Frage ist daher berechtigt und ich finde auch keine schlüssige Dokumentation, die dieses "Problem" beschreibt.
-
FrEEzE2046 schrieb:
Welchen Grund kann es dafür geben, dass eine spezielle Klasse nicht mit exportiert wird, obwohl sie sich im gleichen Namespace wie die andere befindet und als DataContract gekennzeichnet ist.
Ich rate mal ins Blaue hinein, da ich noch nie mit WCF programmiert habe, und die Lektüre zu dem Thema schon etwas zurück liegt: Muss die Klasse nicht auch in einer Konfigurationsdatei (XAML) angegeben werden, bzw. Ist die Klasse public?
-
Also hier mal die (noch spärlichen) Deklarationen meiner beiden Exception-Klassen:
// SQLServerFault.cs using System.Runtime.Serialization; namespace ProjectName.WebService.Exception { [DataContract] public class SQLServerFault { } }
// WebServiceFault.cs using System; using System.Runtime.Serialization; namespace ProjectName.WebService.Exception { [DataContract][Flags] public enum WebServiceErrorCode { [EnumMember] InternalError = 1, [EnumMember] ConfigFileNotFound = 2, [EnumMember] BrokenConfigFile = 4 } [DataContract] public class WebServiceFault { [DataMember] public string Message; [DataMember] public WebServiceErrorCode ErrorCode; } }
Während mir SQLServerFault in der ServiceReference angezeigt wird, ist dies bei WebServiceFault nicht der Fall. Ich habe nichts in irgendeine Config-XAML geschrieben. Das macht das System normalerweiße selbst anhand der IDE-Anweisungen (DataContract etc.).
-
Also ich hab die Erfahrung gemacht wenn du diese Klasse nirgends verwendest, zum Beispiel in dem eigentlichen Service dann wird die auch nicht mit runter publiziert in den ServiceReferenzen. Kann also sein das es damit zusammenhängt, ist aber nur eine Vermutung da ich das selbst bei Silverlight Projekten erlebt habe.
-
Danke für deine Antwort. Das ist ja genau das merkwürdige; wenn es so wäre, wie du sagst könnte ich es ja noch verstehen, aber es ist genau andersrum!
Momentan verwende ich SQLServerFault NICHT im Service und WebServiceFault schon.
[ServiceContract] public interface IService { [FaultContract(typeof(WebServiceFault))] bool ConfigFileExists(); } public class Service : IService { public bool ConfigFileExists() { if (!File.Exists(_ConfigFilePath)) { throw new FaultException<WebServiceFault> ( new WebServiceFault { Message = "Config.xml konnte nicht an erwarteter Position (" + _ConfigFilePath + ") gefunden werden", ErrorCode = WebServiceErrorCode.ConfigFileNotFound } ); } else return true; } /* private bool ConfigFileExists() */ /* -------------------------------------------------------------------------------------------- */ }
-
Ganz dumme Frage, hast du das Serviceprojekt neugebuildet und die Service Reference in dem anderen Projekt aktualisiert das er sich neue Referenzen ziehen kann?
Ansonsten ist das Verhalten eher komisch.
-
Firefighter schrieb:
Ganz dumme Frage, hast du das Serviceprojekt neugebuildet und die Service Reference in dem anderen Projekt aktualisiert das er sich neue Referenzen ziehen kann?
Ansonsten ist das Verhalten eher komisch.Ja, klar habe ich das
Ich hab die ServiceReference sogar mehrfach entfernt und komplett neugeholt. Er aktualisiert mir auch neue Methoden oder Änderungen an bestehenden, aber er nimmt keine Klasse mehr mit.
-
Ich hab den Fehler gefunden. Ich habe diese Exception in einer Methode ausgelöst, welche ich NICHT als OperationContract gekennzeichnet hatte.
Ich rufe diese jedoch im Konstruktor des Services. Wie kann ich dem System mitteilen, dass der Konstruktor eine solche Exception werfen könnte? Im Interface kann ich das ja schlecht definieren.