获取创建WCF服务实例的调用者(或方法)的名称?

时间:2009-07-14 11:45:42

标签: c# wcf

我有一个私有构造函数的WCF服务。如果我没错,那么构造函数在WCF中必须是无参数的,而我需要的参数是调用者的名字(或调用者的方法名),所以我可以指定一些只读字段。

有没有办法可以获取调用者的名字 - 或调用它的方法?我正在玩OperationContext.Current,但没有任何运气。

4 个答案:

答案 0 :(得分:3)

出于性能原因,我不建议访问堆栈跟踪。

如果您使用默认的ServiceHostFactory,则WCF服务构造函数只需要无参数。您可以在.svc文件中指定自定义服务工厂,如下所示:

<%@ ServiceHost Language="C#" Debug="true"
   Service="Namespace.To.Service"
   Factory="Namespace.To.ServiceFactory" %>

以自定义方式创建课程的过程如下:

  1. 您的ServiceHostFactory在CreateServiceHost
  2. 中创建了自定义ServiceHost的实例
  3. ServiceHost会覆盖OnOpening并向说明添加自定义IServiceBehaviorBehaviors(说明是基类的属性)
  4. 您的IServiceBehavior实现ApplyDispatchBehavior并枚举serviceHostBase。ChannelDispatchers,检查每个是ChannelDispatcher
  5. 自定义IInstanceProvider在GetInstance
  6. 中创建实例

    我已经使用它将创建委托给IoC容器。

答案 1 :(得分:1)

您可以像这样访问.NET调用堆栈:

var trace = new System.Diagnostics.StackTrace();
var frame = trace.GetFrame( 1 ); // Frame 0 is current function
var callingMethodName = frame.GetMethod().Name;

我不知道这种技术是否适用于您的情况,但您可以尝试一下。

答案 2 :(得分:0)

我从未见过被调用方法根据调用者的身份做一些不同的事情的有效案例。如果调用者的身份很重要,那么调用者应该将所需的信息传递给被调用的方法。而不是:

public MyClass(string callerName) {
    if (callerName == "Caller1")
        _field = "Value1";
    else
        _field = "Value2";
}

使用

public MyClass(string value) {
    _field = value;
}

答案 3 :(得分:0)

我认为您最好的选择是将您的服务分解为多个类似的服务(yuk),或者将您的方法分解为针对不同呼叫者使用的重载。

即。如果你有Service1为CallerA和CallerB提供方法foo(),可以尝试使foo为private,并暴露fooA()和fooB(),它们分别由CallerA和CallerB专门调用。然后fooA()和fooB()可以在调用foo()之前适当地设置readonly属性。