web-service kann nicht serialisieren, die eine Schnittstelle
Habe ich eine Schnittstelle wie folgt:
public interface IDocument : ISerializable
{
Boolean HasBeenUploaded { get; set; }
void ISerializable.GetObjectData(SerializationInfo, StreamingContext) { }
}
Gibt es drei Dokumente, die Erben von all dem serialisieren gut. Aber beim erstellen einer einfachen web-service, der nichts tut, wo Sie hochgeladen werden kann...
public class DCService : System.Web.Services.WebService
{
[WebMethod]
public Boolean ReceiveDocument(IDocument document)
{
DBIO io = new DBIO();
return io.InsertIntoDB(document); //does nothing; just returns true
}
}
Bekomme ich diese, wenn Sie versuchen, um es auszuführen: "Nicht serialisieren interface IDocument"
Ich bin mir nicht ganz sicher, warum das ein problem sein. Ich weiß, dass einige Leute hatten Probleme, weil Sie nicht wollen, zu zwingen, Unterklassen zu implementieren benutzerdefinierter Serialisierung mir aber nicht, und bis zu diesem Punkt war es erfolgreich.
edit> Wenn ich die einzelnen webmethods akzeptieren, dass die Objekte, die das interface implementieren, es funktioniert gut, aber das schwächt den Vertrag zwischen der client - /server - (und untergräbt den Zweck, die Schnittstelle in den ersten Platz)
- Hi wollte mal Fragen was Ihr am Ende machen mit diesem problem. Ich habe ein ähnliches Problem, wo durch ich muss ein array zurückgeben, der ein interface-Objekt via webservices.
- Ich habe eine Reihe von Dingen: ich landete mit einer konkreten Klasse, anstatt einer Schnittstelle, die funktioniert, aber von dort aus wechselte ich auf ein WCF service. Schließlich dieser ganze Teil des Projekt 'auf Eis gelegt' (Lesen, auf unbestimmte Zeit) für "dringendere Angelegenheiten'
- Ich habe versucht zu zwingen, serialisieren arbeiten in einen asmx-Webdienst, einschließlich der Schnittstellen in webmethod Signatur aber konnte einfach nicht bekommen es funktioniert, auch mit allen notwendigen XmlInclude Attribute geben. Mein Fazit ist, dass es entweder nicht geht oder ist so teuflisch schwierig und niemand stört.
- möglich, Duplikat der Warum kann ich nicht setzen eine Schnittstelle in einem .NET-asmx-web-service?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möglicherweise müssen Sie verwenden ein XmlInclude-Attribut, um Ihre web-Methode. Ein Beispiel finden Sie hier. Wir haben in dieser Ausgabe vor und haben XmlInclude Attribute, die sowohl unsere web-service-proxy-Klasse auf dem client und auf bestimmte web-service-Methoden.
Asp.net muss in der Lage sein müssen zu sagen, welche bestimmte Klasse wird instanziiert, wenn der Aufruf der Methode. Dies ist der Grund, warum es funktioniert, wenn die Definition mehrere Methoden mit den spezifischen Klassen, D. H. der Anruf wird Ihnen sagen, welche Klasse zu verwenden.
Überlegen Sie, ob Sie möchten, dass der client zu senden, die den gleichen Satz von Informationen für jedes Dokument, oder wenn Sie wirklich brauchen, um in der Lage zu senden unterschiedliche Informationen für unterschiedliche Dokumente. Mit der später, müssen Sie den client, um zu wissen, die Klassen implementieren, die IDocument, und Sie tun dies mit dem XmlInclude (wie firedfly gepostet).
Wenn Sie stattdessen möchten, schicken immer die gleiche info und jetzt nicht über die spezifischen Klassen, eine Klasse definieren mit dieser info und das ist, was Sie erhalten in den Methoden. Wenn Sie brauchen, um mit zu spielen IDocument in den rest der service-code haben, entsprechende Logik in den Dienst, bekommt man ein IDocument-Instanz unter Verwendung der empfangenen Daten.
+1 für firedfly, es sollte jedoch beachtet werden, dass das XmlInclude-Attribut kann angehängt werden, um die web-service - Klasse anstatt zu jeder Methode (oder base geben, die auch eine option). Ich habe es getestet und der code wird generiert, gut, halten die vererbungsstruktur.
Ich habe diese aus den Kommentaren von den gleichen blog bezeichnet er, so gebührt dem OP.
BTW, dies ist kein Kommentar zu firedfly post, weil ich nicht genug Ruf zu Kommentar