Wie zum Lesen einer XML-Datei auf localhost von Silverlight-Anwendung?

Habe ich Vista mit IIS7.

Möchte ich das erstellen einer einfachen Silverlight-Anwendung, die liest eine xml-Datei von localhost.

Habe ich diese Datei (die ich kopieren musste und klicken Sie auf "zulassen" als administrator):

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

und können es sehen, wenn ich hier im browser:

http://localhost/data/customers.xml

Aber wenn ich den folgenden code ausführen, bekomme ich eine Ziel-Aufruf Ausnahme:

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

So habe ich 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>

Aber ich bekomme immer noch die Ziel-Aufruf Ausnahme Fehler.

Hier ist die vollständige innere Ausnahme:

{System.Sicherheit.SecurityException
---> System.Sicherheit.SecurityException:
Sicherheitsfehler bei
System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult
asyncResult) bei
System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.b__4(Object
sendState) bei
System.Net.Browser.AsyncHelper.<>c__DisplayClass2.b__0(Object sendState) --- Ende der internen
Ausnahmestapelüberwachung --- bei
System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback
beginMethod, Object state) bei
System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult
asyncResult) bei
System.Net.WebClient.GetWebResponse(WebRequest
request, IAsyncResult result) bei
System.Net.WebClient.OpenReadAsyncCallback(IAsyncResult
Ergebnis)}

update 1: Im windows-explorer habe ich dann rechts geklickt C:\inetpub\wwwroot\data und machte IIS_USERS ein co-Besitzer des Verzeichnisses. Aber immer noch die gleichen Fehler. 🙁

update 2: auch "jeder" Mitinhaber der C:\inetpub\wwwroot\data, gleiche Fehlermeldung. 🙁

update 3: eröffnete Befehlsfenster als administrator und ausgeführt mit diesem Befehl: netsh http add urlacl url=http://+:80/ user=MYDOMAIN\Benutzername"

Was muss ich sonst noch Lesen zu können, eine text-Datei von localhost aus einer Silverlight-Anwendung?

PRAGMATISCHE ANTWORT:

Zum testen nur lokal veröffentlichen, um die temporäre localhost webserver-port für die Sie gar nicht brauchen, eine cross-domain-Datei, dann die erforderlichen änderungen vornehmen, wenn Sie veröffentlichen 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;
                }

            }
        }        



    }
}
Kannst du die genaue Fehlermeldung, die du bekommst (mit StackTrace)?
ok, fügte der innere Ausnahme: Sicherheitsfehler ist nur "security error", das ist die genau die gleiche Fehlermeldung bekomme ich, wenn ich nicht die crossdomainpolicy.xml

InformationsquelleAutor Edward Tanguay | 2009-03-30

Schreibe einen Kommentar