2011年4月20日 星期三

Silverlight如何簽署XAP與組件

正確的使用簽署XAP與組件,可以讓遠端電腦也可以使用OOB或是In-Browser的功能。

1. 打開Silverlight專案的[屬性]後,選擇[簽署]標籤可以進入簽署的畫面。

2. 在選擇[簽署XAP檔案],並選用[建立測試憑證]將會產生憑證檔。

image

3. 按下[其他詳細資料],我們可以發現,憑證並不受信任。

image

4. 我們可以透過[安裝憑證]來安裝憑證。在安裝時請選擇[將所有憑證放入以下的存放區]。

image

5. 請選擇[個人]、[受信任的根憑證授權單位]與[受信任的發行者],亦即須安裝三次憑證,各自放在不同的憑證存放區。

5.1 個人 - 專案編譯時使用,客戶端可以不用安裝。

5.2 受信任的根憑證授權單位、受信任的發行者 - 真正通訊時使用,客戶端一定要裝這兩項才可以使用。

image

5.3 在安裝[受信任的根憑證授權單位]時,出現的安全性警告請選擇[是]來繼續安裝憑證。

image

6. 可以使用certmgr.exe來確認屏障的狀態。

image

7. 最後選擇[簽署組件],並選擇憑證的金鑰檔即可。

image

8. 匯出公開憑證供客戶安裝使用(客戶端需安裝到[受信任的根憑證授權單位]與[受信任的發行者]存放區)

image

image

2011年4月19日 星期二

[Silverlight]OOB抓取IE並取得SilverlightHost

using (dynamic shellApp = AutomationFactory.CreateObject("Shell.Application"))
{
    dynamic IEObject = null;
    var shellWin = shellApp.Windows();
    for (int i = 0; i < shellWin.Count; i++)
    {
        //MessageBox.Show(shellWin.Item(i).FullName);                        
        if ((shellWin.Item(i).FullName as string).IndexOf("iexplore.exe", StringComparison.OrdinalIgnoreCase) > 0)
        {
            IEObject = shellWin.Item(i);
            //IEObject.navigate("http://www.google.com");
        }
    }
    if (IEObject != null)
    {                        
        MessageBox.Show("IEObject != null");
        //MessageBox.Show(IEObject.Document.GetType().ToString());                        
        
        SilverlightHost sh = IEObject.Document.GetElementById("silverlightControlHost") as SilverlightHost;          
        //MessageBox.Show(IEObject.Document.GetElementById("silverlightControlHost").innerHTML);
    }
}

2011年4月18日 星期一

多In/Out參數預存程序的查詢與處理

image

[OperationContract]
public VoteStatus SetVoteInfo(int? activityObjectID, int? voterMemberID, int? activityID)
{
    ActivityEntities ent = new ActivityEntities();
    ObjectParameter isVoteOp = new ObjectParameter("isvote", typeof(int));
    ObjectParameter billsOp = new ObjectParameter("bills", typeof(int));
    ent.VoteUp(activityObjectID, voterMemberID, activityID, isVoteOp, billsOp);          
    VoteStatus v = new VoteStatus();
    v.IsVote = ((int)isVoteOp.Value == 1) ? true : false;
    v.ObjectBills = (int)billsOp.Value;
    return v;
}
[DataContract]
public class VoteStatus
{
    [DataMember]
    public Boolean IsVote
    { get; set; }
    [DataMember]
    public int ObjectBills
    { get; set; }
}
參考資料:

[Silverlight]取得DataTemplate中的控制項

<!-- DataTemplate 資源 -->
<DataTemplate x:Key="DataTemplatePopList">
	<Grid d:DesignWidth="99" d:DesignHeight="148" Height="130" Width="130">
		<Button x:Name="VoteButton" Content="投票" />
                <TextBlock x:Name="VoteTextBlock" Text="{Binding ObjectBills}" />
		<Image x:Name="VoteImage" Source="{Binding ImageSource}" />
	</Grid>
</DataTemplate>
<!-- 使用DataTemplate資源 -->
<ListBox x:Name="VoteListBox" ItemTemplate="{StaticResource DataTemplatePopList}" />
//取得DataTemplate中的控制項
ListBoxItem voteListBoxItem = (ListBoxItem)(VoteListBox.ItemContainerGenerator.ContainerFromItem(VoteListBox.SelectedItem));
TextBlock voteTextBlock = FindVisualChild<TextBlock>(voteListBoxItem, "VoteTextBlock");
//尋找視覺化樹下的子項目
private childItem FindVisualChild<childItem>(DependencyObject obj, String childName) where childItem : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null &&
            child is childItem &&
            child.GetValue(NameProperty).ToString() == childName)
            return (childItem)child;
        else
        {
            childItem childOfChild = FindVisualChild<childItem>(child, childName);
            if (childOfChild != null)
                return childOfChild;
        }
    }
    return null;
}

2011年4月14日 星期四

安裝WCF RIA Services SP2 Preview後無法編譯之前版本的解決辦法

1. 編譯SP2 Preview之前的RIA Services專案,出現 沒有為 "CreateRiaClientFilesTask" 工作指定必要參數 "ClientFrameworkPath" 的值。


2. 打開C:\Program Files\MSBuild\Microsoft\Silverlight\v4.0\Microsoft.Ria.Client.targets


3. 在CreateRiaClientFilesTask區段(大約在303行)加入ClientFrameworkPath="$(FrameworkPathOverride)"


4. 關閉VS2010,再打開重建專案就行啦!!

2011年4月11日 星期一

Entity Framework的函式匯入複雜集合用法

複雜集合其實指的正是一般查詢資料庫所得到的二維表格結構,這也是我們常需要使用的。

  • 執行預存程序Carousel_Update2,取得Name和MenuName兩個欄位。

image

  • 在函式匯入時選擇"複雜",並由"取得資料行資訊"確定資料名稱與型別,在"建立新複雜型別"後,可以在"複雜"的下拉選項中修改名稱。

image

  • 透過ObjectContext來呼叫預存程序,返回ObjectResult<複雜型別的名稱>。每一個Record對應一個複雜型別。

image

2011年4月6日 星期三

開發與佈署WCF Services的正確設定

目的:同時能夠在開發與佈署時最大化的共用設定,減少不必要的程式或設定修改。

1. 在Web.config中的host區段中個別增加開發與佈署使用的baseAddress。

    此時會設定開發使用的埠號,也需要在"專案名稱.Web"的屬性中指定通訊埠。

image

2. 在專案的Service Reference中的Service Proxy名稱上按右鍵,選取"設定服務參考"。

image

3. 依據目前的狀態(開發或佈署)修改位址,這邊的位址必須要和Web.config中的host區段相匹配。

image

2011年4月4日 星期一

WCF Services的客戶端更新

更新WCF Services的客戶端,必須保持設定檔與服務內容的同步更新,步驟如下:

  1. 更新xxx.ClientConfig的位置,如要佈署在某一台主機上,必須要將原來的localhost做變更。
  2. 由服務的右鍵快捷選單來"更新服務參考",這邊的位址必須與xxx.ClientConfig裡的位址一致。

image