在這篇文章中,WCF扮演服務器,向外提供LoginVaild服務;Silverlight扮演客戶端,調用WCF提供的LoginVaild服務。思路有了,下面進行代碼實現。
數據庫腳本實現
新建T_User表,在表中添加兩個字段username、password,向表中插入一條數據admin admin,腳本如下:
USE [test]
GO
/****** Object: Table [dbo].[T_User] Script Date: 09/28/2014 21:12:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[T_User](
[username] [varchar](20) NOT NULL,
[password] [varchar](20) NOT NULL,
CONSTRAINT [PK_T_User] PRIMARY KEY CLUSTERED
(
[username] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[T_User] ([username], [password]) VALUES (N'admin', N'admin')
WCF服務器實現
1.新建一個WCF服務庫項目,在默認生成的IServer1.cs接口在添加LoginVaild服務的聲明:
[OperationContract]
bool LoginVaild(string userName, string password);
2.添加ADO.Net實體數據模型文件--Model.edmx,用於對數據表T_User的訪問;
3.在Service1.svc中對LoginVaild方法進行實現:
public bool LoginVaild(string userName, string password)
{
bool result = false;
//需要訪問的ADO.Net數據實體模型
using (SLtestEntitiesSecond entities = new SLtestEntitiesSecond())
{
var user = entities.T_User.Where(c => c.username == userName && c.password == password).SingleOrDefault();
if (user == null)
{
result = false;
}
else
{
result = true;
}
}
return result;
}
4.在項目的根目錄添加跨域訪問文件clientaccesspolicy.xml,內容如下:
<?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>
5.設定WCF服務器使用特定端口進行訪問,方法:選中WCF服務器項目-->郵件屬性-->Web-->特定端口,輸入1316。這樣保證我們每次可以通過1316端口訪問WCF提供的服務。
到此,WCF服務器端配置完成,選中Service1.svc文件,在浏覽器中浏覽器下WCF提供的服務。
Silverlight客戶端實現
1.新建Silverlight應用程序,在引用中添加服務引用,在地址欄輸入Service1.svc文件在浏覽器中的路徑,比如我的是:http://localhost:1316/Service1.svc;
2.新建Silverlight用戶控件Login.xaml文件,在顯示頁面添加用戶名、密碼TextBox和登錄Button;
3.在Login.xaml後台通過調用WCF提供的服務對用戶輸入進行判斷,代碼如下:
private void button1_Click(object sender, RoutedEventArgs e)
{
string userName = txtusername.Text.Trim();
string password = txtpassword.Text.Trim();
Service1Client client = new Service1Client();
client.LoginVaildCompleted += new EventHandler<LoginVaildCompletedEventArgs>(client_LoginVaildCompleted);
client.LoginVaildAsync(userName, password);
client.CloseAsync();
}
void client_LoginVaildCompleted(object sender, LoginVaildCompletedEventArgs e)
{
if (e.Error == null)
{
//MessageBox.Show(e.Result.ToString());
if (e.Result == true)
{
this.Content = new MainPage();
}
else
{
MessageBox.Show("用戶名或密碼錯誤!");
}
}
else
{
MessageBox.Show(e.Error.ToString());
}
}
4.在App.xaml配置文件設置Login.xaml為起始頁,代碼如下:
private void Application_Startup(object sender, StartupEventArgs e)
{
this.RootVisual = new Login();
}
到此,客戶端配置完成,運行Silverlight客戶端項目即可查看結果。源碼下載地址:
------------------------------------------分割線------------------------------------------
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2015年資料/2月/27日/Silverlight+WCF實現跨域調用/
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
------------------------------------------分割線------------------------------------------
現在回首整個實現過程,有點面向服務編程的意思:WCF提供一個服務,然後把訪問服務的接口公開,想調用此服務的項目只要添加此服務的引用便能調用WCF提供的服務。
在實現過程中,有個問題至今尚未解決,在WCF服務器項目中配置ADO.Net實體數據模型時,如果是用SQL Server的SQL Server身份驗證方式登錄,便會報“服務器返回了錯誤 Not found”異常;改成Windows身份驗證問題解決。這是個治標不治本的解決方案,對此問題,希望大神能夠給出解釋。