如何从Silverlight应用程序读取localhost上的XML文件?

时间:2009-03-30 11:31:07

标签: xml silverlight

Vista IIS7

我想创建一个简单的Silverlight应用程序,从localhost读取xml文件

我创建了这个文件(我必须复制并以管理员身份点击“允许”):

  

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   ---&GT; System.Security.SecurityException:   Sicherheitsfehler bei   System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult的   asyncResult)bei   System.Net.Browser.BrowserHttpWebRequest&LT;&GT; c__DisplayClass5.b__4(对象   sendState)bei   System.Net.Browser.AsyncHelper。&lt;&gt; 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的   请求,IAsyncResult结果)bei   System.Net.WebClient.OpenReadAsyncCallback(IAsyncResult的   结果)}

更新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应用程序中读取localhost中的文本文件?

PRAGMATIC ANSWER:

要在本地进行测试,只需发布​​到您甚至不需要跨域文件的临时localhost网络服务器端口,然后在实时发布时进行必要的更改:

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 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

从我所看到的,通常的行为是创建一个可以完全解决Silverlight的跨域问题的Web服务,然后让Silverlight代码通过该Web服务进行通信。

答案 2 :(得分:0)

尝试删除属性http-request-headers="Content-Type",我不确定这是什么。

答案 3 :(得分:0)

我有类似的问题可以从Silverlight应用程序访问本地IIS上的页面。我最终配置了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>

编辑:要尝试这一点,您需要删除crossdomainpolicy.xml文件,因为Silverlight首先请求它,如果它发现它不会请求crossdomain.xml。

答案 4 :(得分:0)

您的xml格式不正确且有额外的&gt;靠近顶部。