How to read an XML file on localhost from Silverlight application?
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
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, 2022Comments
-
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; } } } } }