我有一个私人构造函数的WCF服务。如果我没有错,构造函数在WCF中必须是无参数的,而我需要的参数是调用者的名字(或调用者的方法名称),所以我可以分配几个只读字段。获取创建WCF服务实例的调用方(或方法)的名称?
有没有一种方法可以得到调用者的名字 - 或调用它的方法?我正在玩OperationContext.Current,但没有任何运气。
我有一个私人构造函数的WCF服务。如果我没有错,构造函数在WCF中必须是无参数的,而我需要的参数是调用者的名字(或调用者的方法名称),所以我可以分配几个只读字段。获取创建WCF服务实例的调用方(或方法)的名称?
有没有一种方法可以得到调用者的名字 - 或调用它的方法?我正在玩OperationContext.Current,但没有任何运气。
我不会建议访问性能方面的原因堆栈跟踪。
如果您使用默认的ServiceHostFactory,WCF服务构造函数只需要无参数。您可以在.svc文件像这样指定自定义服务工厂:
<%@ ServiceHost Language="C#" Debug="true"
Service="Namespace.To.Service"
Factory="Namespace.To.ServiceFactory" %>
以自定义方式创建该类的过程是这样的:
我已经使用这个委托创作一个IoC容器。
您可以访问.NET调用堆栈是这样的:
var trace = new System.Diagnostics.StackTrace();
var frame = trace.GetFrame(1); // Frame 0 is current function
var callingMethodName = frame.GetMethod().Name;
我不知道这个技术是否在你的环境,但你可以试试看。
我从来没有看到被调用的方法根据调用者的身份做不同的事情。如果主叫方的身份很重要,则主叫方应该将所需信息传递给被叫方法。相反的:
public MyClass(string callerName) {
if (callerName == "Caller1")
_field = "Value1";
else
_field = "Value2";
}
使用
public MyClass(string value) {
_field = value;
}
我想通过neccesarry值,但wcf服务中的构造函数必须是无参数的。 – avance70 2009-07-14 12:07:49
我认为您最好的选择是将您的服务分解为多个类似的服务(yuk)或将您的方法分解为适合不同呼叫者使用的重载。
即,如果您有Service1向CallerA和CallerB提供方法foo(),可能试着让foo为private,并且分别暴露由CallerA和CallerB独占调用的fooA()和fooB()。然后,在调用foo()之前,fooA()和fooB()可以适当地设置只读属性。
遗憾的是它并没有帮助:(如果我从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
我会感到震惊如果WCF服务可以看到另一个系统上的调用堆栈。 – 2009-07-14 12:10:58