Remplacement du système hérité et créant un nouveau code serveur à l'aide de ServiceStack + Serialization personnalisée

StackOverflow https://stackoverflow.com//questions/9683707

  •  13-12-2019
  •  | 
  •  

Question

Nous avons un code de serveur hérité que nous voulons abandonner et développer une nouvelle utilisation à l'aide de ServiceStack.Les clients existants ne sont pas écrits dans .NET.Nous ne prévoyons pas d'utiliser .NET sur le côté du client du tout.

Les données entre client et serveur sont échangées à l'aide de XML et JSON - au moment où JSON n'est utilisé que comme format de retour pour la réponse (juste pour certains des services disponibles).Le format XML a été défini lorsque la première version de la solution de serveur a été créée il y a quelques années.Nous ne voulons pas le changer.

Comment utilisons-nous le serviceStack pour construire de nouveaux webservices reposants, qui sertialiseront et désérialiseront des données à un format conçu dans le passé (veuillez noter que les clients ne seront pas écrits en C # /. Net).Nous devons contol à la fois: sérialisation et désérialisation.Est-ce que cela est possible d'utiliser des DTO et de contrôler toujours comment ces objets sont sérialisés / désérialisés?

Était-ce utile?

La solution

Ajout de la logique personnalisée via Demande / Response Filtres

voir Filtres de demande et de réponse pour voir comment ajouter Logique personnalisée avant et après que votre service soit appelé. Il est préférable d'ajouter ces filtres via le filtre de la requête / réponseAttributes car il vous permet < Strong> Mark Seuls les services qui ont besoin de ces filtres appliqués.

Le problème avec le filtre de demande est que cela se produit après la désérialisation dans la demande DTO qui est trop tard pour ajouter une logique de dés-sérialisation personnalisée. Pour vous déplacer, vous pouvez enregistrer un classeur de demande personnalisé dans votre APPhost avec:

base.RegisterRequestBinder<MyRequest>(httpReq => ... requestDto);

Cela vous donne accès à l'objet IHTTPRequest et vous permet d'ajouter vous-même la logique de désérialisation personnalisée. L'autre option consiste à dire au serviceCetack de ne pas tenter de désérialiser la demande elle-même et d'injecter le HTTPRequest Inpurstream afin que vous puissiez désérialiser vous-même la demande:

public class Hello : IRequiresRequestStream {
    Stream RequestStream { get; set; }
}

Ces deux exemples sont expliqués sur le serviceStack's sérialisation et désémarification page wiki .

Enregistrement de votre propre type de support personnalisé

Une autre option permettant de retourner des DTO de type fort, mais modifier la sortie de certaines demandes peut être effectuée en ajoutant un nouveau type de support personnalisé, comme expliqué dans le Northwind VCART Type de support personnalisé Exemple , par exemple:

public static void Register(IAppHost appHost)
{
    appHost.ContentTypeFilters.Register( "text/x-vcard", SerializeToStream,  DeserializeFromStream);
}

...    

public static void SerializeToStream(IRequestContext requestContext, object response, Stream stream)
{
    var customerDetailsResponse = response as CustomerDetailsResponse;
    using (var sw = new StreamWriter(stream))
    {
        if (customerDetailsResponse != null)
        {
            WriteCustomer(sw, customerDetailsResponse.Customer);
        }
        var customers = response as CustomersResponse;
        if (customers != null)
        {
            customers.Customers.ForEach(x => WriteCustomer(sw, x));
        }
    }
}

Ceci est une bonne option si vous pouvez monter les réponses XML personnalisées sous un type de contenu différent, par ex. Application / V-XML Donc, il ne contient pas de conflit avec le format XML existant / point final. Utilisation du contenu de contenu au-dessus de votre client HTTP peut appeler cette implémentation personnalisée avec ? Format= V-XML ou à l'aide de l'en-tête HTTP: Accepter: Application / V-XML .

Si vous souhaitez remplacer le contenu XML intégré, vous pouvez toujours, mais je vous recommande de revenir à la mise en œuvre de XMLSerializer d'origine pour les méthodes Serializestream et Desérializestream si ce n'est pas l'un des formats hérités que vous devez prendre en charge.

ServiceCettack By-Pass et exécutez à l'aide de votre propre personnalisation IHTTTPHANDLER

Une autre option consiste à traiter complètement et à traiter complètement la demande dans votre propre gestionnaire personnalisé IHTTPRequest en l'enregistrant dans la configuration de ServiceStack dans votre APPHOST:

 SetConfig(new EndpointHostConfig { 
    RawHttpHandlers = {
      httpReq => return IsLegacyMatch(httpReq) ? new LegacyXmlHandler() : null 
    }
 });

retour non null (c'est-à-dire n'importe quel gestionnaire) par-passe servicestack.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top