WCF:如何从OperationContext检索MethodInfo?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

有没有一种优雅的方式来获取将在MessageInspector / AuthorizationPolicy /某个其他扩展点的服务实例上执行的方法?我可以使用

OperationContext.Current.IncomingMessageHeaders.Action

但我希望有一些方法可以做到这一点,而无需手动将SOAP操作与OperationContracts进行匹配。

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

提问于
用户回答回答于

我确实找到了一种比在整个合同中发现和抨击更好的方式:

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更快,更可靠。

用户回答回答于

如果OperationContext.CurrentIncomingMessageHeaders.Action为null,那么可以这样做 - 这有点复杂:

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

扫码关注云+社区