Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / System.ServiceModel.Activation / System / ServiceModel / Activation / HostedHttpTransportManager.cs / 1305376 / HostedHttpTransportManager.cs
//---------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------------------- namespace System.ServiceModel.Activation { using System.Diagnostics; using System.Globalization; using System.Runtime; using System.Runtime.Diagnostics; using System.Security; using System.Security.Permissions; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Diagnostics; using System.Threading; using System.Web; class HostedHttpTransportManager : HttpTransportManager { string scheme; int port; string host; internal HostedHttpTransportManager(BaseUriWithWildcard baseAddress) : base(baseAddress.BaseAddress, baseAddress.HostNameComparisonMode) { base.IsHosted = true; } internal override bool IsCompatible(HttpChannelListener factory) { return true; } internal override void OnClose(TimeSpan timeout) { // empty } internal override void OnOpen() { // empty } internal override void OnAbort() { // empty } internal override string Scheme { get { return this.scheme ?? (this.scheme = this.ListenUri.Scheme); } } internal string Host { get { return this.host ?? (this.host = this.ListenUri.Host); } } internal int Port { get { return this.port == 0 ? (this.port = this.ListenUri.Port) : this.port; } } static bool canTraceConnectionInformation = true; public void TraceConnectionInformation(HostedHttpRequestAsyncResult result) { if (result != null && DiagnosticUtility.ShouldTraceInformation && canTraceConnectionInformation) { try { IServiceProvider provider = (IServiceProvider)result.Application.Context; HttpWorkerRequest workerRequest = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); string localAddress = string.Format(CultureInfo.InvariantCulture, "{0}:{1}", workerRequest.GetLocalAddress(), workerRequest.GetLocalPort()); string remoteAddress = string.Format(CultureInfo.InvariantCulture, "{0}:{1}", workerRequest.GetRemoteAddress(), workerRequest.GetRemotePort()); TraceUtility.TraceHttpConnectionInformation(localAddress, remoteAddress, this); } catch (SecurityException e) { canTraceConnectionInformation = false; // not re-throwing on purpose if (DiagnosticUtility.ShouldTraceWarning) { DiagnosticUtility.ExceptionUtility.TraceHandledException(e, TraceEventType.Warning); } } } } [Fx.Tag.SecurityNote(Critical = "Calls getters with LinkDemands in ASP .NET objects.", Safe = "Only returns the activity, doesn't leak the ASP .NET objects.")] [SecuritySafeCritical] public ServiceModelActivity CreateReceiveBytesActivity(HostedHttpRequestAsyncResult result) { ServiceModelActivity retval = null; if (result != null) { TraceMessageReceived(result.RequestUri); if (DiagnosticUtility.ShouldUseActivity) { IServiceProvider provider = (IServiceProvider)result.Application.Context; retval = ServiceModelActivity.CreateBoundedActivity(GetRequestTraceIdentifier(provider)); StartReceiveBytesActivity(retval, result.RequestUri); } } return retval; } [Fx.Tag.SecurityNote(Critical = "Uses the HttpWorkerRequest to get the trace identifier, which Demands UnamangedCode.", Safe = "Only returns the trace id, doesn't leak the HttpWorkerRequest.")] [SecuritySafeCritical] [SecurityPermission(SecurityAction.Assert, UnmanagedCode = true)] static Guid GetRequestTraceIdentifier(IServiceProvider provider) { return ((HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest))).RequestTraceIdentifier; } internal void HttpContextReceived(HostedHttpRequestAsyncResult result) { using (DiagnosticUtility.ShouldUseActivity ? ServiceModelActivity.BoundOperation(this.Activity) : null) { using (this.CreateReceiveBytesActivity(result)) { this.TraceConnectionInformation(result); HttpChannelListener listener; if (base.TryLookupUri(result.RequestUri, result.GetHttpMethod(), this.HostNameComparisonMode, out listener)) { HostedHttpContext hostedContext = new HostedHttpContext(listener, result); listener.HttpContextReceived(hostedContext, null); return; } if (DiagnosticUtility.ShouldTraceError) { TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.HttpChannelMessageReceiveFailed, SR.TraceCodeHttpChannelMessageReceiveFailed, new StringTraceRecord("IsRecycling", ServiceHostingEnvironment.IsRecycling.ToString(CultureInfo.CurrentCulture)), this, null); } if (ServiceHostingEnvironment.IsRecycling) { throw FxTrace.Exception.AsError( new EndpointNotFoundException(SR.Hosting_ListenerNotFoundForActivationInRecycling(result.RequestUri.ToString()))); } else { throw FxTrace.Exception.AsError( new EndpointNotFoundException(SR.Hosting_ListenerNotFoundForActivation(result.RequestUri.ToString()))); } } } } } [Fx.Tag.SecurityNote(Critical = "Captures HttpContext.Current on construction, then can apply that state at a later time and reset on Dispose." + "Whole object is critical because where it was initially constructed can be used to control HttpContext.set_Current later and HttpContext.set_Current requires an elevation")] #pragma warning disable 618 // have not moved to the v4 security model yet [SecurityCritical(SecurityCriticalScope.Everything)] #pragma warning restore 618 class HostedThreadData { CultureInfo cultureInfo; CultureInfo uiCultureInfo; HttpContext httpContext; public HostedThreadData() { this.cultureInfo = CultureInfo.CurrentCulture; this.uiCultureInfo = CultureInfo.CurrentUICulture; this.httpContext = HttpContext.Current; } public IDisposable CreateContext() { return new HostedAspNetContext(this); } [SecurityPermission(SecurityAction.Assert, Unrestricted = true)] static void UnsafeApplyData(HostedThreadData data) { // We set the CallContext.HostContext directly instead of setting HttpContext.Current because // the latter uses a demand instead of a link demand, which is very expensive in partial trust. System.Runtime.Remoting.Messaging.CallContext.HostContext = data.httpContext; Thread currentThread = Thread.CurrentThread; if (currentThread.CurrentCulture != data.cultureInfo) { currentThread.CurrentCulture = data.cultureInfo; } if (currentThread.CurrentUICulture != data.uiCultureInfo) { currentThread.CurrentUICulture = data.uiCultureInfo; } } class HostedAspNetContext : IDisposable { HostedThreadData oldData; public HostedAspNetContext(HostedThreadData newData) { oldData = new HostedThreadData(); HostedThreadData.UnsafeApplyData(newData); } public void Dispose() { HostedThreadData.UnsafeApplyData(oldData); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------------------- namespace System.ServiceModel.Activation { using System.Diagnostics; using System.Globalization; using System.Runtime; using System.Runtime.Diagnostics; using System.Security; using System.Security.Permissions; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Diagnostics; using System.Threading; using System.Web; class HostedHttpTransportManager : HttpTransportManager { string scheme; int port; string host; internal HostedHttpTransportManager(BaseUriWithWildcard baseAddress) : base(baseAddress.BaseAddress, baseAddress.HostNameComparisonMode) { base.IsHosted = true; } internal override bool IsCompatible(HttpChannelListener factory) { return true; } internal override void OnClose(TimeSpan timeout) { // empty } internal override void OnOpen() { // empty } internal override void OnAbort() { // empty } internal override string Scheme { get { return this.scheme ?? (this.scheme = this.ListenUri.Scheme); } } internal string Host { get { return this.host ?? (this.host = this.ListenUri.Host); } } internal int Port { get { return this.port == 0 ? (this.port = this.ListenUri.Port) : this.port; } } static bool canTraceConnectionInformation = true; public void TraceConnectionInformation(HostedHttpRequestAsyncResult result) { if (result != null && DiagnosticUtility.ShouldTraceInformation && canTraceConnectionInformation) { try { IServiceProvider provider = (IServiceProvider)result.Application.Context; HttpWorkerRequest workerRequest = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); string localAddress = string.Format(CultureInfo.InvariantCulture, "{0}:{1}", workerRequest.GetLocalAddress(), workerRequest.GetLocalPort()); string remoteAddress = string.Format(CultureInfo.InvariantCulture, "{0}:{1}", workerRequest.GetRemoteAddress(), workerRequest.GetRemotePort()); TraceUtility.TraceHttpConnectionInformation(localAddress, remoteAddress, this); } catch (SecurityException e) { canTraceConnectionInformation = false; // not re-throwing on purpose if (DiagnosticUtility.ShouldTraceWarning) { DiagnosticUtility.ExceptionUtility.TraceHandledException(e, TraceEventType.Warning); } } } } [Fx.Tag.SecurityNote(Critical = "Calls getters with LinkDemands in ASP .NET objects.", Safe = "Only returns the activity, doesn't leak the ASP .NET objects.")] [SecuritySafeCritical] public ServiceModelActivity CreateReceiveBytesActivity(HostedHttpRequestAsyncResult result) { ServiceModelActivity retval = null; if (result != null) { TraceMessageReceived(result.RequestUri); if (DiagnosticUtility.ShouldUseActivity) { IServiceProvider provider = (IServiceProvider)result.Application.Context; retval = ServiceModelActivity.CreateBoundedActivity(GetRequestTraceIdentifier(provider)); StartReceiveBytesActivity(retval, result.RequestUri); } } return retval; } [Fx.Tag.SecurityNote(Critical = "Uses the HttpWorkerRequest to get the trace identifier, which Demands UnamangedCode.", Safe = "Only returns the trace id, doesn't leak the HttpWorkerRequest.")] [SecuritySafeCritical] [SecurityPermission(SecurityAction.Assert, UnmanagedCode = true)] static Guid GetRequestTraceIdentifier(IServiceProvider provider) { return ((HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest))).RequestTraceIdentifier; } internal void HttpContextReceived(HostedHttpRequestAsyncResult result) { using (DiagnosticUtility.ShouldUseActivity ? ServiceModelActivity.BoundOperation(this.Activity) : null) { using (this.CreateReceiveBytesActivity(result)) { this.TraceConnectionInformation(result); HttpChannelListener listener; if (base.TryLookupUri(result.RequestUri, result.GetHttpMethod(), this.HostNameComparisonMode, out listener)) { HostedHttpContext hostedContext = new HostedHttpContext(listener, result); listener.HttpContextReceived(hostedContext, null); return; } if (DiagnosticUtility.ShouldTraceError) { TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.HttpChannelMessageReceiveFailed, SR.TraceCodeHttpChannelMessageReceiveFailed, new StringTraceRecord("IsRecycling", ServiceHostingEnvironment.IsRecycling.ToString(CultureInfo.CurrentCulture)), this, null); } if (ServiceHostingEnvironment.IsRecycling) { throw FxTrace.Exception.AsError( new EndpointNotFoundException(SR.Hosting_ListenerNotFoundForActivationInRecycling(result.RequestUri.ToString()))); } else { throw FxTrace.Exception.AsError( new EndpointNotFoundException(SR.Hosting_ListenerNotFoundForActivation(result.RequestUri.ToString()))); } } } } } [Fx.Tag.SecurityNote(Critical = "Captures HttpContext.Current on construction, then can apply that state at a later time and reset on Dispose." + "Whole object is critical because where it was initially constructed can be used to control HttpContext.set_Current later and HttpContext.set_Current requires an elevation")] #pragma warning disable 618 // have not moved to the v4 security model yet [SecurityCritical(SecurityCriticalScope.Everything)] #pragma warning restore 618 class HostedThreadData { CultureInfo cultureInfo; CultureInfo uiCultureInfo; HttpContext httpContext; public HostedThreadData() { this.cultureInfo = CultureInfo.CurrentCulture; this.uiCultureInfo = CultureInfo.CurrentUICulture; this.httpContext = HttpContext.Current; } public IDisposable CreateContext() { return new HostedAspNetContext(this); } [SecurityPermission(SecurityAction.Assert, Unrestricted = true)] static void UnsafeApplyData(HostedThreadData data) { // We set the CallContext.HostContext directly instead of setting HttpContext.Current because // the latter uses a demand instead of a link demand, which is very expensive in partial trust. System.Runtime.Remoting.Messaging.CallContext.HostContext = data.httpContext; Thread currentThread = Thread.CurrentThread; if (currentThread.CurrentCulture != data.cultureInfo) { currentThread.CurrentCulture = data.cultureInfo; } if (currentThread.CurrentUICulture != data.uiCultureInfo) { currentThread.CurrentUICulture = data.uiCultureInfo; } } class HostedAspNetContext : IDisposable { HostedThreadData oldData; public HostedAspNetContext(HostedThreadData newData) { oldData = new HostedThreadData(); HostedThreadData.UnsafeApplyData(newData); } public void Dispose() { HostedThreadData.UnsafeApplyData(oldData); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- LabelAutomationPeer.cs
- TemplatedAdorner.cs
- ConnectionProviderAttribute.cs
- DefaultValueTypeConverter.cs
- ProcessInfo.cs
- SafeFileMappingHandle.cs
- Knowncolors.cs
- ViewSimplifier.cs
- DeploymentSection.cs
- RawStylusInputCustomDataList.cs
- CodePrimitiveExpression.cs
- PenThreadWorker.cs
- StringReader.cs
- GraphicsContext.cs
- RelativeSource.cs
- BinaryObjectInfo.cs
- StringHandle.cs
- ListBox.cs
- PageAsyncTaskManager.cs
- InputBuffer.cs
- InstanceCreationEditor.cs
- EventData.cs
- FontSizeConverter.cs
- DbProviderFactoriesConfigurationHandler.cs
- ImmutableCollection.cs
- XsltContext.cs
- DynamicMethod.cs
- CodeDelegateInvokeExpression.cs
- NullReferenceException.cs
- EncodedStreamFactory.cs
- DocobjHost.cs
- QilBinary.cs
- DataPagerFieldCommandEventArgs.cs
- DynamicObjectAccessor.cs
- BigInt.cs
- BatchStream.cs
- DirectionalLight.cs
- ControlBindingsCollection.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- documentsequencetextview.cs
- XmlSchemaSimpleContentExtension.cs
- ContextMenuStrip.cs
- DifferencingCollection.cs
- ObjectListSelectEventArgs.cs
- AccessibleObject.cs
- FileCodeGroup.cs
- XmlCharCheckingReader.cs
- ContactManager.cs
- UICuesEvent.cs
- DateTimeFormat.cs
- CorrelationService.cs
- ConfigurationSectionCollection.cs
- DiagnosticTrace.cs
- UriParserTemplates.cs
- ProcessModule.cs
- DecimalConstantAttribute.cs
- GridPattern.cs
- DetailsViewDesigner.cs
- HtmlProps.cs
- MsmqOutputChannel.cs
- ParsedAttributeCollection.cs
- UInt16Storage.cs
- ArraySet.cs
- HtmlProps.cs
- DataGridViewControlCollection.cs
- WebPartCollection.cs
- AlgoModule.cs
- SafeBitVector32.cs
- JsonDeserializer.cs
- VisualBasicSettingsHandler.cs
- DataStreams.cs
- ThreadAttributes.cs
- Calendar.cs
- Cursors.cs
- HttpApplicationFactory.cs
- ColorTransformHelper.cs
- EvidenceTypeDescriptor.cs
- regiisutil.cs
- MachineKeySection.cs
- CompositeScriptReference.cs
- XhtmlTextWriter.cs
- RelationshipManager.cs
- ClientSideQueueItem.cs
- PauseStoryboard.cs
- Encoding.cs
- TabControlEvent.cs
- ExtendedPropertyDescriptor.cs
- MultiTrigger.cs
- Byte.cs
- Drawing.cs
- DelayedRegex.cs
- ApplicationSecurityManager.cs
- RijndaelManagedTransform.cs
- XmlTextWriter.cs
- CommentEmitter.cs
- ConcurrencyBehavior.cs
- SqlServer2KCompatibilityCheck.cs
- HttpException.cs
- TrackBarRenderer.cs
- SecurityCriticalDataForSet.cs