2011-04-13 27 views
4

我試圖讓我的Silverlight 4.0應用程序啓動相關的程序文件的一個文件擴展名,當用戶點擊某些內容到他們的網址,但我有不同的經驗,無論我使用HtmlPage.Window.Navigate或HyperlinkBut​​ton。Silverlight的HtmlPage.Window.Navigate和HyperlinkBut​​ton之間的區別?

我的網址是我的資源的RESTful網址,例如, 「HTTP://.../objects/object-1/package」。該URL實際上是一個ASP.NET MVC 2控制器,它返回帶有自定義擴展名的zip內容。也就是說,HTTP響應頭的樣子:

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/10.0.0.0 
Date: Wed, 13 Apr 2011 17:22:19 GMT 
X-AspNet-Version: 4.0.30319 
Content-Disposition: attachment; filename=object-1.pkg 
Transfer-Encoding: chunked 
Cache-Control: private 
Content-Type: application/zip 
Connection: Close 

當我使用一個hyperlinkbutton,Internet Explorer會提示我打開,保存或取消。當我選擇打開,它會打開我曾與*的.pkg關聯的應用程序:

<HyperlinkButton TargetName="_blank" NavigateUri="http://localhost:8023/objects/object-1/package">Launch!</HyperlinkButton> 

但是,如果我不是使用最終使用HtmlPage.Window.Navigate命令,IE只打開一個窗口,然後迅速關閉:

string url = string.Format("{0}/objects/object-{1}/package", _webBaseUrl, objectId.Value); 
Uri uri = new Uri(url); 
HtmlPage.Window.Navigate(uri, "_blank"); 

我已經驗證了使用Fiddler2,在這兩種情況下,HTTP請求和HTTP響應看起來都一樣。這似乎是Internet Explorer或Silverlight細微差別,我不知道我可以克服,但我希望Stackoverflow社區可以確認或否認此問題。

+2

我們遇到了與下載Excel文件相同的行爲。看起來,單擊HyperlinkBut​​ton被視爲比HtmlPage.Window.Navigate更安全,IE處理這些請求的方式也不同。 – 2011-07-08 11:20:03

+0

我認爲這個問題是相關的:https://stackoverflow.com/questions/16927571/silverlight-hyperlink-button-and-unc-path – Trinition 2014-09-05 12:50:04

回答

0

這可能是一個彈出式窗口攔截器問題。

您是否在任何其他瀏覽器中嘗試過這種方法,或者導航過載只需要一個Uri?

HtmlPage.Window.Navigate(uri); 
+0

我沒有彈出窗口阻止程序打開。事實上,在HamlPage.Window.Navigate案例中,彈出窗口實際上確實發生並在下載過程中保持打開狀態(因爲它是我的代碼,用於生成下載的流,我可以輕鬆地用斷點暫停)。 IE只會在下載完成時關閉該彈出窗口,並且不會對下載的文件執行任何操作(即啓動相關程序)。 – Trinition 2011-04-15 13:24:57

+0

而且,不,我沒有嘗試單參數版本。 MSDN文檔說,將在當前窗口中導航,我擔心會丟棄正在運行的Silverlight應用程序。 – Trinition 2011-04-15 13:25:31

+0

這是真的由操作系統來處理下載的文件,而不是IE。我**懷疑**您沒有爲您要下載的pkg文件類型配置處理程序。我相信你已經經歷了文件下載,下載鏈接不會重新加載當前頁面,因爲它在IE之外處理。作爲一個測試你爲什麼不嘗試和改變這個... _Content-Disposition:attachment; filename = object-1.pkg_返回一個_.zip_文件名。如果它工作,它是你的OS文件關聯是問題 – BenCr 2011-04-15 13:46:43

1

有一個簡短的文章here流人在這個問題上的一些光 - 我發現HtmlPage.Window.Navigate沒有工作,爲我所有IE之外的。

但是回到原來的問題,使用dotPeek我可以看到以下區別:

跟蹤HyperlinkBut​​ton的OnClick,它代表調用agcore:(XcpImports.cs)

[DllImport("agcore", EntryPoint = "NavigateToSafeURI", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] 
private static uint NavigateToSafeURINative(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string location, [MarshalAs(UnmanagedType.LPWStr)] string target, bool checkUserInitiatedAction); 

和HtmlPage.Window.Navigate(uri)發出此呼叫:

[DllImport("agcore")] 
public static int DOM_Invoke(IntPtr pBrowserService, IntPtr pObject, [MarshalAs(UnmanagedType.LPWStr)] string pszMethodName, int nArgCount, [MarshalAs(UnmanagedType.LPArray)] NativeMethods.ScriptParam[] ppParams, ref NativeMethods.ScriptParam pResult, ref NativeMethods.ExceptionInfo pExcepInfo); 
相關問題