2016-04-12 8 views
0

Ich verschiebe die meisten/alle meiner API in einem Projekt zu "Odata" von "reinem" WCF und verwende dafür einen von OWIN gehosteten Odata-Enpoint.WebApi & Odata - geeignet für die Dateiverwaltung?

Das eine Element, mit dem ich im Moment feststecke, sind Dateien. Ich habe 2 Bereiche, in denen ich eine ZIP-Datei zur Verarbeitung auf den Server hochladen muss. In einem Fall, der an eine Entität angehängt ist ("Repository" genannt) und Binärinhalte enthält, die nicht über Odata verfügbar gemacht werden (es wird nur hochgeladen). Auf der anderen Seite ist dies für eine nicht gebundene Aktion und die ZIP-Datei enthält Konfigurationsdateien, die eine Reihe von Entitäten zusammenführen/ändern.

Ist das mit OData machbar, oder sollte ich Odata dafür ignorieren und mit "Manuell konfigurierten" Standardendpunkten gehen? Ich würde es wirklich gerne in Odata wegen der offengelegten Metadaten behalten.

Bevor jemand Kommentare - Ich habe versucht, Dokumentation über Google zu finden, aber ich bekomme keine relevanten Antworten. Die Antworten, die ich bekomme, zeigen an, dass dies möglich ist, aber alle haben Codebeispiele, die auf die alte API der WCF-Ebene verweisen, während ich WebApi verwende. Die Dokumentation unter http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint geht nicht zu sehr ins Detail. Es zeigt nicht die erlaubten Typen für eine Parameterkonfiguration für eine Aktion und wie man sie konfiguriert, um die Datei via http-Post von einem Webformular (und einem Client, weil ich beides benötige) zu akzeptieren.

+0

Haben Sie dies überprüft: http://stackoverflow.com/questions/30043442/stream-support-in-odata-v4 –

+0

Denken Sie daran, ich spreche über Dateien. Das sind Byte-Arrays. Senden einer ZIP-Datei an eine Aktion – TomTom

+0

Sie sollten mehr erklären, was Sie genau machen wollen, vielleicht mit einem Codebeispiel. Ist es das wonach du suchst? http://stackoverflow.com/questions/23440933/media-resource-support-for-odata-post-in-web-api –

Antwort

3

Hier ist eine nützliche Verbindung mit der Dokumentation über Media Resource Unterstützung für OData in Web API: https://blogs.msdn.microsoft.com/mrtechnocal/2013/10/31/media-resource-support-for-odata-in-web-api/

Sie können ein wenig vereinfachen die Umsetzung in der Verbindung vorgeschlagen, aber Sie müssen Folgendes tun:

  • Erstellen Sie einen OData Media Resource Controller. Es kann einfacher sein als die im Dokument vorgeschlagene. Siehe unten.
  • Erstellen Sie eine benutzerdefinierte EntityRoutingConvention, die ordnungsgemäß an die Get-Methoden weitergeleitet wird, die die ZIP-Dateien zurückgeben (falls Sie diesen Anwendungsfall haben, müssen Sie die benutzerdefinierte Routingkonvention nicht benötigen).

Also, für den Controller, können Sie haben:

public abstract class YourMediaResourceODataController<TEntity, TKey> 
    : ODataController where TEntity : class 
{ 
} 

Und dann die reale Steuerung:

public class YourController : YourMediaResourceODataController<YourZIPObjectEntity, string> 
{ 
    // This would be the post 
    public async Task<IHttpActionResult> Post() 
    { 
     var stream = await Request.Content.ReadAsStreamAsync(); 
     // Manage the stream 
    } 

    // The get (if you want it, you will need to code the custom EntityRoutingConvention). 
    [HttpGet] 
    public HttpResponseMessage GetMediaResource(string key) 
    { 
     HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 

     var theZIPFile = yourZIPFileService.GetZIPFileByKey(key); 
     StreamContent contentResult; 
     using(var ms = new MemoryStream(theZIPFile.theByteArray) 
     { 
      contentResult = new StreamContent(ms); 
     } 

     result.Content = contentResult; 
     return result; 
    } 
} 

Sie eine Einheit YourZIPObjectEntity mit einem Strom/Byte [haben müssen ]/string-Eigenschaft, abhängig davon, wie Sie die Binärdatei verwalten. (Im Beispiel der Dokumentation ist dies die Klasse Image). Für diese Entität müssen Sie angeben, dass in der ODataConfig ein Stream enthalten ist (siehe Abschnitt "Einrichten der Web-API-Konfiguration" in der Dokumentation).

Ich denke das ist so ziemlich alles.

Dann können Sie, von Code, Posten Sie Ihre ZIP-Dateien als StreamContent:

using(var requestContent = new MemoryStream(yourByteArray)) 
using(var request = new HttpRequestMessage(HttpMethod.POST, yourPOSTUri) 
{ 
    request.Content = new StreamContent(requestContent); 
    // Set headers and send the request... 
} 

Ich hoffe, dass dies die Lösung die Sie suchen, oder zumindest eine Annäherung an sie.

-1

Für Dateien mit einfachem Binärinhalt können Sie WebApi statt OData verwenden. Es sei denn, es gibt ein Repository mit Dateien, die Sie dem Verbraucher bereitstellen möchten.

Wenn Sie ZIP-Dateien hochladen und manuell verarbeiten müssen, um Entitäten zu ändern, müssen Sie OData auch nicht verwenden. WebApi OData bietet jedoch Unterstützung für Batch-Transaktionen. Sie können diesem Tutorial folgen: https://blogs.msdn.microsoft.com/webdev/2013/11/01/introducing-batch-support-in-web-api-and-web-api-odata/

Wenn Sie große Stapel haben, anstatt zip-Dateien zu senden, verwenden Sie die gZip-Komprimierung. Hier ist eine nette Post über WebAPI gzip-Unterstützung: https://damienbod.com/2014/07/16/web-api-using-gzip-compression/

+0

I -1 dass ich es falsch finden würde, wenn das die 200 Punkte bekommen würde. Der Grund für die Verwendung von OData besteht darin, dass dies Teil einer veröffentlichten und schematisierten API ist. Der Grund für ZIP ist, das Hochladen von extern generierten mehreren Dateien im Container zu erleichtern, um die Konfigurationen vieler serverseitiger Entitäten zu aktualisieren - welche ZIP-Komprimierung würde nicht funktionieren (meistens würde es den Benutzer nicht mit einem digital signierten Archiv vorbereiten) Manifest, das dann als eine Datei hochgeladen wird). – TomTom

Verwandte Themen