OperationContext Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет доступ к контексту выполнения метода службы.
public ref class OperationContext sealed : System::ServiceModel::IExtensibleObject<System::ServiceModel::OperationContext ^>
public sealed class OperationContext : System.ServiceModel.IExtensibleObject<System.ServiceModel.OperationContext>
type OperationContext = class
interface IExtensibleObject<OperationContext>
Public NotInheritable Class OperationContext
Implements IExtensibleObject(Of OperationContext)
- Наследование
-
OperationContext
- Реализации
Примеры
В следующем примере кода используется Current свойство и GetCallbackChannel метод для получения канала обратно вызывающей стороне из метода. Все методы в этом примере являются односторонними методами, что позволяет службе и клиенту взаимодействовать в обоих направлениях независимо. В этом случае в примере клиентского приложения ожидается только один обратный вызов перед выходом, но другой клиент, например клиент Windows Forms, может получать любое количество вызовов из службы.
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Name = "SampleDuplexHello",
Namespace = "http://microsoft.wcf.documentation",
CallbackContract = typeof(IHelloCallbackContract),
SessionMode = SessionMode.Required
)]
public interface IDuplexHello
{
[OperationContract(IsOneWay = true)]
void Hello(string greeting);
}
public interface IHelloCallbackContract
{
[OperationContract(IsOneWay = true)]
void Reply(string responseToGreeting);
}
public class DuplexHello : IDuplexHello
{
public DuplexHello()
{
Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
}
~DuplexHello()
{
Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
}
public void Hello(string greeting)
{
Console.WriteLine("Caller sent: " + greeting);
Console.WriteLine("Session ID: " + OperationContext.Current.SessionId);
Console.WriteLine("Waiting two seconds before returning call.");
// Put a slight delay to demonstrate asynchronous behavior on client.
Thread.Sleep(2000);
IHelloCallbackContract callerProxy
= OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
string response = "Service object " + this.GetHashCode().ToString() + " received: " + greeting;
Console.WriteLine("Sending back: " + response);
callerProxy.Reply(response);
}
}
}
Imports System.Collections.Generic
Imports System.ServiceModel
Imports System.Threading
Namespace Microsoft.WCF.Documentation
<ServiceContract(Name:="SampleDuplexHello", Namespace:="http://microsoft.wcf.documentation", _
CallbackContract:=GetType(IHelloCallbackContract), SessionMode:=SessionMode.Required)> _
Public Interface IDuplexHello
<OperationContract(IsOneWay:=True)> _
Sub Hello(ByVal greeting As String)
End Interface
Public Interface IHelloCallbackContract
<OperationContract(IsOneWay := True)> _
Sub Reply(ByVal responseToGreeting As String)
End Interface
Public Class DuplexHello
Implements IDuplexHello
Public Sub New()
Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
End Sub
Protected Overrides Sub Finalize()
Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
End Sub
Public Sub Hello(ByVal greeting As String) Implements IDuplexHello.Hello
Console.WriteLine("Caller sent: " & greeting)
Console.WriteLine("Session ID: " & OperationContext.Current.SessionId)
Console.WriteLine("Waiting two seconds before returning call.")
' Put a slight delay to demonstrate asynchronous behavior on client.
Thread.Sleep(2000)
Dim callerProxy = OperationContext.Current.GetCallbackChannel(Of IHelloCallbackContract)()
Dim response = "Service object " & Me.GetHashCode().ToString() & " received: " & greeting
Console.WriteLine("Sending back: " & response)
callerProxy.Reply(response)
End Sub
End Class
End Namespace
Следующий клиент реализует SampleDuplexHelloCallback сообщение обратного вызова. Импортированный контракт обратного Name вызова не совпадает с именем в службе из-за использования свойства в предыдущем примере. Обратите внимание, что клиент не принимает никаких предположений о том, может ли он получить обратный вызов; Обратный вызов сервера полностью не зависит от исходящего вызова клиента.
Замечание
Пример использования OperationContext класса в клиентском сценарии см. в разделе OperationContextScope.
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Threading;
namespace Microsoft.WCF.Documentation
{
public class Client : SampleDuplexHelloCallback
{
AutoResetEvent waitHandle;
public Client()
{
waitHandle = new AutoResetEvent(false);
}
public void Run()
{
// Picks up configuration from the config file.
SampleDuplexHelloClient wcfClient
= new SampleDuplexHelloClient(new InstanceContext(this));
try
{
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Enter a greeting to send and press ENTER: ");
Console.Write(">>> ");
Console.ForegroundColor = ConsoleColor.Green;
string greeting = Console.ReadLine();
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Called service with: \r\n\t" + greeting);
wcfClient.Hello(greeting);
Console.WriteLine("Execution passes service call and moves to the WaitHandle.");
this.waitHandle.WaitOne();
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("Set was called.");
Console.Write("Press ");
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("ENTER");
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write(" to exit...");
Console.ReadLine();
wcfClient.Close();
}
catch (TimeoutException timeProblem)
{
Console.WriteLine("The service operation timed out. " + timeProblem.Message);
Console.ReadLine();
wcfClient.Abort();
}
catch (CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message);
Console.ReadLine();
wcfClient.Abort();
}
}
public static void Main()
{
Client client = new Client();
client.Run();
}
public void Reply(string response)
{
Console.WriteLine("Received output.");
Console.WriteLine("\r\n\t" + response);
this.waitHandle.Set();
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.Threading
Namespace Microsoft.WCF.Documentation
Public Class Client
Implements SampleDuplexHelloCallback
Private waitHandle As AutoResetEvent
Public Sub New()
waitHandle = New AutoResetEvent(False)
End Sub
Public Sub Run()
' Picks up configuration from the config file.
Dim wcfClient As New SampleDuplexHelloClient(New InstanceContext(Me))
Try
Console.ForegroundColor = ConsoleColor.White
Console.WriteLine("Enter a greeting to send and press ENTER: ")
Console.Write(">>> ")
Console.ForegroundColor = ConsoleColor.Green
Dim greeting = Console.ReadLine()
Console.ForegroundColor = ConsoleColor.White
Console.WriteLine("Called service with: " & Constants.vbCrLf & Constants.vbTab & greeting)
wcfClient.Hello(greeting)
Console.WriteLine("Execution passes service call and moves to the WaitHandle.")
Me.waitHandle.WaitOne()
Console.ForegroundColor = ConsoleColor.Blue
Console.WriteLine("Set was called.")
Console.Write("Press ")
Console.ForegroundColor = ConsoleColor.Red
Console.Write("ENTER")
Console.ForegroundColor = ConsoleColor.Blue
Console.Write(" to exit...")
Console.ReadLine()
wcfClient.Close()
Catch timeProblem As TimeoutException
Console.WriteLine("The service operation timed out. " & timeProblem.Message)
Console.ReadLine()
wcfClient.Abort()
Catch commProblem As CommunicationException
Console.WriteLine("There was a communication problem. " & commProblem.Message)
Console.ReadLine()
wcfClient.Abort()
End Try
End Sub
Public Shared Sub Main()
Dim client As New Client()
client.Run()
End Sub
Public Sub Reply(ByVal response As String) Implements SampleDuplexHelloCallback.Reply
Console.WriteLine("Received output.")
Console.WriteLine(Constants.vbCrLf & Constants.vbTab & response)
Me.waitHandle.Set()
End Sub
End Class
End Namespace
Комментарии
OperationContext Используйте из операции службы для доступа к текущей среде выполнения операции. В частности, контекст операции используется для доступа к каналам обратного вызова в дуплексных службах, для хранения дополнительных данных состояния между частями операций, а также для доступа к заголовкам и свойствам входящих сообщений, а также добавлению заголовков и свойств исходящего сообщения.
Дополнительные сведения об использовании расширений для хранения данных о состоянии см. в разделе "Расширяемые объекты".
Имеет OperationContext следующие свойства и методы.
Свойство Current возвращает OperationContext объект, представляющий текущий контекст выполнения.
Свойство ServiceSecurityContext возвращает среду безопасности, в которой выполняется метод.
Свойство EndpointDispatcher получает операцию System.ServiceModel.Dispatcher.EndpointDispatcher.
Свойство Extensions возвращает коллекцию расширений для текущего OperationContext.
Свойство Host возвращает ServiceHostBase объект, который управляет службой.
Свойство HasSupportingTokens возвращает значение, указывающее, имеет ли метод вспомогательные маркеры, если да, SupportingTokens свойство получает их.
IncomingMessagePropertiesСвойства IncomingMessageHeadersи IncomingMessageVersion свойства получают эти элементы из входящего сообщения.
Событие OperationCompleted запускается после завершения операции.
OutgoingMessageProperties Свойства OutgoingMessageHeaders получают эти элементы для исходящего сообщения.
Свойство RequestContext возвращает реализацию RequestContext метода.
Свойство InstanceContext возвращает связанное InstanceContext с операцией значение.
Свойство SessionId возвращает идентификатор сеанса для текущего канала и объекта.
Метод GetCallbackChannel возвращает канал обратного вызова вызывающему объекту в случае дуплексного взаимодействия.
Метод SetTransactionComplete фиксирует текущую транзакцию.
Конструкторы
| Имя | Описание |
|---|---|
| OperationContext(IContextChannel) |
Инициализирует новый экземпляр OperationContext класса, который использует указанный IContextChannel в клиентском приложении. |
Свойства
| Имя | Описание |
|---|---|
| Channel |
Возвращает канал, связанный с текущим OperationContext объектом. |
| ClaimsPrincipal |
Возвращает субъект на основе утверждений, связанный с операцией. |
| Current |
Возвращает или задает контекст выполнения для текущего потока. |
| EndpointDispatcher |
Возвращает или задает диспетчер конечных точек для конечной точки для проверки или изменения. |
| Extensions |
Возвращает коллекцию расширений служб из текущего контекста сообщения. |
| HasSupportingTokens |
Возвращает значение, указывающее, имеет ли входящее сообщение вспомогательные маркеры. |
| Host |
ServiceHost Возвращает объект текущей службы. |
| IncomingMessageHeaders |
Возвращает заголовки входящих сообщений для .OperationContext |
| IncomingMessageProperties |
Возвращает свойства сообщения для входящего сообщения в объекте OperationContext. |
| IncomingMessageVersion |
Возвращает версию входящего сообщения SOAP для параметра OperationContext. |
| InstanceContext |
InstanceContext Возвращает объект, который управляет текущим экземпляром службы. |
| IsUserContext |
Это свойство предназначено для использования системы и не должно вызываться пользователями. |
| OutgoingMessageHeaders |
Возвращает заголовки исходящего сообщения для активного OperationContext. |
| OutgoingMessageProperties |
Возвращает свойства сообщения для исходящего сообщения в активном OperationContextрежиме. |
| RequestContext |
Возвращает или задает реализацию RequestContext для этого метода. |
| ServiceSecurityContext |
Возвращает или задает объект, ServiceSecurityContext в котором выполняется этот метод. |
| SessionId |
Возвращает используемый String для идентификации текущего сеанса. |
| SupportingTokens |
ICollection<T> Возвращает типSecurityToken. |
Методы
| Имя | Описание |
|---|---|
| Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
| GetCallbackChannel<T>() |
Возвращает канал к экземпляру клиента, который вызвал текущую операцию. |
| GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
| GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
| MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
| SetTransactionComplete() |
Фиксирует текущую выполняемую транзакцию. |
| ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
События
| Имя | Описание |
|---|---|
| OperationCompleted |
Происходит при завершении операции. |