2 Stimmen

Was ist der beste / flexibelste Weg, um WCF Ausgabe XHTML haben?

Was ist der beste / flexibelste Weg, um WCF Ausgabe XHTML haben? Wenn es keinen "WCF Way" (tm) für die XHTML-Ausgabe gibt - gibt es dann irgendwelche gängigen Tools dafür? Oder muss ich mein eigenes Tool entwickeln?

2voto

Szymon Rozga Punkte 17510

Die WCF befasst sich mit der Übertragung von Daten. Sie ermöglicht es Ihnen, einen Dienstvertrag für einen Client/Host einzurichten, über den Sie sprechen können. Es abstrahiert Ihren Transport, so dass Sie Ihren Dienst einfach konfigurieren können, sei es über HTTP/TCP/NamedPipes/Tibco EMS/was auch immer Sie wollen. Die Nachrichten über die Leitung selbst sind meiner Erfahrung nach standardmäßig alle in SOAP serialisiert, aber auch das ist natürlich konfigurierbar. XHTML ist die Präsentation (ja, man könnte argumentieren, dass CSS die eigentliche Präsentation und XHTML die Datendarstellung ist). Im Grunde wollen Sie Ihre Daten in einer Form zurückgeben, die unter anderem von einem Webbrowser dargestellt werden kann.

Der Grund, warum dies für mich keinen Sinn ergibt, ist, dass Sie anscheinend versuchen, einen WCF-Dienst an der Stelle zu platzieren, an die ein Webserver gehören würde.

Aber wir wollen sehen, wie es geht:

Möchten Sie, dass die WCF-Infrastruktur die Nachricht tatsächlich als XHTML über die Leitung formatiert? Wenn ja und Sie Anfragen im REST-Stil an den Dienst senden wollen, beginnen Sie mit der WCF REST Starter Kit .

Die größte Herausforderung ist die Serialisierung. Ich weiß, dass WCF in .Net 3.5 SP1 die Möglichkeit bietet, WCF mit dem JsonDataContractSerializer auszuführen, anstatt mit dem Standard DataContractSerializer, der Objekte in XML serialisiert. Sie könnten Ihren eigenen XHTMLDataContractSerializer schreiben. Das resultierende XHTML wird jedoch sehr stark Ihr eigenes sein. Hier ist ein Thema für den Anfang.

EDIT: Gerade gefunden este . Ich denke, dass dies definitiv eine Option ist. Und es scheint ziemlich einfach zu implementieren zu sein.

1voto

Tad Donaghe Punkte 6640

WCF ist eine Komponententechnologie - Sie schreiben Schnittstellen und deren Implementierungen und weisen WCF dann an, wie es mit Sicherheit, Transport usw. umgehen soll.

Die Rückgabe von XHTML aus einer WCF-Komponente wäre die gleiche wie die Rückgabe von WCF aus jeder anderen .NET-Komponente - wahrscheinlich als String. Solange Sie Daten von Ihrer Komponente in Basistypen oder über gültige Datenverträge zurückgeben können, sollten Sie keine Probleme haben.

Schauen Sie sich Kapitel 3 in Programming WCF Services von Juval Lowy an - dort geht es um Datenverträge und was Sie alles aus Ihren Komponenten ausspucken können. Vielleicht suchen Sie nach einer eleganten Möglichkeit, Daten zu deserialisieren, nachdem ein Client etwas von Ihrer Komponente zurückerhalten hat... Wenn ja, dann zeigt Lowy Ihnen, wie.

Die kurze Antwort lautet also: Geben Sie XHTML von Ihrer Komponente zurück, wie immer Sie es möchten. Soweit ich weiß, gibt es keine spezielle Möglichkeit, XHTML aus einer WCF-Komponente zu emittieren.

1voto

dthrasher Punkte 38508

Ich glaube nicht, dass es einen "offiziellen" WCF-Weg gibt, um XHTML zurückzugeben, wie von .NET 3.5 SP1. Aaron Lerch schlug im Juli 2007 vor, dass WCF ein Standard-XSLT-Stylesheet anwendet aber so etwas wurde vom WCF-Team noch nicht angenommen.

Wie bereits in anderen Antworten erwähnt, können Sie Ihre eigene XHTML-Unterstützung mit Beispielen aus dem WCF-Starterpaket oder über die rohes Programmiermodell, beschrieben von Carlos Figueira . Einige der WCF-Beispielcode die von Michele Leroux Bustamante im Rahmen ihres Projekts WCF lernen Buch sind hilfreich, wenn Sie sich entscheiden, es selbst zu machen.

Unser WCF-basierter Webdienst liefert sowohl XHTML als auch JSON und XML zurück. Ich bin mir zwar nicht sicher, ob unser Ansatz der beste ist. am besten So funktioniert es.

Unser Ansatz ist die Verwendung der DataContractSerializer um XML zu erzeugen, dann eine Complied XSLT-Transformation anzuwenden und den Ergebnisstrom zurückzugeben, der nun XHTML enthalten sollte. Hier ist eine vereinfachte Version unseres Codes:

public Stream GetItemAsHtml(string id) {
    Item obj = GetItem(objectId);
    Stream xml = GetXmlStream(obj);    
    return TransformXmlStream(xml, defaultTransform);
}        

public static Stream GetXmlStream(IXmlSerializable item) {
    MemoryStream stream = new MemoryStream();
    using (XmlWriter writer = XmlWriter.Create(stream, new XmlWriterSettings { Encoding = Encoding.UTF8 })) {
        if (writer != null) {
            DataContractSerializer dcs = new DataContractSerializer(item.GetType());
            dcs.WriteObject(writer, item);

            writer.Flush();
            writer.Close();
        }
    }
    stream.Seek(0, SeekOrigin.Begin);
    return stream;
}

public static Stream TransformXmlStream(Stream xml, string xsltFile) {
    XmlReader reader = XmlReader.Create(xml);

    XslCompiledTransform trans = new XslCompiledTransform();
    trans.Load(xsltFile);

    MemoryStream stream = new MemoryStream();
    using (XmlWriter writer = XmlWriter.Create(stream, trans.OutputSettings)) {
        if (writer != null) {
            trans.Transform(reader, writer);

            writer.Flush();
            writer.Close();
        }
    }
    stream.Seek(0, SeekOrigin.Begin);
    return stream;
}

Es erfüllt seine Aufgabe, aber ich glaube nicht, dass die Entwickler von WCF dieses Szenario erwartet haben :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X