2009-05-12 14 views
17

Esiste un modo elegante per ottenere il metodo che verrà eseguito su un'istanza del servizio da MessageInspector/AuthorizationPolicy/qualche altro punto di estensione? Potrei usareWCF: recupero di MethodInfo da OperationContext

OperationContext.Current.IncomingMessageHeaders.Action

ma spero ci sia un modo per farlo senza corrispondenza manualmente azioni SOAP con OperationContracts.

Quello che sto cercando di fare è esaminare gli attributi del metodo prima che venga eseguito.

risposta

24

Mi c'è voluto per sempre, ma ho trovato un modo che è meglio che trovare e slogging attraverso l'intero contratto:

string action = operationContext.IncomingMessageHeaders.Action; 
DispatchOperation operation = 
    operationContext.EndpointDispatcher.DispatchRuntime.Operations.FirstOrDefault(o => 
     o.Action == action); 
// Insert your own error-handling here if (operation == null) 
Type hostType = operationContext.Host.Description.ServiceType; 
MethodInfo method = hostType.GetMethod(operation.Name); 

E ci siete. Puoi ottenere gli attributi o fare qualsiasi altra cosa ti piaccia.

Nota: si potrebbe essere tentati di provare a utilizzare OperationSelector in DispatchRuntime. Il problema che ho riscontrato è che nel mio caso, nella particolare fase di elaborazione, OperationSelector era un riferimento nullo. Se si ha accesso a questa proprietà, è probabilmente più veloce e più affidabile da utilizzare rispetto alla "scansione" di OperationCollection come sopra.

+0

Salvato un sacco di tempo. Grazie. – user80855

+0

DispatchOperation non contiene una definizione per FirstOrDefault? – fuzz

+1

@Fulvio: assicurati di aver aggiunto un riferimento allo spazio dei nomi a 'System.Linq'. – Aaronaught

1

La funzione di integrazione WCF di Castle consente di fare proprio questo (tra molte cose utili) usando i proxy di DynamicProxy. Dai uno sguardo allo here.

Non c'è molta documentazione su di esso, quindi per i documenti su come usarlo è meglio dare un'occhiata ai suoi test.

+1

Sembra un eccesso nel mio caso, ma grazie comunque –

13

Se OperationContext.CurrentIncomingMessageHeaders.Action è nullo, si può fare questo - è un po 'terser:

string actionName = OperationContext.Current.IncomingMessageProperties["HttpOperationName"] as string; 
Type hostType = operationContext.Host.Description.ServiceType; 
MethodInfo method = hostType.GetMethod(actionName); 
+0

Funzionerebbe con metodi sovraccaricati? – Ahuman

7

Sulla base delle risposte @Aaronaught e s' @TimDog e this SO question mi si avvicinò con una soluzione che dovrebbe funzionare sia per REST che SOAP.

+0

Lo adoro !!!! Grazie per questo piccolo gioiello. – ROFLwTIME