您的位置:首页 > 理论基础 > 计算机网络

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

2010-12-25 01:33 204 查看

1跨域验证

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>

2与数据源连接

1 SOAP services

服务端

新建一个asmx 得到

[WebService(Namespace = "http://xxxx.net/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class SampleAsmx : System.Web.Services.WebService
{

[WebMethod]
public string GetCoolText(int number)
{
switch (number)
{
case 0: return "zero";
case 1: return "one";

default: return "unknown";

}

}

客户端

private void GetString_Click(object sender, RoutedEventArgs e) {
Binding myBinding = new BasicHttpBinding();
EndpointAddress myEndpoint = new
EndpointAddress("http://localhost:55905/SampleAsmx.asmx");

SilverService.SampleAsmxSoapClient proxy = new
SilverService.SampleAsmxSoapClient(myBinding, myEndpoint);

proxy.GetCoolTextCompleted += proxy_GetCoolTextCompleted;

proxy.GetCoolTextAsync(1);
}
void proxy_GetCoolTextCompleted(object sender,
SilverService.GetCoolTextCompletedEventArgs e) {
Results.Text = e.Result;
(sender as SilverService.SampleAsmxSoapClient).CloseAsync();
}

客户端的config

<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="SampleAsmxSoap" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:55905/SampleAsmx.asmx" binding="basicHttpBinding"
bindingConfiguration="SampleAsmxSoap" contract="SilverService.SampleAsmxSoap"
name="SampleAsmxSoap" />
</client>
</system.serviceModel>
</configuration>

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

2 RESTful Sercvices

从RESTFUL的services上获取信息

private void GetSingleXml_Click(object sender, RoutedEventArgs e)
{
UIThread = SynchronizationContext.Current;
string rawPath
= "http://www.silverlightinaction.com/Authors.svc/SingleXml/{0}";
Uri path = new Uri(string.Format(rawPath, Input.Text),
UriKind.Absolute);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
request.BeginGetResponse(SingleXmlCallBack, request);
}
private void SingleXmlCallBack(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response
= (HttpWebResponse)request.EndGetResponse(result);
Stream responseStream = response.GetResponseStream();
UIThread.Post(UpdateUiText, responseStream);
}

发送信息过去

private void Test_Click(object sender, RoutedEventArgs e)
{
UIThread = SynchronizationContext.Current;
Uri path = new
Uri("http://www.silverlightinaction.com/Authors.svc/Update/Brown",
UriKind.Absolute);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
request.Method = "POST";
request.ContentType = "application/xml";
request.BeginGetRequestStream(AddPayload, request);
}
private void AddPayload(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest) result.AsyncState;
StreamWriter dataWriter =
new StreamWriter(request.EndGetRequestStream(result));
dataWriter.Write("<?xml version=\"1.0\"?><Author><FirstName>Bob" +
"</FirstName><LastName>Smith</LastName></Author>");
dataWriter.Close();
request.BeginGetResponse(SingleJsonCallBack, request);
}
private void SingleJsonCallBack(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response =
(HttpWebResponse)request.EndGetResponse(result);
Stream responseStream = response.GetResponseStream();
UIThread.Post(UpdateUiText, responseStream);
}

3HTTP方式

1手动构造

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

HttpWebRequest 类

HttpWebRequest request =
(HttpWebRequest)WebRequestCreator.ClientHttp.Create(
new Uri("http://api.10rem.net/Authors"));
request.Method = "PUT";

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

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

为指定的 URI 注册 WebRequest 子代。

WebRequest.RegisterPrefix( http://www.baidu.com, WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix(
"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

private void SendRequest()
{
HttpWebRequest.RegisterPrefix(
"http://", WebRequestCreator.ClientHttp);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(
new Uri("http://XX.net"));
req.UseDefaultCredentials = false;
req.Credentials =
new NetworkCredential("Pete", "password");//任意多参数
req.BeginGetResponse(OnRequestCompleted, req);
}
private void OnRequestCompleted(IAsyncResult asyncResult)
{
HttpWebRequest request =
(HttpWebRequest)asyncResult.AsyncState;
HttpWebResponse response =
(HttpWebResponse)request.EndGetResponse(asyncResult);
................

}

4使用cookies

private void SendRequest()
{
WebRequest.RegisterPrefix(
"http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix(
"https://", WebRequestCreator.ClientHttp);

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(
new Uri("http://baidu.com"));
CookieCollection cookies = new CookieCollection();
cookies.Add(new Cookie("firstName", "Pete"));
cookies.Add(new Cookie("lastName", "Brown"));
cookies.Add(new Cookie("lastAccess", DateTime.Now.ToString()));
req.CookieContainer = new CookieContainer();
req.CookieContainer.Add(
new Uri("http://baidu.com"), cookies);
req.BeginGetResponse(OnRequestCompleted, req);
}
private void OnRequestCompleted(IAsyncResult asyncResult)
{
HttpWebRequest req =
(HttpWebRequest)asyncResult.AsyncState;
HttpWebResponse response =
(HttpWebResponse)req.EndGetResponse(asyncResult);
...
foreach (Cookie cookie in response.Cookies)
{
Debug.WriteLine(cookie.Name + ":" + cookie.Value);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: