silverlight项目通常放在web程序里,通过webservice取出据。但是目前silverlight还 不支持cross-domain,因此不能直接访问webservice或者database。 目前有2种解决方案, 1〉将访问数据的webservice嵌入到web项目,这样,webservice和web app就在同一个domain。2〉访问数据的webservice是在另外的服务器上,这样就要通过proxy (实际上也是一个webservice)来访问取出据的webservice。
操作步骤如下:
solution 1.
1)新建web app, 工程名暂且叫 webinterface。 在这个工程中添加一个新的webservice Item,文件名WebService.asmx。 我们可以在这个文件操作数据库,或者访问webservice。 一个简单的例子
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public Data[] GetReturnIndex(string ...)
{
return .... // 在这里访问数据库/webservice数据并放回。
}
需要注意的是,在默认设置中,WebService.asmx文件中的
[System.Web.Script.Services.ScriptService]
是被注释掉的,必须去掉注释符号,silverlight才能通过script来访问web method返回的数据。 另外, 在webconfig 中加入
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
作为
<system.web>
的子节点, 这样系统才允许通过get方式访问。
到这里,数据读取到了刚才的 web service
2) 在silverlight项目中访问web app 中的webservice。
Silverlight项目中访问webservice是通过http实现的,首先得到webservice的相对路径,通过httpresponse返回所取得字符串。再根据已知的文件的格式解析
string serverUri = HtmlPage.DocumentUri.ToString();
int thisApp = serverUri.IndexOf("/Default.aspx");
serverUri = serverUri.Substring(0, thisApp) + "/WebService.asmx";
serverUri += "/LoadLocalTestData?shareClassId=" + _shareClassId + "&dateStart=" + dateStart + "&dateEnd=" + dateEnd; // 得到webapp中的webservice的路径
System.Uri webServiceUri = new System.Uri(serverUri);
// 通过http 访问webservice的数据,以stream返回
BrowserHttpWebRequest request = new BrowserHttpWebRequest(webServiceUri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader responseReader = new StreamReader(response.GetResponseStream());
string txtResponse = responseReader.ReadToEnd();
response.Close();
List<TimeSeriesData> tradingDatas = new List<TimeSeriesData>();
TradingData tradeData = null;
XmlReader reader = XmlReader.Create(new StringReader(txtResponse));
剩下来的事情就是对返回的串进行解析,得到想要的数据。