536cd135cc
Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
117 lines
4.4 KiB
C#
117 lines
4.4 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="HandlerFactoryCache.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
/*
|
|
* Config related classes for HttpApplication
|
|
*/
|
|
|
|
namespace System.Web.Configuration {
|
|
|
|
using System;
|
|
using System.Configuration;
|
|
using System.Web.Compilation;
|
|
using System.Security;
|
|
using System.Security.Permissions;
|
|
using System.Web;
|
|
|
|
/*
|
|
* An object to cache a factory
|
|
*/
|
|
internal class HandlerFactoryCache {
|
|
private IHttpHandlerFactory _factory;
|
|
|
|
internal HandlerFactoryCache(string type) {
|
|
Object instance = Create(type);
|
|
|
|
// make sure it is either handler or handler factory
|
|
|
|
if (instance is IHttpHandler) {
|
|
// create bogus factory around it
|
|
_factory = new HandlerFactoryWrapper((IHttpHandler)instance, GetHandlerType(type));
|
|
}
|
|
else if (instance is IHttpHandlerFactory) {
|
|
_factory = (IHttpHandlerFactory)instance;
|
|
}
|
|
else {
|
|
throw new HttpException(SR.GetString(SR.Type_not_factory_or_handler, instance.GetType().FullName));
|
|
}
|
|
TelemetryLogger.LogHttpHandler(instance.GetType());
|
|
}
|
|
|
|
internal HandlerFactoryCache(HttpHandlerAction mapping) {
|
|
Object instance = mapping.Create();
|
|
|
|
// make sure it is either handler or handler factory
|
|
|
|
if (instance is IHttpHandler) {
|
|
// create bogus factory around it
|
|
_factory = new HandlerFactoryWrapper((IHttpHandler)instance, GetHandlerType(mapping));
|
|
}
|
|
else if (instance is IHttpHandlerFactory) {
|
|
_factory = (IHttpHandlerFactory)instance;
|
|
}
|
|
else {
|
|
throw new HttpException(SR.GetString(SR.Type_not_factory_or_handler, instance.GetType().FullName));
|
|
}
|
|
TelemetryLogger.LogHttpHandler(instance.GetType());
|
|
}
|
|
|
|
internal IHttpHandlerFactory Factory {
|
|
get {
|
|
return _factory;
|
|
}
|
|
}
|
|
|
|
// Dev10 732000: In a homogenous AppDomain, it is necessary to assert FileIoPermission to load types outside
|
|
// the AppDomain's grant set.
|
|
[FileIOPermission(SecurityAction.Assert, AllFiles = FileIOPermissionAccess.Read | FileIOPermissionAccess.PathDiscovery)]
|
|
private Type GetTypeWithAssert(string type) {
|
|
return BuildManager.GetType(type, throwOnError: true, ignoreCase: false);
|
|
}
|
|
|
|
internal Type GetHandlerType( HttpHandlerAction handlerAction ) {
|
|
// HACKHACK: for now, let uncreatable types through and error later (for .soap factory)
|
|
// This design should change - developers will want to know immediately
|
|
// when they misspell a type
|
|
|
|
Type t = GetTypeWithAssert(handlerAction.Type);
|
|
|
|
// throw for bad types in deferred case
|
|
if (!ConfigUtil.IsTypeHandlerOrFactory(t))
|
|
throw new ConfigurationErrorsException(SR.GetString(SR.Type_not_factory_or_handler, handlerAction.Type),
|
|
handlerAction.ElementInformation.Source, handlerAction.ElementInformation.LineNumber);
|
|
|
|
return t;
|
|
|
|
}
|
|
|
|
internal Type GetHandlerType(string type) {
|
|
// HACKHACK: for now, let uncreatable types through and error later (for .soap factory)
|
|
// This design should change - developers will want to know immediately
|
|
// when they misspell a type
|
|
|
|
Type t = GetTypeWithAssert(type);
|
|
|
|
HttpRuntime.FailIfNoAPTCABit(t, null, null);
|
|
|
|
// throw for bad types in deferred case
|
|
if (!ConfigUtil.IsTypeHandlerOrFactory(t))
|
|
throw new ConfigurationErrorsException(SR.GetString(SR.Type_not_factory_or_handler, type));
|
|
|
|
return t;
|
|
|
|
}
|
|
|
|
internal object Create(string type) {
|
|
// HACKHACK: for now, let uncreatable types through and error later (for .soap factory)
|
|
// This design should change - developers will want to know immediately
|
|
// when they misspell a type
|
|
|
|
return HttpRuntime.CreateNonPublicInstance(GetHandlerType(type));
|
|
}
|
|
}
|
|
}
|