Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / OperationContext.cs / 1 / OperationContext.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.ServiceModel { using System.Collections.Generic; using System.ServiceModel.Dispatcher; using System.ServiceModel.Channels; using System.Runtime.Remoting.Contexts; using System.IdentityModel.Claims; using System.IdentityModel.Policy; using System.ServiceModel.Security.Tokens; using System.ServiceModel.Security; using System.Security.Principal; using System.Net.Security; public sealed class OperationContext : IExtensibleObject{ [ThreadStatic] static OperationContext currentContext; ServiceChannel channel; Message clientReply; bool closeClientReply; ExtensionCollection extensions; ServiceHostBase host; RequestContext requestContext; Message request; InstanceContext instanceContext; bool isServiceReentrant = false; internal IPrincipal threadPrincipal; TransactionRpcFacet txFacet; MessageProperties outgoingMessageProperties; MessageHeaders outgoingMessageHeaders; MessageVersion outgoingMessageVersion; EndpointDispatcher endpointDispatcher; public event EventHandler OperationCompleted; public OperationContext(IContextChannel channel) { if(channel == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("channel")); ServiceChannel serviceChannel = channel as ServiceChannel; //Could be a TransparentProxy if (serviceChannel == null) { serviceChannel = ServiceChannelFactory.GetServiceChannel(channel); } if (serviceChannel != null) { this.outgoingMessageVersion = serviceChannel.MessageVersion; this.channel = serviceChannel; } else { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxInvalidChannelToOperationContext))); } } internal OperationContext(ServiceHostBase host) : this(host, MessageVersion.Soap12WSAddressing10) { } internal OperationContext(ServiceHostBase host, MessageVersion outgoingMessageVersion) { if (outgoingMessageVersion == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("outgoingMessageVersion")); this.host = host; this.outgoingMessageVersion = outgoingMessageVersion; } internal OperationContext(RequestContext requestContext, Message request, ServiceChannel channel, ServiceHostBase host) { this.channel = channel; this.host = host; this.requestContext = requestContext; this.request = request; this.outgoingMessageVersion = channel.MessageVersion; } public IContextChannel Channel { get { return this.GetCallbackChannel (); } } public static OperationContext Current { get { return currentContext; } set { currentContext = value; } } public EndpointDispatcher EndpointDispatcher { get { return this.endpointDispatcher; } set { this.endpointDispatcher = value; } } public bool IsUserContext { get { return (this.request == null); } } public IExtensionCollection Extensions { get { if (this.extensions == null) this.extensions = new ExtensionCollection (this); return this.extensions; } } internal bool IsServiceReentrant { get { return this.isServiceReentrant; } set { this.isServiceReentrant = value; } } public bool HasSupportingTokens { get { MessageProperties properties = this.IncomingMessageProperties; return properties != null && properties.Security != null && properties.Security.HasIncomingSupportingTokens; } } public ServiceHostBase Host { get { return this.host; } } internal Message IncomingMessage { get { return this.clientReply ?? this.request; } } internal ServiceChannel InternalServiceChannel { get { return this.channel; } set { this.channel = value; } } internal bool HasOutgoingMessageHeaders { get { return (this.outgoingMessageHeaders != null); } } public MessageHeaders OutgoingMessageHeaders { get { if (this.outgoingMessageHeaders == null) this.outgoingMessageHeaders = new MessageHeaders(this.OutgoingMessageVersion); return this.outgoingMessageHeaders; } } internal bool HasOutgoingMessageProperties { get { return (this.outgoingMessageProperties != null); } } public MessageProperties OutgoingMessageProperties { get { if (this.outgoingMessageProperties == null) this.outgoingMessageProperties = new MessageProperties(); return this.outgoingMessageProperties; } } internal MessageVersion OutgoingMessageVersion { get { return this.outgoingMessageVersion; } } public MessageHeaders IncomingMessageHeaders { get { Message message = this.clientReply ?? this.request; if (message != null) return message.Headers; else return null; } } public MessageProperties IncomingMessageProperties { get { Message message = this.clientReply ?? this.request; if (message != null) return message.Properties; else return null; } } public MessageVersion IncomingMessageVersion { get { Message message = this.clientReply ?? this.request; if (message != null) return message.Version; else return null; } } public InstanceContext InstanceContext { get { return this.instanceContext; } } public RequestContext RequestContext { get { return this.requestContext; } set { this.requestContext = value; } } public ServiceSecurityContext ServiceSecurityContext { get { MessageProperties properties = this.IncomingMessageProperties; if (properties != null && properties.Security != null) { return properties.Security.ServiceSecurityContext; } return null; } } public string SessionId { get { if (this.channel != null) { IChannel inner = this.channel.InnerChannel; if (inner != null) { ISessionChannel duplex = inner as ISessionChannel ; if ((duplex != null) && (duplex.Session != null)) return duplex.Session.Id; ISessionChannel input = inner as ISessionChannel ; if ((input != null) && (input.Session != null)) return input.Session.Id; ISessionChannel output = inner as ISessionChannel ; if ((output != null) && (output.Session != null)) return output.Session.Id; } } return null; } } public ICollection SupportingTokens { get { MessageProperties properties = this.IncomingMessageProperties; if (properties != null && properties.Security != null) { return new System.Collections.ObjectModel.ReadOnlyCollection ( properties.Security.IncomingSupportingTokens); } return null; } } internal IPrincipal ThreadPrincipal { get { return this.threadPrincipal; } set { this.threadPrincipal = value; } } internal TransactionRpcFacet TransactionFacet { get { return this.txFacet; } set { this.txFacet = value; } } internal void ClearClientReplyNoThrow() { this.clientReply = null; } internal void FireOperationCompleted() { try { EventHandler handler = this.OperationCompleted; if (handler != null) { handler(this, EventArgs.Empty); } } catch (Exception e) { if (DiagnosticUtility.IsFatal(e)) throw; throw DiagnosticUtility.ExceptionUtility.ThrowHelperCallback(e); } } public T GetCallbackChannel () { if (this.channel == null || this.IsUserContext) return default(T); // yes, we might throw InvalidCastException here. Is it really // better to check and throw something else instead? return (T)this.channel.Proxy; } internal void ReInit(RequestContext requestContext, Message request, ServiceChannel channel) { this.requestContext = requestContext; this.request = request; this.channel = channel; } internal void Recycle() { this.requestContext = null; this.request = null; this.extensions = null; this.instanceContext = null; this.threadPrincipal = null; this.txFacet = null; this.SetClientReply(null, false); } internal void SetClientReply(Message message, bool closeMessage) { Message oldClientReply = null; if (!object.Equals(message, this.clientReply)) { if (this.closeClientReply && (this.clientReply != null)) { oldClientReply = this.clientReply; } this.clientReply = message; } this.closeClientReply = closeMessage; if (oldClientReply != null) { oldClientReply.Close(); } } public void SetTransactionComplete() { if (this.txFacet == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.NoTransactionInContext))); } this.txFacet.Completed(); } internal void SetInstanceContext(InstanceContext instanceContext) { this.instanceContext = instanceContext; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PopOutPanel.cs
- autovalidator.cs
- SqlDataSource.cs
- ObjectFullSpanRewriter.cs
- InvokeProviderWrapper.cs
- URI.cs
- DeleteHelper.cs
- DesignerToolStripControlHost.cs
- StorageMappingItemCollection.cs
- WasEndpointConfigContainer.cs
- SoapFormatter.cs
- CodeDirectiveCollection.cs
- CodeArrayIndexerExpression.cs
- BulletedListDesigner.cs
- MailMessage.cs
- ToolStripContainer.cs
- QilParameter.cs
- EmbeddedMailObject.cs
- SHA384.cs
- DBPropSet.cs
- GPRECTF.cs
- DataServiceRequestException.cs
- DocumentPageView.cs
- ProjectionPruner.cs
- EnumMember.cs
- InputReport.cs
- RowVisual.cs
- Utils.cs
- VScrollBar.cs
- RelatedImageListAttribute.cs
- HwndPanningFeedback.cs
- TemplateEditingService.cs
- XPathNode.cs
- ProvideValueServiceProvider.cs
- LinkDescriptor.cs
- DesignerAttribute.cs
- Convert.cs
- SqlCommandSet.cs
- RIPEMD160.cs
- RSACryptoServiceProvider.cs
- ObjectDataSourceMethodEditor.cs
- BinaryFormatterWriter.cs
- WebBrowserEvent.cs
- XamlSerializerUtil.cs
- CustomServiceCredentials.cs
- HtmlImage.cs
- XamlSerializer.cs
- DetailsViewUpdatedEventArgs.cs
- CodeExpressionCollection.cs
- TableDesigner.cs
- InvalidPrinterException.cs
- NativeStructs.cs
- DiscoveryEndpointElement.cs
- SortedList.cs
- FlowDecisionLabelFeature.cs
- WebServiceTypeData.cs
- DataSourceCacheDurationConverter.cs
- ExtendedProperty.cs
- NameValueCollection.cs
- StringFreezingAttribute.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- SqlInternalConnectionTds.cs
- FactoryGenerator.cs
- RichTextBoxAutomationPeer.cs
- HttpCapabilitiesSectionHandler.cs
- ZipFileInfo.cs
- ContextMenu.cs
- ScalarRestriction.cs
- Mappings.cs
- CheckBoxStandardAdapter.cs
- UdpDiscoveryEndpointElement.cs
- HttpContextWrapper.cs
- FamilyTypefaceCollection.cs
- JsonFormatReaderGenerator.cs
- ListParagraph.cs
- UnsupportedPolicyOptionsException.cs
- httpstaticobjectscollection.cs
- PhysicalOps.cs
- ExecutionContext.cs
- UnsafePeerToPeerMethods.cs
- TreeNodeMouseHoverEvent.cs
- ParentUndoUnit.cs
- TemplateBindingExpression.cs
- HuffModule.cs
- PolyQuadraticBezierSegmentFigureLogic.cs
- StringHandle.cs
- Interlocked.cs
- WebPartDeleteVerb.cs
- ObjectView.cs
- WebPartVerbCollection.cs
- OdbcHandle.cs
- BaseCodeDomTreeGenerator.cs
- ServiceOperationParameter.cs
- Region.cs
- PlainXmlDeserializer.cs
- IisTraceWebEventProvider.cs
- XmlSchemaSimpleContentExtension.cs
- XhtmlConformanceSection.cs
- PageAsyncTaskManager.cs
- BehaviorEditorPart.cs