Как прочитать XML-файл на локальном хосте из приложения Silverlight? - PullRequest
3 голосов
/ 30 марта 2009

У меня 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;
                }

            }
        }        



    }
}

Ответы [ 5 ]

1 голос
/ 30 марта 2009

Из того, что я видел, обычное поведение заключается в создании веб-службы, которая может полностью обойти междоменные проблемы Silverlight, а затем передача кода Silverlight через эту веб-службу.

1 голос
/ 30 марта 2009
0 голосов
/ 07 июня 2009

Ваш xml плохо сформирован и имеет дополнительный> в верхней части.

0 голосов
/ 30 марта 2009

У меня были похожие проблемы с доступом к страницам на моем локальном IIS из приложения Silverlight. В итоге я настроил HTTP-прокси, чтобы посмотреть, что происходит. В моем случае Silverlight отправлял запрос на crossdomainpolicy.xml, а IIS правильно возвращал его, поэтому проблем с ACL определенно не было, но по какой-то причине Silverlight просто не принял его.

Попробовав бесконечные опции в файле crossdomainpolicy, я решил протестировать альтернативный вариант файла политики Flash crossdomain.xml, который Silverlight также понимает и работает впервые.

Может работать на вас.

<?xml version=""1.0""?>
<!DOCTYPE cross-domain-policy SYSTEM ""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"">
<cross-domain-policy>
    <allow-http-request-headers-from domain=""*"" headers=""*""/>
</cross-domain-policy>

Edit: чтобы попробовать это, вам нужно будет удалить файл crossdomainpolicy.xml, так как Silverlight сначала запрашивает, и если он обнаружит, что он не будет запрашивать crossdomain.xml.

0 голосов
/ 30 марта 2009

Попробуйте удалить атрибут http-request-headers="Content-Type", я не уверен, что это значит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...