How to read an XML file on localhost from Silverlight application?

13,122

Solution 1

From what I've seen, the usual behaviour is to create a webservice that can get around Silverlight's cross domain issues entirely, then have Silverlight code communicate through that web service.

Solution 2

Making a Service Available Across Domain Boundaries

Share:
13,122
Angry Dan
Author by

Angry Dan

web/software developer, .NET, C#, WPF, PHP, software trainer, English teacher, have philosophy degree, love languages, run marathons my tweets: http://www.twitter.com/edward_tanguay my runs: http://www.tanguay.info/run my code: http://www.tanguay.info/web my publications: PHP 5.3 training video (8 hours, video2brain) my projects: http://www.tanguay.info

Updated on June 05, 2022

Comments

  • Angry Dan
    Angry Dan almost 2 years

    I have Vista with IIS7.

    I want to create a simple Silverlight application that reads an xml file from localhost.

    I created this file (which I had to copy and click "allow" as administrator):

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

    and can see it when I go here in a browser:

    http://localhost/data/customers.xml

    But when I run the following code, I get a target invocation exception:

    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 I created 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>
    

    But I still get the target invocation exception error.

    Here is the full inner exception:

    {System.Security.SecurityException ---> System.Security.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 result)}

    update 1: In windows explorer, I then right clicked C:\inetpub\wwwroot\data and made IIS_USERS a co-owner of that directory. But still get the same error. :-(

    update 2: also made "everyone" co-owner of C:\inetpub\wwwroot\data, same error. :-(

    update 3: opened command window as administrator and executed this command: netsh http add urlacl url=http://+:80/ user=MYDOMAIN\MyUserName

    What else do I have to be able to read a text file from localhost from a Silverlight application?

    PRAGMATIC ANSWER:

    For testing locally just publish to the temporary localhost webserver port for which you don't even need a cross-domain file, then make necessary changes when you publish 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;
                    }
    
                }
            }        
    
    
    
        }
    }