Envoyer un message volumineux à un service ServiceStack

Je dois créer un service permettant à un client d’envoyer un message contenant une grande quantité de données et je ne suis pas sûr de savoir comment structurer l’API.

Supposons qu’un client souhaite enregistrer un nouvel object contenant un nombre variable d’objects liés. Par exemple, une commande contenant plusieurs éléments de ligne contenus dans des objects OrderDetail. Une commande peut avoir plus de 1000 objects OrderDetail associés, chacun d’eux pouvant contenir 20 à 40 Ko de données. Le client doit savoir que le service a reçu l’intégralité de la commande.

J’aimerais explorer l’utilisation de ServiceStack pour créer cela. La création d’un service très fréquenté n’est pas quelque chose que je connais très bien. Nous utiliserions généralement WCF, et il semblerait que les gens recommandent simplement d’augmenter la taille maximale des messages pour prendre en charge un message volumineux. Je ne sais pas si c’est la meilleure stratégie avec WCF, sans parler de ServiceStack.

Serait-il préférable d’envoyer chaque OrderDetail en tant que son propre message? Je serais préoccupé par le maintien de l’intégrité de l’ensemble de l’Ordre dans cette voie. Ou devrais-je simplement garder cela comme un seul gros message de 20 à 40 Mo de données? Ou devrais-je essayer de le diffuser en tant que fichier?

Utilisez le support ProtoBuf de ServiceStack – les tampons de protocole constituent le format de câblage le plus efficace et le plus compact du marché. Comme il est plus simple, essayez d’abord, avant d’examiner les options de streaming dans ServiceStack.

Options de streaming dans ServiceStack

Si vous avez identifié le service Streaming comme un avantage considérable pour votre service, voici un article sur l’ envoi d’un stream à ServiceStack qui montre comment diffuser à l’ intérieur des services ServiceStack. Il montre comment utiliser IRequiresRequestStream qui vous permet de diffuser le corps de la requête dans vos services:

Demande DTO:

[Route("/upload/{FileName}", "POST")] public class UploadPackage : IRequiresRequestStream { public System.IO.Stream RequestStream { get; set; } public ssortingng FileName { get; set; } } 

L’access au stream de corps de demande est injecté dans la propriété RequestStream du DTO de demande.