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