2012-06-02 12 views
7

Sto cercando di imparare un po 'di WCF da solo. Ho conoscenza di C#/ASP.net ma sono nuovo di WCF. Sto usando Visual Studio 2010 per sviluppare alcune app mentre imparo.WCF: consente al client di scegliere il formato di ritorno

Ho sviluppato un piccolo servizio Web che funge da backend per un TODO/Task manager in cui un utente può creare/eliminare/modificare nuovi eventi; è tutto molto semplice ed essenziale.

Le mie domande sono le seguenti:

  1. Esiste un modo per lasciare che il cliente a scegliere il formato di ritorno che vuole (ad esempio XML/JSON/RDF) senza scrivere nuovi contratti di gestione?
  2. Come posso visualizzare sul client il messaggio esatto che il servizio Web invia a me (in modo che possa verificare se è ad esempio una rappresentazione JSON o un messaggio XML).

risposta

3

Il modo in cui i browser Web scelgono i formati di risposta dai siti Web è tramite content negotiation, in particolare tramite le intestazioni HTTP Accept e Content-Type.

Ad esempio, se il cliente richiede una risposta in formato JSON, avrebbe inviato al server una richiesta HTTP che sembra qualcosa di simile:

GET /resource HTTP/1.0 
User-Agent: YourClient 1.0 
Accept: application/json 

Il server, a sua volta, avrebbe risposto con un pacchetto HTTP in questo modo:

HTTP/1.0 200 OK 
Content-Type: application/json 
Content-Length: 20 

{ "type" : "json" } 

WCF è, purtroppo, non in grado di gestire la negoziazione dei contenuti, fuori dalla scatola, ma c'è una bella libreria di terze parti che consente senza troppo lavoro chiamato WcfRestContrib. Il loro documentation descrive i passaggi (abbastanza semplici) da eseguire per farlo funzionare. Per riassumere, è necessario

  1. decorare la vostra classe di servizio in base ai tipi di contenuto che si desidera supportare,
  2. decorare i metodi che si desidera essere contenuti trattativa-aware, e
  3. cambio una serializzabile oggetto aziendale da quel metodo.

Per quanto riguarda la seconda domanda, Fiddler è una scelta eccellente per testare sia il client che il server.

+0

Darò a WcfRestContrib uno sguardo più tardi oggi e tornerò da te. – Morat

1

La mia esperienza è che WCF non è eccezionale in questo settore. MVC è un grande miglioramento con il suo concetto di "Risultati di azione" che ti consente di restituire quello che vuoi per un dato endpoint. (E presumibilmente il nuovo "Web API" sarà un matrimonio di WCF e le caratteristiche MVC.)

Detto questo, il modo WCF più semplice per lasciare che il cliente a scegliere il formato di risposta, è quello di specificare un Stream Tipo ritorno, e serializzare il risultato in base al requisito.

Quindi dichiarare il metodo in questo modo e utilizzare il serializzatore (i) di scelta per JSON e XML.

[OperationBehavior] 
[WebGet()] 
public Stream SomeOperation(string format) 
{ 
    string test = "Hello world"; 
    string encodedResult; 
    if (format.ToLower() == "xml") { 
     // serialize as XML (eg, XML Serializer) 
     HttpContext.Current.Response.ContentType = "text/xml"; 
    } 
    else if (format.ToLower() == "json") { 
     // serialize as JSON (eg, Newtonsoft Json) 
     HttpContext.Current.Response.ContentType = "application/json"; 
    } 
    var ms = new MemoryStream(Encoding.UTF8.GetBytes(encodedResults)); 
    return ms; 
} 

Per la seconda domanda, mi consiglia di utilizzare uno strumento gratuito come Fiddler per ispezionare la risposta HTTP grezzo dal server.

+0

Grazie per menzionare Fiddler. Lo testeremo. Non ho davvero capito cosa intendevi con "specificare un tipo di restituzione stringa e serializzare il risultato in base al requisito"? Vuoi dire rendere tutti i miei contratti restituire stringa e gestire la serializzazione da solo o? – Morat

+0

@Morat si, questo è quello che intendevo. Aggiornerò la risposta con un po 'più di dettaglio – McGarnagle

+0

Grazie per aver aggiunto un esempio di codice; è più chiaro ora. Ma non codifica tutto nel modo in cui mi suggerisci di impedirmi di sfruttare tutti i tipi di dati personalizzati forniti da un proxy? Dovrei anche analizzare la risposta dal WebService invece di avere gli oggetti pronti fuori dalla scatola? – Morat

1

Invece di utilizzare un servizio basato su SOAP, è possibile provare il modello REST. Il nuovo modo di creare servizi REST o HTTP utilizzando tecnologie MS sta usando Web API che sarà disponibile ASP.NET MVC 4.

Vantaggi di REST:

  1. negoziazione del contenuto - Il cliente può specificare la dati- digitare (JSON, XML ..) tramite il parametro Accept-Type nell'intestazione Request.

  2. metodi utilizzano HTTP esplicitamente

  3. struttura di directory simile a URI

e più ..

9

Quando si crea un servizio REST con WCF, è supportato negoziazione del contenuto.

È sufficiente impostare automaticFormatSelectionEnabled su true sull'endpoint.

Consulta anche: WCF Web HTTP Formatting

+0

Ho appena trovato il collegamento alla documentazione Microsoft sopra riportato dopo due ore dolorose di ricerca. Questa risposta ha bisogno di più amore e attenzione mentre supera tutti gli altri. – crush

Problemi correlati