Sostituzione eredità del sistema e la creazione di nuovo codice del server utilizzando ServiceStack + serializzazione personalizzata

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

  •  13-12-2019
  •  | 
  •  

Domanda

Abbiamo un server legacy codice che vogliamo abbandonare e sviluppare nuova utilizzando ServiceStack.Clienti esistenti, non sono scritti nel .Net.Non abbiamo in programma di utilizzare .Netto sul lato client a tutti.

Dati tra client e server vengono scambiati tramite XML e JSON - al momento JSON viene utilizzato solo come un formato per la risposta (solo per alcuni dei servizi disponibili).Il formato XML è stato definito durante la prima versione della soluzione server è stato creato paio di anni fa.Non vogliamo cambiare.

Come utilizziamo ServiceStack per costruire nuove webservices RESTful, che serializzare e deserializzare i dati in un formato che è stato progettato in passato (si prega di notare, che i clienti non saranno scritti in C#/.Net).Abbiamo bisogno di controllo sia:la serializzazione & deserializzazione.È possibile utilizzare DTOs e ancora il controllo su come sono questi oggetti serializzare / deserializzare?

È stato utile?

Soluzione

Aggiunta di una logica personalizzata tramite Richiesta / Risposta Filtri

Vedere Di richiesta e di risposta dei filtri per vedere come aggiungere logica personalizzata, prima e dopo il servizio si chiama.È meglio aggiungere questi filtri tramite il Richiesta / Risposta FilterAttributes come si permette mark solo i servizi che hanno bisogno di questi filtri applicati.

Il problema con il Filtro di Richiesta è che succede dopo la deserializzazione nella richiesta DTO che è troppo tardi per aggiungere custom de-serializzazione di logica.Per ottenere intorno a questo, è possibile registrare una Richiesta personalizzata di legante il AppHost con:

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

Questo consente di accedere a IHttpRequest oggetto e consente di aggiungere custom deserializzazione logica di te.L'altra opzione è quella di raccontare ServiceStack di non tentare di deserializzare la richiesta stessa e, invece di iniettare HttpRequest InputStream in modo che si può deserializzare la richiesta te:

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

Entrambi questi esempi sono spiegati sul ServiceStack s La serializzazione e la deserializzazione pagina wiki.

Registrazione del proprio Tipo di Supporti Personalizzati

Un'altra opzione per essere in grado di tornare tipizzato DTOs ma cambiare l'uscita per alcune richieste può essere fatto con l'aggiunta di un nuovo tipo di supporti personalizzati, come spiegato nel Northwind VCard tipo di supporti Personalizzati esempio, e.g:

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));
        }
    }
}

Questa è una buona opzione se si può montare il custom XML risposte sotto un diverso Tipo di Contenuto, ad es. applicazione/v-xml così non è in conflitto con l'attuale formato XML/endpoint.Utilizzando il ContentType sopra il vostro Client HTTP, è possibile chiamare questa implementazione personalizzata con ?formato=v-xml o utilizzando l'Intestazione HTTP: Accettare:applicazione/v-xml.

Se si desidera ignorare il built-in XML ContentType è ancora possibile, ma mi consiglia di tornare a originale XmlSerializer attuazione per il SerializeStream e DeserializeStream metodi se non è uno dei formati legacy si devono sostenere.

By-pass ServiceStack ed eseguire utilizzando Personalizzati IHttpHandler

Un'altra opzione è quella di by-pass ServiceStack completamente e invece di elaborare la richiesta personalizzato, IHttpRequest gestore registrandosi nella ServiceStack config del tuo AppHost:

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

Di ritorno non null (cioèqualsiasi gestore) by-pass ServiceStack.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top