Getting NLog Running in Partial Trust

Posted by grant.barrington on ASP.net Weblogs See other posts from ASP.net Weblogs or by grant.barrington
Published on Thu, 27 Jan 2011 06:02:58 GMT Indexed on 2011/01/28 23:27 UTC
Read the original article Hit count: 566

Filed under:
|
|

To get things working you will need to:

Strong name sign the assembly

image

Allow Partially Trusted Callers

In the AssemblyInfo.cs file you will need to add the assembly attribute for “AllowPartiallyTrustedCallers”

image

You should now be able to get NLog working as part of a partial trust installation, except that the File target won’t work. Other targets will still work (database for example)

 

Changing BaseFileAppender.cs to get file logging to work

In the directory \Internal\FileAppenders there is a file called “BaseFileAppender.cs”.

Make a change to the function call “TryCreateFileStream()”. The error occurs here:

image

Change the function call to be:

        private FileStream TryCreateFileStream(bool allowConcurrentWrite)
        {
            FileShare fileShare = FileShare.Read;

            if (allowConcurrentWrite)
                fileShare = FileShare.ReadWrite;

#if DOTNET_2_0
            if (_createParameters.EnableFileDelete && PlatformDetector.GetCurrentRuntimeOS() != RuntimeOS.Windows)
            {
                fileShare |= FileShare.Delete;
            }
#endif

#if !NETCF
            try
            {
                if (PlatformDetector.IsCurrentOSCompatibleWith(RuntimeOS.WindowsNT) ||
                        PlatformDetector.IsCurrentOSCompatibleWith(RuntimeOS.Windows))
                {
                    return WindowsCreateFile(FileName, allowConcurrentWrite);
                }
            }
            catch (System.Security.SecurityException secExc)
            {
                InternalLogger.Error("Security Exception Caught in WindowsCreateFile. {0}", secExc.Message);
            }
#endif

            return new FileStream(FileName, 
                FileMode.Append, 
                FileAccess.Write, 
                fileShare, 
                _createParameters.BufferSize);
        }

 

Basically we wrap the call in a try..catch. If we catch a SecurityException when trying to create the FileStream using WindowsCreateFile(), we just swallow the exception and use the native System.Io.FileStream instead.

© ASP.net Weblogs or respective owner

Related posts about ASP.NET

Related posts about partial trust