none
Sliverlight 里用WebRequest的问题 RRS feed

  • 问题


  • private void Button_Click(object sender, RoutedEventArgs e)
    {
                WebRequest request = WebRequest.Create(http://www.baidu.com);
                request.Method = "GET";
                request.BeginGetRequestStream(new AsyncCallback(RequestReady), request);
                request.BeginGetResponse(new AsyncCallback(ResponseReady), request);
    }

    void RequestReady(IAsyncResult asyncResult)
    {
                MessageBox.Show("RequestComplete");
    }

    void ResponseReady(IAsyncResult asyncResult)
    {
                MessageBox.Show("ResponseComplete");
    }





    然后调试时出现下面的的错误信息...请各位帮帮忙!!

    2009年4月26日 16:15

答案

  • 这是由于Silverlight 安全权限引起的,没有跨域访问策略,不能使用WebRequest(也包括webclient)请求非本域外的内容。解决办法可以在自己的项目中添加一个webservice代理,来访问外域内容,所有sl访问外域都通过这个webservice代理来进行。
    Access.ashx


    <%@ WebHandler Language="C#" Class="ClientAccess" %>
    
    using System;
    using System.Collections;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.Xml.Linq;
    using System.Net;
    
        /// <summary>
        /// Summary description for $codebehindclassname$
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        public class ClientAccess : IHttpHandler
        {
    
            public void ProcessRequest(HttpContext context)
            {
                WebClient client = new WebClient();
                byte[] bytes = client.DownloadData(new Uri(context.Request["url"].ToString()));
                context.Response.BinaryWrite(bytes);
            }
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    通过访问这个代理就可以实现跨域操作了
    2009年4月27日 3:43
    版主
  • 详细例子参见
    http://dotnet.aspx.cc/article/95e21a06-795f-46f5-952e-77bc31b7538f/read.aspx
    【孟子E章】
    2009年4月27日 5:57
    版主

全部回复

  • 这是由于Silverlight 安全权限引起的,没有跨域访问策略,不能使用WebRequest(也包括webclient)请求非本域外的内容。解决办法可以在自己的项目中添加一个webservice代理,来访问外域内容,所有sl访问外域都通过这个webservice代理来进行。
    Access.ashx


    <%@ WebHandler Language="C#" Class="ClientAccess" %>
    
    using System;
    using System.Collections;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.Xml.Linq;
    using System.Net;
    
        /// <summary>
        /// Summary description for $codebehindclassname$
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        public class ClientAccess : IHttpHandler
        {
    
            public void ProcessRequest(HttpContext context)
            {
                WebClient client = new WebClient();
                byte[] bytes = client.DownloadData(new Uri(context.Request["url"].ToString()));
                context.Response.BinaryWrite(bytes);
            }
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    通过访问这个代理就可以实现跨域操作了
    2009年4月27日 3:43
    版主
  • 爪熊的方法是很简便的,你也可以使用同项目下的Aspx来请求,然后用Silverlight的webrequest请求这个aspx页面就行了用户奖牌用户奖牌用户奖牌用户奖牌用户奖牌


    My blog: http://blog.csdn.net/dotfun http://dotfun.cnblogs.com

    My contact: QQ:372900288 E-mail:372900288@qq.com msn:sellnet007@hotmail.com

    2009年4月27日 4:29
    版主
  • 详细例子参见
    http://dotnet.aspx.cc/article/95e21a06-795f-46f5-952e-77bc31b7538f/read.aspx
    【孟子E章】
    2009年4月27日 5:57
    版主