2010-10-18 10 views
18

sto generando un servizio WCF utilizzando il modello di contratto messaggio.Come posso controllare il nome di un generico messaggio WCF contratto

ho creato un contratto di richiesta di messaggio generico in questo modo:

[MessageContract] 
public Request<T> 
{ 
    [MessageBodyMember] 
    public T Details { get; set; } 
} 

Sono abituato ad usare [DataContract(Name="Contract{0}")] per la produzione di nomi leggibili per i contratti di dati generici, ma questo approccio non sembra funzionare per me usando il messaggio contratti.

C'è un modo per ottenere lo stesso comportamento utilizzando il modello di contratto messaggio?

risposta

2

C'è un WrapperName e WrapperNamespace proprietà sull'attributo MessageContract che penso faccia la stessa cosa. Per esempio,

[MessageContract(WrapperName = "FooMessage", IsWrapped = true)] 
public class Request<T> 
{ ... } 

nota l'aggiunta della proprietà IsWrapped per indicare che il messaggio deve essere serializzato nell'elemento involucro.

+0

Ho provato questo usando WrapperName = "WrapperFor {0}", ma questo risolveva un nome piuttosto sgradevole nel WSDL (l'equivalente Unicode di {0}) e non eseguiva la traduzione che mi aspettavo. –

+0

Inoltre, sembra che si generi un'eccezione quando 'T' è anche un tipo generico e la proprietà' DataContract Name' usa segnaposti, ad es. 'GenericOf {0}'. Sarei interessato a sapere se Generic MessageContracts e DataContracts possono essere usati insieme a nomi generici sovrascritti, quindi ho messo una taglia su questa domanda –

4

Sembra un sacco di lavoro per ciò che si vuole realizzare, ma credo che si può creare un MessageInspector che vi permetterà di interagire direttamente con il codice XML.

Gli ispettori di messaggi del cliente implementano l'interfaccia IClientMessageInspector e gli ispettori di messaggi di servizio implementano l'interfaccia .

http://msdn.microsoft.com/en-us/library/aa717047.aspx

Qualsiasi servizio (dispatcher) Messaggio di ispettore deve implementare i due metodi IDispatchMessageInspectorAfterReceiveRequest e BeforeSendReply.

Il collegamento va in modo molto più dettagliato, ma una volta che avete questi implementato, si dovrebbe essere in grado di aggiungere l'ispettore al vostro web.config e si dovrebbe essere tutto a posto.

+1

Penso che tu abbia frainteso la domanda. Dato che esiste un MessageContract generico, ad es. '' Richiesta , come si ha un nome * pulita * generato nel WSDL di input che si chiudono tipi generici di '' Richiesta esempio 'Richiesta '. Il PO vorrebbe generare un nome come 'RequestOfServiceInput' nel WSDL per l'ex di tipo generico, ma sembra che la denominazione tipi generici per MessageContracts non funzionano lo stesso DataContracts come descritto qui: http://msdn.microsoft. it/it/us/library/ms731045.aspx # sectionSection4 –

+0

Potrebbe essere corretto @RussCam. In tal caso, avrebbe bisogno di usare "IWsdlExportExtension" per personalizzare/estendere il WSDL. Puoi trovare un esempio di questo qui: http: //blogs.msdn.com/b/skaufman/archive/2009/05/29/exposing-custom-wcf-headers-through-wcf-behaviors.aspx – marcellscarlett

Problemi correlati