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; } } } } }
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.