热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> Silverlight>>正文内容

Silverlight杂记-获取网络数据源的几种方式

发布时间:2010年12月25日点击数: 佚名

1跨域验证

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <access-policy> 
  3. <cross-domain-access> 
  4. <policy> 
  5. <allow-from http-request-headers="*"> 
  6. <domain uri="*"/> 
  7. </allow-from> 
  8. <grant-to> 
  9. <resource path="/" include-subpaths="true"/> 
  10. </grant-to> 
  11. </policy> 
  12. </cross-domain-access> 
  13. </access-policy> 

2与数据源连接
1 SOAP services

服务端
新建一个asmx 得到

  1. [WebService(Namespace = "http://xxxx.net/")] 
  2.    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
  3.    [System.ComponentModel.ToolboxItem(false)] 
  4.    public class SampleAsmx : System.Web.Services.WebService 
  5.    { 
  6.  
  7.        [WebMethod] 
  8.        public string GetCoolText(int number) 
  9.        { 
  10.            switch (number) 
  11.            { 
  12.                case 0: return "zero"; 
  13.                case 1: return "one";      
  14.  
  15.                default: return "unknown"; 
  16.  
  17.            } 
  18.  
  19.        } 

客户端

  1. private void GetString_Click(object sender, RoutedEventArgs e) { 
  2.           Binding myBinding = new BasicHttpBinding(); 
  3.           EndpointAddress myEndpoint = new 
  4.             EndpointAddress("http://localhost:55905/SampleAsmx.asmx"); 
  5.  
  6.           SilverService.SampleAsmxSoapClient proxy = new 
  7.             SilverService.SampleAsmxSoapClient(myBinding, myEndpoint); 
  8.  
  9.           proxy.GetCoolTextCompleted += proxy_GetCoolTextCompleted; 
  10.  
  11.           proxy.GetCoolTextAsync(1); 
  12.       } 
  13.       void proxy_GetCoolTextCompleted(object sender, 
  14.         SilverService.GetCoolTextCompletedEventArgs e) { 
  15.           Results.Text = e.Result; 
  16.           (sender as SilverService.SampleAsmxSoapClient).CloseAsync(); 
  17.       } 

客户端的config

  1. <configuration> 
  2.     <system.serviceModel> 
  3.         <bindings> 
  4.             <basicHttpBinding> 
  5.                 <binding name="SampleAsmxSoap" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
  6.                     <security mode="None" /> 
  7.                 </binding> 
  8.             </basicHttpBinding> 
  9.         </bindings> 
  10.         <client> 
  11.             <endpoint address="http://localhost:55905/SampleAsmx.asmx" binding="basicHttpBinding" 
  12.                 bindingConfiguration="SampleAsmxSoap" contract="SilverService.SampleAsmxSoap" 
  13.                 name="SampleAsmxSoap" /> 
  14.         </client> 
  15.     </system.serviceModel> 
  16. </configuration> 

这里会涉及到一堆WCF 的知识。可能需要你额外去学习。

2 RESTful Sercvices

从RESTFUL的services上获取信息

  1. private void GetSingleXml_Click(object sender, RoutedEventArgs e) 
  2. UIThread = SynchronizationContext.Current; 
  3. string rawPath 
  4. "http://www.silverlightinaction.com/Authors.svc/SingleXml/{0}"
  5. Uri path = new Uri(string.Format(rawPath, Input.Text), 
  6. UriKind.Absolute); 
  7. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path); 
  8. request.BeginGetResponse(SingleXmlCallBack, request); 
  9. private void SingleXmlCallBack(IAsyncResult result) 
  10. HttpWebRequest request = (HttpWebRequest)result.AsyncState; 
  11. HttpWebResponse response 
  12. = (HttpWebResponse)request.EndGetResponse(result); 
  13. Stream responseStream = response.GetResponseStream(); 
  14. UIThread.Post(UpdateUiText, responseStream); 
  15.  
  16. 发送信息过去 
  17.  
  18. private void Test_Click(object sender, RoutedEventArgs e) 
  19. UIThread = SynchronizationContext.Current; 
  20. Uri path = new 
  21. Uri("http://www.silverlightinaction.com/Authors.svc/Update/Brown"
  22. UriKind.Absolute); 
  23. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path); 
  24. request.Method = "POST"
  25. request.ContentType = "application/xml"
  26. request.BeginGetRequestStream(AddPayload, request); 
  27. private void AddPayload(IAsyncResult result) 
  28. HttpWebRequest request = (HttpWebRequest) result.AsyncState; 
  29. StreamWriter dataWriter = 
  30. new StreamWriter(request.EndGetRequestStream(result)); 
  31. dataWriter.Write("<?xml version=\"1.0\"?><Author><FirstName>Bob" + 
  32. "</FirstName><LastName>Smith</LastName></Author>"); 
  33. dataWriter.Close(); 
  34. request.BeginGetResponse(SingleJsonCallBack, request); 
  35. private void SingleJsonCallBack(IAsyncResult result) 
  36. HttpWebRequest request = (HttpWebRequest)result.AsyncState; 
  37. HttpWebResponse response = 
  38. (HttpWebResponse)request.EndGetResponse(result); 
  39. Stream responseStream = response.GetResponseStream(); 
  40. UIThread.Post(UpdateUiText, responseStream); 

3HTTP方式

1手动构造

使用System.Net.Browser.WebRequestCreator 来构造。

  1. HttpWebRequest  类 
  2.  
  3. HttpWebRequest request = 
  4. (HttpWebRequest)WebRequestCreator.ClientHttp.Create( 
  5. new Uri("http://api.10rem.net/Authors")); 
  6. request.Method = "PUT"

2为特定的网站或协议自动使用client stack

如为某个网站 HTTP 和 SSL都使用 client stack 你可以这么写

为指定的 URI 注册 WebRequest 子代。

  1. WebRequest.RegisterPrefix( 
  2. http://www.baidu.com, WebRequestCreator.ClientHttp); 
  3. WebRequest.RegisterPrefix( 
  4. "https://www.baidu.com", WebRequestCreator.ClientHttp); 

 

3Authentication credentials

The client networking stack supports NTLM, basic, and digest authorization

NTLM是NT LAN Manager的缩写,这也说明了协议的来源。NTLM 是 Windows NT 早期版本的标准安全协议,Windows 2000 支持 NTLM 是为了保持向后兼容。Windows 2000内置三种基本安全协议之一。

在网络环境中,NTLM 用作身份验证协议以处理两台计算机(其中至少有一台计算机运行 Windows NT 4.0 或更早版本)之间的事务。具有此配置的网络称为“混合模式”,这是 Windows Server 2003 家族中的默认设置

参考

http://www.codeproject.com/KB/aspnet/ASPDOTNETauthentication.aspx

http://social.msdn.microsoft.com/Forums/zh-SG/sqldataaccess/thread/c60a86f0-cda5-47b4-8448-0c5730084896

实现 digest authorization

  1. private void SendRequest() 
  2. HttpWebRequest.RegisterPrefix( 
  3. "http://", WebRequestCreator.ClientHttp); 
  4. HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create( 
  5. new Uri("http://XX.net")); 
  6. req.UseDefaultCredentials = false
  7. req.Credentials = 
  8. new NetworkCredential("Pete""password");//任意多参数 
  9. req.BeginGetResponse(OnRequestCompleted, req); 
  10. private void OnRequestCompleted(IAsyncResult asyncResult) 
  11. HttpWebRequest request = 
  12. (HttpWebRequest)asyncResult.AsyncState; 
  13. HttpWebResponse response = 
  14. (HttpWebResponse)request.EndGetResponse(asyncResult); 
  15. ................ 
  16.  

4使用cookies

  1. private void SendRequest() 
  2. WebRequest.RegisterPrefix( 
  3. "http://", WebRequestCreator.ClientHttp); 
  4. WebRequest.RegisterPrefix( 
  5. "https://", WebRequestCreator.ClientHttp); 
  6.  
  7.  
  8. HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create( 
  9. new Uri("http://baidu.com")); 
  10. CookieCollection cookies = new CookieCollection(); 
  11. cookies.Add(new Cookie("firstName""Pete")); 
  12. cookies.Add(new Cookie("lastName""Brown")); 
  13. cookies.Add(new Cookie("lastAccess", DateTime.Now.ToString())); 
  14. req.CookieContainer = new CookieContainer(); 
  15. req.CookieContainer.Add( 
  16. new Uri("http://baidu.com"), cookies); 
  17. req.BeginGetResponse(OnRequestCompleted, req); 
  18. private void OnRequestCompleted(IAsyncResult asyncResult) 
  19. HttpWebRequest req = 
  20. (HttpWebRequest)asyncResult.AsyncState; 
  21. HttpWebResponse response = 
  22. (HttpWebResponse)req.EndGetResponse(asyncResult); 
  23. ... 
  24. foreach (Cookie cookie in response.Cookies) 
  25. Debug.WriteLine(cookie.Name + ":" + cookie.Value); 

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作