2015-08-20 3 views
2

У меня есть WCF, который настроен на проверку подлинности Windows. Это означает, что доступ к ним смогут получить только аутентифицированные пользователи Windows. У меня есть метод, который не возвращает ничего, кроме того, что он закручивает поток, который выполняет некоторую длительную задачу под олицетворением имени вызываемого окна.WCF service void method Будет ли работать с Windows Impersonation

Мой код ниже:

public void SampleTask(); 
{ 
    Task.Factory.StartNew(this.Activity); 
} 

private void Activity() 
{ 
    WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity; 
    using (WindowsImpersonationContext ctx = identity.Impersonate()) 
     { 
     // Log status in a log database as "In Progress" 
      // Do long running task (accessing database as current user) 
     // retreive the results and save in a file 
     // Update the log database as "Complete" 
     } 
} 

Мой вопрос будет задача по-прежнему полная извлечения результатов и сохранения его и поставить статус, как это должно быть. Или олицетворение не будет работать, так как не будет открытого сеанса. Или я ошибаюсь

С уважением, Гириджем Шанкар

+0

Сеанс должен оставаться открытым (при условии, что соединение не отбрасывается или что-то еще не получается) до тех пор, пока выполняется этот метод. Просто потому, что он возвращает 'void', это не значит, что это операция типа« огонь-и-забыть ». Возможно, вы запутываете операции, которые возвращают 'void' с операциями, отмеченными как' IsOneWay = true'? В любом случае, я ожидаю, что олицетворение будет продолжаться независимо от того, как оно установлено в начале метода. – Tim

+0

@Tim: спасибо за ответ. Итак, в этом случае я могу использовать IsOneWay = true, а не то, что у меня есть сейчас? Будет ли это работать на конечной точке отдыха WCF? Меня больше беспокоит контекст олицетворения. Будет ли это продолжаться или будет просто бросать ошибку (я думал, что, поскольку канал закрыт, Identity будет недействительным). Также, что вы имеете в виду, когда говорите, что соединение отключено? Что произойдет, если клиентское приложение будет закрыто. Будет ли он работать и заканчиваться? – Shankar

+0

Как только метод вызывается, он будет работать до конца (если не встречается ошибка), независимо от того, что происходит на стороне клиента. После того, как вы создадите контекст олицетворения, остается ли клиент оставаться подключенным или нет, контекст олицетворения должен оставаться в силе.Вся идея веб-сервисов (будь то SOAP или REST) ​​заключается в том, что клиент и служба ** не тесно связаны друг с другом, и за исключением методов обслуживания полностью независимы. Как только клиент запрашивает метод для запуска, он не заинтересован в том, что происходит. – Tim

ответ

2

Сеанс должен оставаться открытым до тех пор, как метод выполнения. Даже если метод возвращает void, на запрос, который запустил выполнение метода, будет дан ответ.

Если вам не нужен ответ из службы, вы можете использовать атрибут IsOneWay = true для метода, который будет сообщать службе, чтобы не отправлять ответ клиенту. Поскольку это долговременный метод, который не возвращает данные клиенту, это делает его хорошим кандидатом для одностороннего метода. В этом случае я не уверен, будет ли сеанс открытым или нет, но это не имеет значения, потому что контекст олицетворения будет привязан к сервису и не будет зависеть от клиента.

В вашем методе, вы можете увидеть это из-за декларации:

WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity; 

Переменная identity является областью видимости метода Activity.

using (WindowsImpersonationContect ctx = identity.Impersonate()) 

переменной ctx аналогичным образом в области видимости using блока в рамках метода Activity.

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

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