Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WCF: Retrieving MethodInfo from OperationContext

Tags:

.net

wcf

Is there an elegant way to get the method that will be executed on a service instance from MessageInspector/AuthorizationPolicy/some other extension point? I could use

OperationContext.Current.IncomingMessageHeaders.Action

but I hope there's some way to do it without manually matching SOAP actions with OperationContracts.

What I'm trying to do is examine the method's attributes before it executes.

like image 324
Dmitry Ornatsky Avatar asked May 12 '09 13:05

Dmitry Ornatsky


2 Answers

It took me forever, but I did find a way that's better than finding and slogging through the entire contract:

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

And there you are. You can get the attributes or do whatever else you like.

Note: You might be tempted to try to use the OperationSelector in the DispatchRuntime. The problem I found was that in my case, at the particular stage of processing, the OperationSelector was a null reference. If you have access to this property, it's probably faster and more reliable to use than "scanning" the OperationCollection as above.

like image 117
Aaronaught Avatar answered Oct 13 '22 20:10

Aaronaught


If OperationContext.CurrentIncomingMessageHeaders.Action is null, you can do this -- it's a bit terser:

string actionName = OperationContext.Current.IncomingMessageProperties["HttpOperationName"] as string;
Type hostType = operationContext.Host.Description.ServiceType;
MethodInfo method = hostType.GetMethod(actionName);
like image 37
TimDog Avatar answered Oct 13 '22 20:10

TimDog