WCF (Web Services) + Silverlight 4 + DataGrid + 連接 Database 使用方法 (SOAP Server Side / SOAP Client Side)
(SOAP Server Side)
IService1.cs |
using System; using System.Collections.Generic; using System.Runtime.Serialization; using System.ServiceModel; namespace WcfService1 { // 注意: 您可以使用 [重構] 功能表上的 [重新命名] 命令同時變更程式碼和組態檔中的介面名稱 “IService1″。 [ServiceContract] public interface IService1 { [OperationContract] List SendItem(); // TODO: 在此新增您的服務作業 } // 使用下列範例中所示的資料合約,新增複合型別至服務作業。 [DataContract] public class Player { [DataMember] public int Player_ID; [DataMember] public string Player_Name; [DataMember] public int Team_ID; } } |
Service1.svc.cs |
using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient; namespace WcfService1 { // 注意: 您可以使用 [重構] 功能表上的 [重新命名] 命令同時變更程式碼、svc 和組態檔中的類別名稱 "Service1"。 public class Service1 : IService1 { public List SendItem() { List PlayerList = new List(); String connectionString1 = "Data Source=.\\SqlExpress; Initial Catalog=Soccer; Integrated Security=SSPI"; SqlConnection con1 = new SqlConnection(connectionString1); con1.Open(); StringBuilder sb = new StringBuilder(); sb.Append("SELECT * FROM dbo.Player;"); SqlCommand cmd1 = new SqlCommand(sb.ToString(), con1); SqlDataReader dr = cmd1.ExecuteReader(); if (dr.HasRows) { while (dr.Read()) { PlayerList.Add(new Player { Player_ID = (int)(dr["Player_ID"]), Player_Name = dr["Player_Name"].ToString().Trim(), Team_ID = (int)(dr["Team_ID"]) }); } } cmd1.Dispose(); con1.Dispose(); return PlayerList; } } } |
(SOAP Client Side – 需自行增加 Service References)
MainPage.xaml |
…… <Grid x:Name="LayoutRoot" Background="White"> …… <sdk:DataGrid AutoGenerateColumns="False" Height="263" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="376"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="Player ID" Width="75" CanUserResize="False" IsReadOnly="True" Binding="{Binding Player_ID}" /> <sdk:DataGridTextColumn Header="Player Name" Width="200" CanUserResize="False" IsReadOnly="True" Binding="{Binding Player_Name}" /> <sdk:DataGridTextColumn Header="Team ID" Width="75" CanUserResize="False" IsReadOnly="True" Binding="{Binding Team_ID}" /> </sdk:DataGrid.Columns> </sdk:DataGrid> …… </Grid> …… |
MainPage.xaml.cs |
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using SilverlightApplication7.ServiceReference1; namespace SilverlightApplication7 { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); Service1Client _Proxy = new Service1Client(); _Proxy.SendItemCompleted += (s, args) => dataGrid1.ItemsSource = args.Result; _Proxy.SendItemAsync(); } } } |
clientaccesspolicy.xml (令 Silverlight 得到 Permission 連接 SOAP Server – 放係 SOAP Server 既 Root Folder 上) |
<?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> |
crossdomain.xml (令 Silverlight 得到 Permission 連接 SOAP Server – 放係 SOAP Server 既 Root Folder 上) |
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <allow-http-request-headers-from domain="*" headers="*"/> </cross-domain-policy> |