Приложение .NET 4.0 на сетевом ресурсе вызывает исключение SecurityException - PullRequest
10 голосов
/ 28 апреля 2010

Сегодня у меня возникла странная проблема при попытке удаленной отладки приложения, созданного для среды выполнения .NET 4.0.

Приложение находится на общем сетевом ресурсе и выполняется на удаленной машине. Однако приложение каждый раз во время загрузки аварийно завершает работу из-за исключительной ситуации SecurityException, вызванной требованием разрешения в методе System.Configuration.ConfigurationManager.GetSection (). Я не проверял, вызывают ли другие требования разрешения в библиотеке базовых классов также исключение безопасности, но во всех случаях это не должно происходить с новым CLR.

Приложение работает с полным доверием (проверил его во время отладки, и, как обычно, это должно быть всегда верно для приложений интрасети в CLR 4.0), поэтому я не знаю, как требование разрешения может вызвать исключение в этом случае. При построении в среде выполнения 3.5 с пакетом обновления 1 (по умолчанию впервые введено полное доверие к сетевым общим приложениям) все работает как положено.

Я вставил пример кода ниже. Любая помощь с благодарностью.

using System;
using System.Configuration;

namespace ConsoleApplication1
{
public sealed class AssetsSection : ConfigurationSection
{
    private static readonly ConfigurationProperty           s_propPath;
    private static readonly ConfigurationPropertyCollection s_properties;

    static AssetsSection()
    {
        s_propPath = new ConfigurationProperty("path", typeof(String));

        s_properties = new ConfigurationPropertyCollection()
        {
            s_propPath
        };
    }

    public static AssetsSection Get()
    {
        return (AssetsSection) ConfigurationManager.GetSection("test/assets");
    }

    protected override ConfigurationPropertyCollection Properties
    {
        get
        {
            return s_properties;
        }
    }

    public String Path
    {
        get
        {
            return (String) base[s_propPath];
        }
        set
        {
            base[s_propPath] = value;
        }
    }
}

class Program
{
    static void Main(String[] args)
    {
        Console.WriteLine(AssetsSection.Get().Path);

        Console.ReadLine();
    }
}
}

И файл App.config;

<?xml version="1.0"?>
<configuration>
<configSections>
    <sectionGroup name="test">
        <section name="assets" type="ConsoleApplication1.AssetsSection, ConsoleApplication1"/>
    </sectionGroup>
</configSections>

<startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/>
</startup>

<test>
    <assets path="..\Assets"/>
</test>
</configuration>

Ответы [ 4 ]

17 голосов
/ 10 мая 2010

Попробуйте сначала загрузить конфигурацию и откройте свой раздел на этом:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
AssetsSection configSection = (AssetsSection)config.GetSection("test/assets");

Я столкнулся с той же проблемой с .NET 4, и это работает для меня.

4 голосов
/ 27 ноября 2012

Это связано с известной ошибкой в ​​.NET 4.0 при запуске приложения из сетевой папки.

Следующий код завершается с ошибкой SecurityException. Обратите внимание, что он завершается ошибкой только тогда, когда вы определили пользовательский тип для раздела, как в этом примере

ConfigurationManager.GetSection("test/assets");

Одним из исправлений является предложение Тимо использовать другое API. Другое решение - применить исправление, предоставленное Microsoft.

Ошибка и соответствующее исправление хранятся в KB2580188 .

1 голос
/ 03 января 2012

Если вы добавите свой собственный класс для сопоставления раздела следующим образом:

[XmlRoot("Interface")]
public class MySectionClass
{
    [XmlAttribute()]
    public string MyAttr1
    {
        get;
        set;
    }

    public string MyAttr2
    {
        get;
        set;
    }
}

Вы можете использовать этот код:

ConfigurationSection configSection = 
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).
GetSection("MySection");

XmlSerializer xs = new XmlSerializer(typeof(MySectionClass));

XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(configSection.SectionInformation.GetRawXml());

XmlNodeReader xnr = new XmlNodeReader(xdoc.DocumentElement);

MySectionClass section = (MySectionClass)xs.Deserialize(xnr);
0 голосов
/ 05 мая 2010

Я размышляю здесь, но я подозреваю, что это ваш файл конфигурации, который не является доверенным.

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

Можете ли вы предоставить более подробную информацию и точное сообщение об ошибке.

...