Comment lire un fichier XML sur le localhost de l'application Silverlight?

J'ai Vista avec IIS7.

Je veux créer une application Silverlight simple que lit un fichier xml à partir de localhost.

J'ai créé ce fichier (que j'ai eu à copier et cliquez sur "autoriser" en tant qu'administrateur):

C:\inetpub\wwwroot\data\customers.xml

et peut le voir quand je rentre ici dans un navigateur:

http://localhost/data/customers.xml

Mais lorsque j'exécute le code suivant, je reçois un exception d'appel cible:

using System;
using System.Net;
using System.Windows.Controls;
using System.IO;

namespace TestXmlRead234
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            WebClient client = new WebClient();
            client.OpenReadAsync(new Uri("http://localhost/data/customers.xml", UriKind.Absolute));
            client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
        }

        void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            StreamReader myReader = new StreamReader(e.Result);
            Output.Text = myReader.ReadLine();
            myReader.Close();
        }
    }
}

J'ai donc créé C:\inetpub\wwwroot\crossdomainpolicy.xml:

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
    <cross-domain-access>
        <policy >
            <allow-from http-request-headers="Content-Type">
                <domain uri="*"/>
            </allow-from>
            <grant-to>
                <resource path="/" include-subpaths="true"/>
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>

Mais j'ai toujours le exception d'appel cible erreur.

Ici, c'est la pleine exception interne:

{Système.De sécurité.SecurityException
---> Système.De sécurité.SecurityException:
Sicherheitsfehler bei
Système.Net.Le navigateur.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult
asyncResult) à
Système.Net.Le navigateur.BrowserHttpWebRequest.<>c__DisplayClass5.b__4(Objet
sendState) à
Système.Net.Le navigateur.AsyncHelper.<>c__DisplayClass2.b__0(Objet sendState) --- Ende der internen
Ausnahmestapelüberwachung --- bei
Système.Net.Le navigateur.AsyncHelper.BeginOnUI(SendOrPostCallback
beginMethod, état de l'Objet) à
Système.Net.Le navigateur.BrowserHttpWebRequest.EndGetResponse(IAsyncResult
asyncResult) à
Système.Net.WebClient.GetWebResponse(WebRequest
demande, IAsyncResult résultat) à
Système.Net.WebClient.OpenReadAsyncCallback(IAsyncResult
result)}

mise à jour 1: Dans l'explorateur windows, j'ai ensuite cliqué avec le bouton droit C:\inetpub\wwwroot\data et fait IIS_USERS un co-propriétaire de ce répertoire. Mais toujours la même erreur. 🙁

mise à jour 2: également fait "tout le monde", co-propriétaire de C:\inetpub\wwwroot\data, même erreur. 🙁

mise à jour 3: ouvert la fenêtre de commande en tant qu'administrateur et exécuté cette commande: netsh http ajoutez urlacl url=http://+:80/ utilisateur=MYDOMAIN\MyUserName

Que dois-je avoir pour être capable de lire un fichier texte à partir de localhost partir d'une application Silverlight?

PRAGMATIQUE RÉPONSE:

Pour tester en local juste de publier temporaire localhost port du serveur web pour lequel vous n'avez même pas besoin d'un cross-domain fichier, puis apportez les modifications nécessaires lorsque vous publiez live:

using System;
using System.Linq;
using System.Net;
using System.Windows.Controls;
using System.IO;
using System.Xml.Linq;

namespace TestWeb124
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            WebClient wc = new WebClient();
            wc.OpenReadAsync(new Uri("http://localhost:49512/customers.xml", UriKind.Absolute));
            wc.OpenReadCompleted += wc_OpenReadCompleted;
        }

        private void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                Output.Text = e.Error.Message;
                return;
            }
            using (Stream s = e.Result)
            {
                XDocument doc = XDocument.Load(s);
                Output.Text = doc.ToString(SaveOptions.OmitDuplicateNamespaces);
                var customers = from c in doc.Descendants("customer")
                                select new
                                {
                                    FirstName = c.Element("firstName").Value
                                };

                foreach (var customer in customers)
                {
                    Output.Text += customer.FirstName;
                }

            }
        }        



    }
}
Vous pouvez poster message d'erreur exact que vous obtenez (avec trace de la pile)?
ok ajouté l'exception interne: Sicherheitsfehler est juste "erreur de sécurité", c'est exactement la même erreur que j'obtiens lorsque je n'ai pas l'crossdomainpolicy.xml

OriginalL'auteur Edward Tanguay | 2009-03-30