У меня Vista с IIS7 .
Я хочу создать простое приложение Silverlight, которое читает файл xml с localhost .
Я создал этот файл (который мне пришлось скопировать и нажать «Разрешить» от имени администратора):
C:\inetpub\wwwroot\data\customers.xml
и вижу это, когда я захожу сюда в браузере:
http://localhost/data/customers.xml
Но когда я запускаю следующий код, я получаю целевое исключение вызова :
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();
}
}
}
Итак, я создал 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>
Но я все еще получаю исключение целевого вызова .
Вот полное внутреннее исключение:
{System.Security.SecurityException
---> System.Security.SecurityException:
Sicherheitsfehler bei
System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse (IAsyncResult
asyncResult) bei
System.Net.Browser.BrowserHttpWebRequest. <> C__DisplayClass5.b__4 (Объект
sendState) bei
System.Net.Browser.AsyncHelper. <> C__DisplayClass2.b__0 (объект sendState) --- Ende der internen
Ausnahmestapelüberwachung --- bei
System.Net.Browser.AsyncHelper.BeginOnUI (SendOrPostCallback
beginMethod, состояние объекта) bei
System.Net.Browser.BrowserHttpWebRequest.EndGetResponse (IAsyncResult
asyncResult) bei
System.Net.WebClient.GetWebResponse (WebRequest
запрос, результат IAsyncResult) bei
System.Net.WebClient.OpenReadAsyncCallback (IAsyncResult
результат)} * 1 047 *
обновление 1: В проводнике Windows я затем щелкнул правой кнопкой мыши C:\inetpub\wwwroot\data
и сделал IIS_USERS совладельцем этого каталога. Но все равно получаю ту же ошибку. : - (
обновление 2: также сделало совладельца "все" C:\inetpub\wwwroot\data
, та же ошибка. : - (
обновление 3: открыло окно команд как администратор и выполнило эту команду: netsh http add urlacl url = http://+:80/ user = MYDOMAIN \ MyUserName
Что еще мне нужно, чтобы иметь возможность читать текстовый файл с локального хоста из приложения Silverlight?
ПРАГМАТИЧЕСКИЙ ОТВЕТ:
Для локального тестирования просто опубликуйте на временном порту локального веб-сервера, для которого вам даже не нужен междоменный файл, а затем внесите необходимые изменения при публикации в реальном времени:
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;
}
}
}
}
}