2009-07-14 134 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()可以適當地設置只讀屬性。