C# 获取创建WCF服务实例的调用方(或方法)的名称?
我有一个带有私有构造函数的WCF服务。如果我没有错的话,构造函数在WCF中必须是无参数的,我需要的参数是调用方的名称(或调用方的方法名称),因此我可以分配几个只读字段C# 获取创建WCF服务实例的调用方(或方法)的名称?,c#,wcf,C#,Wcf,我有一个带有私有构造函数的WCF服务。如果我没有错的话,构造函数在WCF中必须是无参数的,我需要的参数是调用方的名称(或调用方的方法名称),因此我可以分配几个只读字段 有没有办法获取调用方的名称——或者调用它的方法?我在玩OperationContext.Current,但运气不好。您可以像这样访问.NET调用堆栈: var trace = new System.Diagnostics.StackTrace(); var frame = trace.GetFrame( 1 ); // Frame
有没有办法获取调用方的名称——或者调用它的方法?我在玩OperationContext.Current,但运气不好。您可以像这样访问.NET调用堆栈:
var trace = new System.Diagnostics.StackTrace();
var frame = trace.GetFrame( 1 ); // Frame 0 is current function
var callingMethodName = frame.GetMethod().Name;
<%@ ServiceHost Language="C#" Debug="true"
Service="Namespace.To.Service"
Factory="Namespace.To.ServiceFactory" %>
我不知道这种技术是否适用于您的情况,但您可以尝试一下。您可以像这样访问.NET调用堆栈:
var trace = new System.Diagnostics.StackTrace();
var frame = trace.GetFrame( 1 ); // Frame 0 is current function
var callingMethodName = frame.GetMethod().Name;
<%@ ServiceHost Language="C#" Debug="true"
Service="Namespace.To.Service"
Factory="Namespace.To.ServiceFactory" %>
我不知道这种技术在您的情况下是否有效,但您可以尝试一下。我从未见过被调用方法根据调用方的身份执行不同操作的有效案例。如果调用方的身份很重要,那么调用方应该向被调用方法传递它所需要的任何信息。而不是:
public MyClass(string callerName) {
if (callerName == "Caller1")
_field = "Value1";
else
_field = "Value2";
}
使用
我从未见过被调用方法根据调用方的身份执行不同操作的有效案例。如果调用方的身份很重要,那么调用方应该向被调用方法传递它所需要的任何信息。而不是:
public MyClass(string callerName) {
if (callerName == "Caller1")
_field = "Value1";
else
_field = "Value2";
}
使用
出于性能原因,我不建议访问堆栈跟踪 如果使用默认值,则WCF服务构造函数只需要是无参数的。您可以在.svc文件中指定自定义服务工厂,如下所示:
var trace = new System.Diagnostics.StackTrace();
var frame = trace.GetFrame( 1 ); // Frame 0 is current function
var callingMethodName = frame.GetMethod().Name;
<%@ ServiceHost Language="C#" Debug="true"
Service="Namespace.To.Service"
Factory="Namespace.To.ServiceFactory" %>
以自定义方式创建类的过程如下所示:
var trace = new System.Diagnostics.StackTrace();
var frame = trace.GetFrame( 1 ); // Frame 0 is current function
var callingMethodName = frame.GetMethod().Name;
<%@ ServiceHost Language="C#" Debug="true"
Service="Namespace.To.Service"
Factory="Namespace.To.ServiceFactory" %>
- 枚举每个ChannelDispatcher的属性及其DispatcheRuntime。已更改为自定义
我使用它将创建委托给IoC容器。出于性能原因,我不建议访问堆栈跟踪 如果使用默认值,则WCF服务构造函数只需要是无参数的。您可以在.svc文件中指定自定义服务工厂,如下所示:
var trace = new System.Diagnostics.StackTrace();
var frame = trace.GetFrame( 1 ); // Frame 0 is current function
var callingMethodName = frame.GetMethod().Name;
<%@ ServiceHost Language="C#" Debug="true"
Service="Namespace.To.Service"
Factory="Namespace.To.ServiceFactory" %>
以自定义方式创建类的过程如下所示:
var trace = new System.Diagnostics.StackTrace();
var frame = trace.GetFrame( 1 ); // Frame 0 is current function
var callingMethodName = frame.GetMethod().Name;
<%@ ServiceHost Language="C#" Debug="true"
Service="Namespace.To.Service"
Factory="Namespace.To.ServiceFactory" %>
- 枚举每个ChannelDispatcher的属性及其DispatcheRuntime。已更改为自定义
我用它将创建委托给IoC容器。我认为最好的办法是将服务分解为多个类似服务(YK),或者将方法分解为多个重载,以供不同的调用方使用
i、 e.如果您的Service1为CallerA和CallerB提供方法foo(),那么可以尝试将foo设置为私有,并公开fooA()和fooB(),这两个函数分别由CallerA和CallerB独占调用。然后,在调用foo()之前,fooA()和fooB()可以适当地设置只读属性。我认为最好的办法是将您的服务分解为多个类似的服务(yuk),或者将您的方法分解为供不同调用方使用的重载
i、 e.如果您的Service1为CallerA和CallerB提供方法foo(),那么可以尝试将foo设置为私有,并公开fooA()和fooB(),这两个函数分别由CallerA和CallerB独占调用。然后,在调用foo()之前,fooA()和fooB()可以适当地设置只读属性。不幸的是,这没有帮助:(如果我从0访问所有帧,我将获得以下内容:.ctor CreateService GetInstance GetInstance GetInstance GetServiceInstance ProcessMessage5 ProcessMessage4 ProcessMessage3 ProcessMessage2 ProcessMessage1 Process Dispatch和LeasePump HandlerRequest AsyncReceiveComplete UnhandledExceptionFrame Complete OnReceive UnhandledExceptionFrame Complete OnReceiveComplete OnSyncReadComplete FinishReadCallback AD AsyncReadCallback Complete Callback UnhandledExceptionFrame PerformiCompletionCallback--除了(.ctor)构造函数之外,如果WCF服务对另一个系统上的调用堆栈具有可见性,则wcfI将震惊这些都是自动生成的。不幸的是,这无助于:(如果我从0访问所有帧,我将获得以下内容:.ctor CreateService GetInstance GetInstance GetInstance GetServiceInstance ProcessMessage5 ProcessMessage4 ProcessMessage3 ProcessMessage2 ProcessMessage1 Process Dispatch和LeasePump HandlerRequest AsyncReceiveComplete UnhandledExceptionFrame Complete OnReceive UnhandledExceptionFrame在接收时完成在SyncReadComplete FinishRead时完成读取异步回调完成回调未处理ExceptionFrame PerformIOCompletionCallback--除了(.ctor)构造函数,这些都是由wcfI自动生成的。如果WCF服务对另一个系统上的调用堆栈具有可见性,则会感到震惊。我希望传递neccesarry值,但WCF服务中的构造函数必须是无参数的。请参阅下面的答案。我希望传递neccesarry值,但WCF服务中的构造函数st必须是无参数的。请参阅下面的答案。非常感谢,我可以查看更多详细的指南吗?请参阅。参考“ServiceHostFactory”在我的回答中,链接到文档,其中包括一个示例。不过,我没有配置文件,因为我通过控制台应用程序托管我的服务——serviceHost=newServiceHost(typeof(service),newURI(“net”)。tcp://localhost:1234服务业