Frage

erfahren Heute habe ich ein seltsames Problem bei dem Versuch, remote eine Anwendung für die .NET 4.0 Runtime gebaut debuggen.

Die Anwendung befindet sich auf einer Netzwerkfreigabe und von einem entfernten Rechner ausgeführt. Jedoch stürzt die Anwendung jedes Mal bei Belastung aufgrund einer Security durch eine Berechtigungsanforderung in der System.Configuration.ConfigurationManager.GetSection () Methode erhöht. Ich habe nicht, wenn andere Erlaubnis Anforderungen in der Basisklassenbibliothek auch eine Sicherheitsausnahme verursachen, aber in allen Fällen soll dies nicht geschehen mit der neuen CLR überprüft.

Die Anwendung in voller Vertrauenswürdigkeit ausgeführt wird (markiert es während des Debuggen und wie üblich muss dies für Intranet-Anwendungen in CLR 4.0 immer wahr sein), damit ich bin ahnungslos, wie eine Berechtigungsanforderung eine Ausnahme in diesem Fall führen kann. Wenn gebaut gegen die 3.5 SP1 Laufzeit (das erste volles Vertrauen für Netzwerk gemeinsam genutzte Apps Standard eingeführt) every läuft wie erwartet.

Ich klebte den Beispielcode unten. Jede Hilfe wird sehr geschätzt.

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();
    }
}
}

Und die App.config-Datei;

<?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>
War es hilfreich?

Lösung

Versuchen Sie, die Konfiguration zuerst laden und öffnen Sie Ihren Abschnitt auf, dass:

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

Ich lief in das gleiche Problem mit .NET 4 und das funktioniert für mich.

Andere Tipps

Dies ist auf einen bekannten Fehler in .NET 4.0, wenn die Anwendung von einer Netzwerkfreigabe ausgeführt wird.

Die Folge Code schlägt mit einem Security. Beachten Sie, dass es nur nicht, wenn Sie einen benutzerdefinierten Typ für den Abschnitt wie in diesem Beispiel AssetsSection definiert haben:

ConfigurationManager.GetSection("test/assets");

Eine Lösung ist die Lösung Vorschlag von Timo eine andere API zu verwenden. Eine weitere Lösung ist das Patch von Microsoft zu übernehmen.

Der Fehler und die damit verbundene Hotfix ist abgelegt unter KB2580188 .

Wenn Sie eine eigene Klasse fügen Sie den Abschnitt wie folgt zuzuordnen:

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

    public string MyAttr2
    {
        get;
        set;
    }
}

Sie können diesen Code verwenden:

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);

Ich bin spekulieren hier, aber ich vermute, es ist Ihre Konfigurationsdatei, die nicht vertrauenswürdig ist.

In Ihrem Fall Ihre Konfigurationsdatei eine Art ConsoleApplication1.AssetsSection verweist, die nicht einen starken Namen hat, die als Beweismittel verwendet werden.

Können Sie weitere Details und die genaue Fehlermeldung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top