最近公司的一台伺服器,連續兩天建立 Hyper-V 的 Virtul Machine時,就會發生 Blue Screen Of Dead 的經典畫面。畫面中,出現了
IRQL_NOT_LESS_OR_EQUAL, 及
STOP: 0x0000000A (parameter1、 parameter2、 parameter3、 parameter4)
最後是找到了這個 KB979444,套上了 hotfix 才解決了問題。
最近公司的一台伺服器,連續兩天建立 Hyper-V 的 Virtul Machine時,就會發生 Blue Screen Of Dead 的經典畫面。畫面中,出現了
IRQL_NOT_LESS_OR_EQUAL, 及
STOP: 0x0000000A (parameter1、 parameter2、 parameter3、 parameter4)
最後是找到了這個 KB979444,套上了 hotfix 才解決了問題。
今天將寫了幾天的 Silverlight 部署到測試機時,一直發生錯誤。404 resource not found.
使用 Fiddler 來查詢,是在呼叫 RIA Service 時發生錯誤。 http://servername/virtul directory/ClientBin/My-Ria-Service.svc.svc/binary/MyMethod 404。
明明在我的機器可以執行啊!
爬了一下文,知道了原因。RIA Service 實在做的太好了,以致於在開發階段,幾乎不必手動增加必要的參考。而在 http://www.silverlight.net/getstarted/riaservices/ 下載的安裝檔,又直接幫我們註冊到 GAC 中,以致於一些部署需要的 dll 就被遺忘了, 這些設定通常在 Web.config 中會出現。
部署時,主要有兩種做法。一是 bin 另一種是 GAC。
在部署ASP.NET 專案中,加以下的參考,並且在Property 中標Copy Local 為 True。
第二種做法,是直接將 Ria Services 註冊到伺服器上。指令如下
msiexec /i RiaServices.msi SERVER=TRUE
可惜,這樣不會將 System.ServiceModel.dll , System.ComponentModel.DataAnnotations.dll 標示為 Copy Local = true。還是要手動將這兩個dll設定一下。
這次,由於網站的 SSL 憑證到期了,更新了SSL 憑證。更換後,有一家公司抱怨瀏覽網站時,會出現「未信任的憑證」問題。
只有這一位客戶哦!請客戶幫我們看一下憑證的問題,會出現「信任憑證授權單位無法確認這個憑證」的錯誤訊息。如下圖
檢視憑證路徑時,也少了一層根憑證。
因此,我判斷 Baltimore CyberTrust Root 這個憑證並未在「 信任的根憑證」中。
為什麼別的客戶ok,單獨這位客戶有這樣的議題呢?我找到一某一台相同問題的電腦,特別先看了在「 信任的根憑證」中,也相同地沒有這張憑證。
接著,我瀏覽了該網頁,並以 Fiddler 錄下的 Request ,如下圖。
答案揭曉。原來當我們瀏覽一個https網頁時,windows 會幫我們檢查SSL 憑證。而SSL 憑證的 CA 尚未匯入時,且是公開常見的CA時,windows update 會自動匯入 CA 任證。
該客戶由於控管嚴格,連 windows update 的 IP 都使用防火牆封鎖了,造成憑證路徑不正確的問題。
雖然只能檢視 https 網站這樣常見的動作,其後隱含了多少工作原理啊。這一次又學到新東西。
舊聞了,但今天才知道的訊息。根據Port80 Surveys the Top 1000 Corporations' Application Servers and Scripting Platforms (July 2007),ASP.NET 在2007 年時被採用的比例為 51.5%,遠超過第二名的Java platform 12.7%
而在這篇中Port80's 2010 - Top 1000 Corporation Web Servers,54.5%的伺服器是使用 IIS,但其中絕大部份仍使用 IIS 6.0。
Silverlight 預設只能存取同一個網站的服務。例如 http://server/ 下的 silverlight 就不能存取 http://server.domain.com/service.svc ,即使其實這兩者是同一台伺服器。此時,必須在Web伺服器的根目錄下放 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>
詳細使用方式見 讓服務可跨網域界限使用
與WPF TreeView 的 DataBinding (2) 相同的問題,仍然發生在 Silverlight 上。那 Silverlight 可以使用與 WPF 相同的解法嗎?不行,原因出在Silverlight 並設計出 DataTemplateSelector 這樣的概念。
但是,相同的問題該怎麼解決呢?
沒有?就自己打造一個。
using System.Windows; using System.Windows.Controls; namespace SilverlightTreeView1 { public abstract class DataTemplateSelector : ContentControl { public virtual DataTemplate SelectTemplate( object item, DependencyObject container) { return null; } protected override void OnContentChanged( object oldContent, object newContent) { base.OnContentChanged(oldContent, newContent); ContentTemplate = SelectTemplate(newContent, this); } } public class MyDataTemplateSelector : DataTemplateSelector { public DataTemplate FileTemplate { get; set; } public HierarchicalDataTemplate FolderTemplate { get; set; } public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) { if (item is MyFolder) return FolderTemplate; else return FileTemplate; } } }
xaml
<UserControl x:Class="SilverlightTreeView1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" xmlns:SilverlightTreeView1="clr-namespace:SilverlightTreeView1"> <UserControl.Resources> <SilverlightTreeView1:FolderHelper x:Key="helper" /> <sdk:HierarchicalDataTemplate x:Key="folder" ItemsSource="{Binding Items}"> <StackPanel Orientation="Horizontal"> <Image Source="/SilverlightTreeView1;component/Images/folder.png" /> <TextBlock Text="{Binding Name}" /> </StackPanel> </sdk:HierarchicalDataTemplate> <sdk:HierarchicalDataTemplate x:Key="file"> <StackPanel Orientation="Horizontal"> <Image Source="/SilverlightTreeView1;component/Images/doc.png" /> <TextBlock Text="{Binding Name}" /> </StackPanel> </sdk:HierarchicalDataTemplate> </UserControl.Resources> <Grid x:Name="LayoutRoot" Background="White"> <sdk:TreeView Name="treeView1" ItemsSource="{Binding Source={StaticResource helper}, Path=Items}"> <sdk:TreeView.ItemTemplate> <sdk:HierarchicalDataTemplate ItemsSource="{Binding Items}"> <SilverlightTreeView1:MyDataTemplateSelector Content="{Binding}" FolderTemplate="{StaticResource folder}" FileTemplate="{StaticResource file}" /> </sdk:HierarchicalDataTemplate> </sdk:TreeView.ItemTemplate> </sdk:TreeView> </Grid> </UserControl>
程式運行結果
程式碼下載
一個有趣的問題。以下的程式可以編譯嗎?
using System.Collections.Generic; using System.Linq; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { List<A> listA = new List<A>(); List<B> listB = new List<B>(); listA.AddRange(listB.AsEnumerable()); } } internal class A{} class B : A{} } 答案很好玩,.NET Framwork 4可以,.NET 2.0 不可以。
.NET Framwork 2 的錯誤訊息是
cannot convert from 'System.Collections.Generic.IEnumerable<B>' to 'System.Collections.Generic.IEnumerable<A>'
這是為什麼呢?B 是 A 的子代,把 B 當成A 加到 listA 這個集合中,看起來沒有什麼不對。
原因是 .NET Framwork 2 的泛型(Generics)尚不支援這樣的場景。這樣的狀況稱 Generics Variance。以前的處理方式請參考Variance in Generic Types。
當然,這樣的問題已經在 .NET Framework 4 中得到了解決。