2013-11-07 3 views
1

Недавно я обнаружил удивительную структуру AOP PostSharp, которая, казалось, работала прямо из коробки. Все было в порядке, и я также внедрил собственный способ ведения журнала, используя log4net, пока не решил загрузить свое приложение на общий хост.PostSharp не работает на общедоступном хостинге

Это не работает на моем общем хосте. На странице, где пользовательский аспект используется я получаю следующее сообщение об ошибке:

Sorry, an error occurred while processing your request. 

Я хочу, чтобы выяснить, есть ли что-то, что мне нужно настроить, чтобы PostSharp работать на виртуальный хостинг?

Кроме того, как я могу получить полезное сообщение об исключении, которое было отправлено на страницу с ошибкой, поскольку сообщение, которое я получаю, вообще не помогает?

Мой аспект, как показано ниже:

[Serializable] 
    public class LoggingAspect : OnMethodBoundaryAspect 
    { 
     //Here is the once-per-class call to initialize the log object 
     //[NonSerialized] 
     //private static readonly ILog log = LogManager.GetLogger("Logger"); 

     private string methodName; 
     private string className; 
     private Type declaringType; 

     /// <summary> 
     /// Method executed at build time. Initializes the aspect instance. After the execution 
     /// of <see cref="CompileTimeInitialize"/>, the aspect is serialized as a managed 
     /// resource inside the transformed assembly, and deserialized at runtime. 
     /// </summary> 
     /// <param name="method">Method to which the current aspect instance 
     /// has been applied.</param> 
     /// <param name="aspectInfo">Unused.</param> 
     public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo) 
     { 
      this.methodName = method.Name; 
      this.className = method.DeclaringType.FullName; 
      this.declaringType = method.DeclaringType; 
     } 

     /// <summary> 
     /// Method invoked before the execution of the method to which the current 
     /// aspect is applied. 
     /// </summary> 
     /// <param name="args">Information about the method being executed.</param> 
     public override void OnEntry(MethodExecutionArgs args) 
     { 
      //log.Debug(this.className + "." + this.methodName + ": Enter"); 
     } 

     /// <summary> 
     /// Method invoked after successfull execution of the method to which the current 
     /// aspect is applied. 
     /// </summary> 
     /// <param name="args">Information about the method being executed.</param> 
     public override void OnSuccess(MethodExecutionArgs args) 
     { 
      //log.Debug(this.className + "." + this.methodName + ": Success"); 
     } 

     /// <summary> 
     /// Method invoked after failure of the method to which the current 
     /// aspect is applied. 
     /// </summary> 
     /// <param name="args">Information about the method being executed.</param> 
     public override void OnException(MethodExecutionArgs args) 
     { 
      //log.Error(this.className + "." + this.methodName + ": Exception " + args.Exception.Message);  
     } 
    } 

Как вы можете видеть, что я закомментировать все строки с помощью log4net, чтобы доказать, что проблема не связана с log4net. Ну, если я включаю log4net, я запускаю другие проблемы, которые я сохранил для решения после того, как могу получить PostSharp, работающий. Таким образом, даже с пустым методом PostSharp не работает. Может ли кто-нибудь указать, что здесь отсутствует?

Я хотел бы добавить, что PostSharp и log4net отлично работают на localhost в режиме отладки. Я не получаю никаких ошибок, и проблема возникает только на общем хостинге.

Update

Я попробовал один и тот же код снова customErrorsmode набор атрибутов для off в web.config. Теперь я получаю следующее исключение:

Exception Details: System.Security.SecurityException: Request failed. 

Description: The application attempted to perform an operation not allowed by the security policy. To grant this application the required permission please contact your system administrator or change the application's trust level in the configuration file. 

Exception Details: System.Security.SecurityException: Request failed. 

Stack Trace: 

[SecurityException: Request failed.] 
    PostSharp.Aspects.Serialization.BinaryAspectSerializer..cctor() +0 

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.18055 

Означает ли это, мне нужно связаться с общим хостинг-провайдера, чтобы изменить Trust уровень моего приложения? Надеюсь, что в этом вопросе есть обход?

+0

Хостинг установил политику, ограничивающую использование определенной функции, которая требует, по-видимому PostSharp. Вам нужно будет связаться с вашим хостинг-провайдером. –

+0

может быть обходное решение или я придерживаюсь политики хостинг-провайдеров, если они не хотят меняться? – sttaq

ответ

1

Ваше сообщение об ошибке показывает, что SecurityException происходит от BinaryAspectSerializer. Это класс по умолчанию, который используется для сериализации аспектов, которые вы отмечаете атрибутом [Serializable].

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

В качестве обходного пути вы можете попытаться использовать другой сериализатор для вашего аспекта.

Если вы примените атрибут [PSerializable] к своему аспекту, то используется PortableFormatter, и он не требует полного доверия.

[PSerializable] 
public class LoggingAspect : OnMethodBoundaryAspect 

Вы также можете избежать сериализаций в целом, но это означает, что не используется CompileTimeInitialize метода и делать всю инициализацию аспекта во время применения во время выполнения, возможно, потери в производительности.

В этом случае вы должны использовать MsilAspectSerializer и инициализировать свой аспект в своем методе RuntimeInitialize.Это описано здесь: Aspect Serialization поставщик

[OnMethodBoundaryAspectConfiguration(SerializerType=typeof(MsilAspectSerializer))] 
public class LoggingAspect : OnMethodBoundaryAspect 
+0

Большое спасибо Alex, я только что попробовал «MsilAspectSerializer», и он работает на моем общем хостинге, не запрашивая у поставщика изменений в своей политике сервера. – sttaq

Смежные вопросы