2009-07-14 130 views
1

我有一个私人构造函数的WCF服务。如果我没有错,构造函数在WCF中必须是无参数的,而我需要的参数是调用者的名字(或调用者的方法名称),所以我可以分配几个只读字段。获取创建WCF服务实例的调用方(或方法)的名称?

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

回答

3

我不会建议访问性能方面的原因堆栈跟踪。

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

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

以自定义方式创建该类的过程是这样的:

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

我已经使用这个委托创作一个IoC容器。

1

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

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

我不知道这个技术是否在你的环境,但你可以试试看。

+0

遗憾的是它并没有帮助:(如果我从0访问所有帧,我得到这些: .ctor 的CreateService 的GetInstance 的GetInstance GetServiceInstance ProcessMessage5 ProcessMessage4 ProcessMessage3 ProcessMessage2 ProcessMessage1 过程 调度 DispatchAndReleasePump HandleRequest AsyncMessagePump OnAsyncReceiveComplete UnhandledExcepti onFrame 完整 的onReceive UnhandledExceptionFrame 完成 OnReceiveComplete OnAsyncReadComplete FinishRead AsyncReadCallback CompleteCallback UnhandledExceptionFrame PerformIOCompletionCallback - 除了(.ctor)构造,这些都是自动生成的WCF – avance70 2009-07-14 12:05:52

+1

我会感到震惊如果WCF服务可以看到另一个系统上的调用堆栈。 – 2009-07-14 12:10:58

0

我从来没有看到被调用的方法根据调用者的身份做不同的事情。如果主叫方的身份很重要,则主叫方应该将所需信息传递给被叫方法。相反的:

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

使用

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

我想通过neccesarry值,但wcf服务中的构造函数必须是无参数的。 – avance70 2009-07-14 12:07:49

0

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

即,如果您有Service1向CallerA和CallerB提供方法foo(),可能试着让foo为private,并且分别暴露由CallerA和CallerB独占调用的fooA()和fooB()。然后,在调用foo()之前,fooA()和fooB()可以适当地设置只读属性。