Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取创建WCF服务实例的调用方(或方法)的名称?_C#_Wcf - Fatal编程技术网

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

C# 获取创建WCF服务实例的调用方(或方法)的名称?,c#,wcf,C#,Wcf,我有一个带有私有构造函数的WCF服务。如果我没有错的话,构造函数在WCF中必须是无参数的,我需要的参数是调用方的名称(或调用方的方法名称),因此我可以分配几个只读字段 有没有办法获取调用方的名称——或者调用它的方法?我在玩OperationContext.Current,但运气不好。您可以像这样访问.NET调用堆栈: var trace = new System.Diagnostics.StackTrace(); var frame = trace.GetFrame( 1 ); // Frame

我有一个带有私有构造函数的WCF服务。如果我没有错的话,构造函数在WCF中必须是无参数的,我需要的参数是调用方的名称(或调用方的方法名称),因此我可以分配几个只读字段


有没有办法获取调用方的名称——或者调用它的方法?我在玩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" %>
  • 在CreateServiceHost中创建自定义的实例
  • ServiceHost将覆盖并向描述中添加自定义内容。(说明是基类上的属性)
  • 您的IServiceBehavior实现并枚举serviceHostBase.,检查是否每个都是一个。
    • 枚举每个ChannelDispatcher的属性及其DispatcheRuntime。已更改为自定义
  • 自定义IInstanceProvider在中创建实例

  • 我使用它将创建委托给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" %>
    
  • 在CreateServiceHost中创建自定义的实例
  • ServiceHost将覆盖并向描述中添加自定义内容。(说明是基类上的属性)
  • 您的IServiceBehavior实现并枚举serviceHostBase.,检查是否每个都是一个。
    • 枚举每个ChannelDispatcher的属性及其DispatcheRuntime。已更改为自定义
  • 自定义IInstanceProvider在中创建实例

  • 我用它将创建委托给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服务业