tags:

views:

501

answers:

2

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 examining the method's attributes before it executes.

A: 

Castle WCF integration facility enables you to do just that (among many useful things) by using DynamicProxy proxies. Take a look here.

There's not much documentation on it, so for docs on how to use it it's best to take a look at its tests.

Krzysztof Koźmic
Seems an overkill in my case, but thanks anyway
Dmitry Ornatsky
+5  A: 

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.

Aaronaught
Saved me lots of time. Thanks.