DecaTec

Home-Server | Linux | Nextcloud | Raspberry Pi | Programmierung | Fotografie

Portable WebDAV Library

Portable WebDAV Library LogoVor kurzem habe ich damit begonnen, mich mit der Entwicklung von Apps für Windows Phone zu beschäftigen. Dabei habe ich einige Ideen, die jedoch einen Up-/Download zu meiner eigenen Cloud (ownCloud) benötigen. Hierbei ist WebDAV das Mittel der Wahl, ein offener Standard zur Bereitstellung von Daten im Internet.

Dieser Standard – definiert in RFC 4918 (HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)) – ist nicht neu, jedoch habe ich keine bereits vorhandene Library gefunden, die ich in meinen eigenen (mobilen) Projekten verwenden kann:

  • Entweder sind die vorhandenen Libraries nicht vollständig kompatibel zur aktuellen WebDAV-Spezifikation (RFC 4918) – besonders der WebDAV-Locking-Mechanismus ist bei vielen Klassenbibliotheken nicht implementiert.
  • Oder die Libraries sind nicht für die Entwicklung auf Mobilgeräten geeignet, da diese nicht als Portable Class Library implementiert sind.

Aus diesem Grund habe ich eine eigene Library erstellt und als Open Source auf CodePlex veröffentlicht.

Anforderungen

Die Anforderungen an eine portable WebDAV Library sahen dabei wie folgt aus:

  • Kompatibilität: Volle Kompatibilität zu RFC 4918 (HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)).
  • Portabilität: Einsatz sowohl in Desktop- als auch in mobilen Umgebungen (Windows) – Implementierung als Portable Class Library.
  • Einfache Bedienung/Einbindung in eigene Projekte: Zur einfachen Verwendung bietet die Portable WebDAV Library zwei Abstraktions-Level:
    • Zum einen die Klasse WebDavSession, die für viele Belange ausreichen sollte und die direkte Kommunikation mit WebDAV Servern sehr vereinfacht.
    • Zum anderen – für einen direkteren Zugriff auf WebDAV-Resourcen – gibt es die Klasse WebDavClient. Diese ist abgeleitet von der Klasse System.Net.Http.HttpClient und erweitert diese um spezielle WebDAV-Methoden. Der Verwender sollte allerdings mit der WebDAV-Spezifikation vertraut sein.
  • Fast and fluid: Alle Operationen, die u.U. länger dauern, sind als asynchrone Methoden implementiert. Besonders wichtig beim Einsatz auf Mobilgeräten.
  • WebDAV Object Model: Die Kommunikation läuft bei WebDAV hauptsächlich über XML-Strings ab, die in den Requests/Responses gesendet werden. Da es mühselig ist, diese Strings selbst zu erzeugen und dann wieder zu Parsen, bietet die Portable WebDAV Library das sog. WebDAV Object Model: Über WebDAV-spezifische Objekte ist es möglich, die Kommunikation mit WebDAV Servern erheblich zu vereinfachen.
  • Dokumentation: Last but not least sollte das Projekt gut dokumentiert sein, um die Verwendung möglichst einfach zu gestalten.

Portable WebDAV Library auf CodePlex

Eine erste Version der Portable WebDAV Library ist nun fertig gestellt (Version 0.1.0.0). Da es evtl. andere Entwickler gibt, die auf der Suche nach einer WebDAV-Klassenbibliothek mit ähnlichen Anforderungen sind, habe ich diese als Open Source auf CodePlex veröffentlicht:

Portable WebDAV Library auf CodePlex

Die Entwickler-Dokumentation ist im Binary-Download als chm-Datei enthalten oder kann alternativ auch online betrachtet werden:

Portable WebDAV Library Online-Dokumentation (UWP)

Portable WebDAV Library Online-Dokumentation (NetFx)

Für Beispielcode verweise ich an dieser Stelle einfach auf das Projekt auf CodePlex und die Online-Hilfe, hier sind einige Code-Beispiele aufgeführt, die einen schnellen Einstieg in die Verwendung dieser Library ermöglichen.

Status

Die Portable WebDAV Library wurde (mittels Unit-Tests bzw. Unit-Integration-Tests) gegen IIS und ownCloud (sabre/dav) getestet und sollte auch mit anderen WebDAV-Servern kompatibel sein.

Allerdings sind Fehler und Ungereimtheiten natürlich nicht ganz ausgeschlossen. Für entsprechende Hinweise bin ich daher dankbar.

Auch wenn jemand noch Verbesserungsvorschläge für die aktive Weiterentwicklung dieser Klassenbibliothek hat, kann sich gerne bei mit melden (über CodePlex direkt, per E-Mail, oder auch per Kommentar zu diesem Beitrag).

Links

, , , , , , ,

Kommentare: 8

  • Daniel Steiner sagt:

    Hallo, ich wollte deine Library in einer Windows Phone App verwenden, komme jedoch nicht wirklich weiter. Sowohl bei der Verwendung der WebDavSession als auch beim Client bekomme ich auf WP keine Datan, in einer C# Konsolenanwendung geht alles problemlos.

    Ne Ahnung woran das liegen könnte?

    • Daniel Steiner sagt:

      Bin nun draufgekommen, dass ich eine InvalidOperationException bekomme die bisher immer geschluckt wurde. (There is an error in XML document (0, 0))

      • Jan sagt:

        Hallo Daniel,

        welchen Webserver mit welcher WebDAV-Komponente versuchst du denn anzusprechen?
        Ansonsten: An welcher Stelle tritt bei dir die InvalidOperationException genau auf?

        • Daniel Steiner sagt:

          Ist ein CentOS 6 Stable (latest) mit Apache als Webserver. Der WebDAV Server ist ein OwnCloud 7.0.3.

          Die Exception tritt bei „var items = await client.ListAsync(„/“);“ auf, wenn ich das ganze synchron aufrufe, hängt der UI Thread (mit ausnahme der AppBar). an der selben Stelle. (nur halt eben ohne await).
          Ich hab mir mal testhalber den Code von dir in das Projekt gehaut und referenziert, leider bringt mich das auch nicht wirklich weiter.

        • Daniel Steiner sagt:

          Nachtrag: wenn ich mit dem WebDavClient arbeite, bekomme ich einen haufen Fehler:
          A first chance exception of type ‚System.ArgumentException‘ occurred in mscorlib.ni.dll
          A first chance exception of type ‚System.ArgumentException‘ occurred in mscorlib.ni.dll
          A first chance exception of type ‚System.IO.FileNotFoundException‘ occurred in mscorlib.ni.dll
          A first chance exception of type ‚System.Net.WebException‘ occurred in System.Net.ni.DLL
          The thread 0xe48 has exited with code 0 (0x0).
          ‚OwnCloud.WindowsPhone.exe‘ (CoreCLR: .): Loaded ‚Microsoft.GeneratedCode‘.
          ‚OwnCloud.WindowsPhone.exe‘ (CoreCLR: .): Loaded ‚C:\windows\system32\en-US\System.Xml.debug.resources.DLL‘. Module was built without symbols.
          A first chance exception of type ‚System.Xml.XmlException‘ occurred in SYSTEM.XML.NI.DLL
          A first chance exception of type ‚System.Reflection.TargetInvocationException‘ occurred in mscorlib.ni.dll
          A first chance exception of type ‚System.IO.FileNotFoundException‘ occurred in mscorlib.ni.dll
          A first chance exception of type ‚System.InvalidOperationException‘ occurred in SYSTEM.XML.SERIALIZATION.NI.DLL
          A first chance exception of type ‚System.AggregateException‘ occurred in mscorlib.ni.dll

          • Jan sagt:

            Hi!

            Ich bin gerade dabei, (WindowsPhone-) UnitTests für die Library zu schreiben. Bei mir (auch ownCloud, also sabre/dav) funktioniert bisher alles einwandfrei.

            Wegen den ganzen Exceptions bzgl. *.NI.dll. Das tritt unter WindowsPhone häufiger auf.
            Probier daher mal folgendes: Im VisualStudio unter „Debug“ > „Exceptions…“. Hier den Haken bei „Common Language Runtime Exceptions“ in der Spalte „Thrown“ entfernen.

            Dann sollten die ganzen Exceptions, die das System „nicht weiter stören“ nicht geworfen werden und du bekommst nur noch die Exceptions, auf die du reagieren musst.

            Edit: Du könntest mir auch dein bisheriges Project auch per Mail (jr@decatec.de) schicken. Vielleicht fällt mir ja noch etwas auf. Bitte vorher alle Links/Passwörter entfernen!

          • Daniel Steiner sagt:

            Hab jetzt mal schnell wegen den Exceptions nachgeschaut, Bei mir sind alle arten von exceptions abgeschaltet.
            Ich hab dir schnell den gesamten codepfad in ein neues projekt kopiert und per mail geschickt.

  • Jan sagt:

    Habe ein Update der Library auf CodePlex veröffentlicht:
    http://portablewebdavlibrary.codeplex.com/releases/view/611813

    Damit sollte der Bug in der WebDavSession (falsches Handling von URLs) behoben sein. Außerdem werden nun aussagekräftigere Exceptions geworfen, damit sollte Analyse von Fehlern leichter fallen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.