介绍:
这个快速入门示例演示了如何借助http来发送和接收“朴素的”xml请求。
(有时候我们也指POX:Plain Old XML)
POX包括一个没有信封的soap xml。(解释一下soap:简单对象访问协议,simple object Access protocol.这个协议规定了一个soap包含有外层的信封,和一个soap头,和soap 体。这个外面的信封主要是用于在企业级应用中涉及到的分布式服务的事务,信任,安全,这些机制由信封来完成扩展功能。)
POX 能被许多种类的客户端接收和发送,包括不支持soap本地请求的浏览器,POX对于需要在互联网间交互数据,但是却不需要WS-*级别的协议(例如,非http数据传输,其他的请求/响应模型的消息格式,基于消息的安全,可靠性,事务等)
POX 是用一个新的类来发送请求:BrowserHttpWebRequest,通过这个类:HttpWebResponse来接收请求。
注意:BrowserHttpWebRequest目前并不支持跨域调用,目前的版本需要基于银光程序要和他的目标:ASP.NET AJAX Web service 部署在同一台服务器上。
(译者评价:如果调用服务不可以跨域,那么将会对其发展有巨大的限制,因为不可能全世界所有你想调用的服务都跟你在一台服务器上。比如航班即时信息,天气预报,你就需要实现跨域访问才行。不过这个似乎对于微软的人不难做到,因为asp.net ajax的使用代理跨域实现应该可以借鉴到这来。)
使用POX需要一下的步骤:
创建一个web 服务。
创建一个银光项目。
加入同步连接web服务的托管代码。
加入异步连接web服务的托管代码。
先决条件:
Microsoft Silverlight 1.1 Alpha.
Microsoft Visual Studio Code Name "Orcas" Beta 1.
Microsoft Silverlight Tools Alpha for Visual Studio Code Name "Orcas" Beta 1.
1 创建一个服务:
如果对如何创建一个服务有疑问,可以访问: http://msdn2.microsoft.com/en-us/library/41e7c6d1-dcb9-4423-b3af-60b792edb28b
2 创建一个银光项目:
如果对如何创建一个银光项目有疑问,可以访问: http://myspace.silverlight.cn/Quickstart1.1_CH/Start/CreateProject.aspx
3.1 同步调用web服务:
点击按钮的事件执行的就是构造一个请求资源,代码如下:
1. string symbol = _textBox.GetAttribute("value");
2. // The target web service must be on the same server as this Silverlight application.
3. string serverUri = HtmlPage.DocumentUri.ToString();
4. int thisApp = serverUri.IndexOf("/Silverlight.net");
5. // Create the web service Url with this server as its base.
6. serverUri = serverUri.Substring(0, thisApp) + "/Silverlight.net.webservice/cs/WebService.asmx";
7. // Pass the input string to the EchoInput method in the web service.
System.Uri webServiceUri = new System.Uri(serverUri + "/EchoInput?input=" + symbol);
3,2 调用这个服务:
1. _status.Text = String.Format("Calling {0}\n\r", webServiceUri.ToString());
_request = new BrowserHttpWebRequest(webServiceUri);
3.3 处理响应:
4 HttpWebResponse response = (HttpWebResponse)_request.GetResponse();
5 // Read response
6 StreamReader responseReader = new StreamReader(response.GetResponseStream());
7 string RawResponse = responseReader.ReadToEnd();
8 XmlReader xr = XmlReader.Create(new StringReader(RawResponse));
9 // Get main element
10 xr.ReadToFollowing("string");
11 // Get following text node
12 xr.Read();
13 _result.Text = "XmlReader parsed \"" + xr.Value + "\"";
14 xr.Close();
_request.Close();
代码主要是对响应流的解析成xml流,然后输出。
4 异步调用web服务:
4.1 构造服务的uri
1. string symbol = _textBox.GetAttribute("value");
2. // The target web service must be on the same server as this Silverlight application.
3. string serverUri = HtmlPage.DocumentUri.ToString();
4. int thisApp = serverUri.IndexOf("/Silverlight.net");
5. // Create the web service Url with this server as its base.
6. serverUri = serverUri.Substring(0, thisApp) + "/Silverlight.net.webservice/cs/WebService.asmx";
7. // Pass the input string to the EchoInput method in the web service.
System.Uri webServiceUri = new System.Uri(serverUri + "/EchoInput?input=" +
4.2 调用服务:
5 status.Text = String.Format("Calling {0}\r\n", webServiceUri.ToString());
6 _request = new BrowserHttpWebRequest(webServiceUri);
7 // Include the request object as the IAsyncResult.AsyncState property.
8 IAsyncResult iar = _request.BeginGetResponse(new AsyncCallback(OnResponseDownload),
_request);
4.3 处理请求:
5 public void OnResponseDownload(IAsyncResult iar)
6 {
7 string parsedtext = string.Empty;
8 try
9 {
10 // Use the request object from the IAsyncResult.AsyncState property to obtain the response.
11 HttpWebResponse response = ((HttpWebRequest)iar.AsyncState).EndGetResponse(iar);
12 if (response.StatusCode != HttpStatusCode.OK)
13 throw new ApplicationException("HttpStatusCode " +
14 response.StatusCode.ToString() + " was returned.");
15 // Read response
16 StreamReader responseReader = new StreamReader(response.GetResponseStream());
17
18 string rawResponse = responseReader.ReadToEnd();
19 response.Close();
20 XmlReader xr = XmlReader.Create(new StringReader(rawResponse));
21 // Get main element
22 xr.ReadToFollowing("string");
23 // Get following text node
24 xr.Read();
25 _result.Text = "XmlReader parsed \"" + xr.Value + "\"";
26 xr.Close();
27 responseReader.Close();
28 }
29 catch (Exception ex)
30 {
31 _status.Text = ex.Message;
32 }
}
这个异步的步骤是.net中的典型异步模型,客户端在服务器端注册一个异步方法传递相关参数后,线程立即返回。等到服务器端处理完毕,就回调客户端刚才在服务器端注册的那个回调方法,并传递相关参数,很容易看懂。
翻译自:http://myspace.silverlight.cn/Quickstart1.1_CH/Remote/UsingREST.aspx