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 >
< 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 " ;
}
}
[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();
}
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 >
< 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);
}
{
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 " ;
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);
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
实现 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);
................
}
{
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);
}
}
{
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);
}
}