WCF:从OperationContext检索MethodInfo

时间:2009-05-12 13:41:23

标签: .net wcf

是否有一种优雅的方法可以从MessageInspector / AuthorizationPolicy /其他扩展点获取将在服务实例上执行的方法?我可以用

  

OperationContext.Current.IncomingMessageHeaders.Action

但我希望有一些方法可以在没有手动将SOAP操作与OperationContracts匹配的情况下完成。

我要做的是在执行之前检查方法的属性。

4 个答案:

答案 0 :(得分:25)

我花了很长时间,但我确实找到了一种比找到整个合同更好的方法:

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

你就是。你可以获得属性或做任何你喜欢的事情。

注意:您可能想尝试在DispatchRuntime中使用OperationSelector。我发现的问题是,在我的情况下,在处理的特定阶段,OperationSelector是一个空引用。如果您可以访问此属性,则使用它可能比上面“扫描”OperationCollection更快更可靠。

答案 1 :(得分:14)

如果OperationContext.CurrentIncomingMessageHeaders.Action为空,你可以这样做 - 它有点老了:

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

答案 2 :(得分:7)

基于@Aaronaught和@TimDog的答案,以及this SO question我提出了一个解决方案,应该适用于REST和SOAP

///<summary>Returns the Method info for the method (OperationContract) that is called in this WCF request.</summary>
System.Reflection.MethodInfo GetActionMethodInfo(System.ServiceModel.OperationContext operationContext ){
    string bindingName = operationContext.EndpointDispatcher.ChannelDispatcher.BindingName;
    string methodName;
    if(bindingName.Contains("WebHttpBinding")){
            //REST request
            methodName = (string) operationContext.IncomingMessageProperties["HttpOperationName"];
    }else{
            //SOAP request
            string action = operationContext.IncomingMessageHeaders.Action;
            methodName = operationContext.EndpointDispatcher.DispatchRuntime.Operations.FirstOrDefault(o =>o.Action == action).Name;
    }
    // Insert your own error-handling here if (operation == null)
    Type hostType = operationContext.Host.Description.ServiceType;
    return hostType.GetMethod(methodName);
}

答案 3 :(得分:1)

Castle WCF集成工具使您可以使用DynamicProxy代理执行此操作(在许多有用的事物中)。 看看here

关于它的文档不多,所以对于如何使用它的文档,最好看一下它的测试。