Получить имя вызывающего (или метода), создавшего экземпляр службы WCF? - PullRequest
1 голос
/ 14 июля 2009

У меня есть служба WCF с частным конструктором. Если я не ошибаюсь, конструкторы должны быть без параметров в WCF, а нужный мне параметр - это имя вызывающего (или имя вызывающего), чтобы я мог назначить несколько полей только для чтения.

Есть ли способ узнать имя вызывающего абонента или метод, который его вызвал? Я играл с OperationContext.Current, но безуспешно.

Ответы [ 4 ]

3 голосов
/ 14 июля 2009

Я бы не рекомендовал обращаться к трассировке стека по соображениям производительности.

Конструкторы служб WCF должны быть без параметров, только если вы используете значение по умолчанию ServiceHostFactory . Вы можете указать фабрику пользовательских сервисов в вашем файле .svc следующим образом:

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

Процесс создания класса по-своему выглядит следующим образом:

  1. Ваш ServiceHostFactory создает экземпляр вашего пользовательского ServiceHost в CreateServiceHost
  2. ServiceHost переопределяет OnOpening и добавляет пользовательский IServiceBehavior в Description. Поведения (Description является свойством базового класса)
  3. Ваш IServiceBehavior реализует ApplyDispatchBehavior и перечисляет serviceHostBase. ChannelDispatchers , проверяя, является ли каждый ChannelDispatcher .
  4. Пользовательский IInstanceProvider создает экземпляр в GetInstance

Я использовал это, чтобы делегировать создание в контейнер IoC.

1 голос
/ 14 июля 2009

Вы можете получить доступ к стеку вызовов .NET следующим образом:

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

Я не знаю, работает ли эта техника в вашей ситуации, но вы можете попробовать.

0 голосов
/ 14 июля 2009

Я думаю, что вам лучше всего либо разбить ваш сервис на несколько похожих сервисов (юк), либо разбить ваш метод (методы) на перегрузки, предназначенные для использования разными абонентами.

т.е. если у вас есть Service1, который предоставляет метод foo () для CallerA и CallerB, возможно, попробуйте сделать foo частным и выставить fooA () и fooB (), которые вызываются исключительно CallerA и CallerB соответственно. Затем fooA () и fooB () могут установить свойства только для чтения перед вызовом foo ().

0 голосов
/ 14 июля 2009

Я никогда не видел действительного случая, чтобы вызываемый метод делал что-то другое в зависимости от личности вызывающего. Если личность вызывающего пользователя имеет значение, то вызывающий должен передать вызываемому методу любую необходимую ему информацию. Вместо:

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

использование

public MyClass(string value) {
    _field = value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...