Silverlight和#x27之间的差异;s HtmlPage.Window.Navigate和HyperlinkButton?

Silverlight和#x27之间的差异;s HtmlPage.Window.Navigate和HyperlinkButton?,silverlight,internet-explorer,silverlight-4.0,hyperlink,Silverlight,Internet Explorer,Silverlight 4.0,Hyperlink,我试图让我的Silverlight 4.0应用程序在用户单击某个内容将其带到其web URL时启动关联的程序文件(文件扩展名),但无论使用HtmlPage.Window.Navigate还是HyperlinkButton,我都有不同的体验 我的web URL是指向我的资源的RESTful URL,例如。“http://.../objects/object-1/package". URL实际上是一个ASP.NET MVC 2控制器,它返回带有自定义扩展名的zip内容。也就是说,HTTP响应头如下

我试图让我的Silverlight 4.0应用程序在用户单击某个内容将其带到其web URL时启动关联的程序文件(文件扩展名),但无论使用HtmlPage.Window.Navigate还是HyperlinkButton,我都有不同的体验

我的web URL是指向我的资源的RESTful URL,例如。“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
当我使用Hyperlink按钮时,Internet Explorer会提示我打开、保存或取消。当我选择“打开”时,它将打开我与*.pkg关联的应用程序:

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

我已经使用Fiddler2验证了在这两种情况下,HTTP请求和HTTP响应看起来是相同的。这似乎是Internet Explorer或Silverlight的细微差别,我不确定自己是否能够克服,但我希望Stackoverflow社区能够确认或否认这个问题。

这可能是弹出窗口阻止程序的问题

您是否在任何其他浏览器中尝试过这种方法,或者使用仅获取Uri的导航重载

HtmlPage.Window.Navigate(uri);
有一篇简短的文章对这个问题进行了说明-我发现
HtmlPage.Window.Navigate
在IE之外对我根本不起作用

但回到最初的问题,使用dotPeek,我可以看到以下区别:

单击HyperlinkButton后,它会将调用委托给agcore:(XcpImports.cs)

和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);

我没有打开弹出窗口阻止程序。事实上,在HamlPage.Window.Navigate案例中,在下载过程中,弹出窗口确实会出现并保持打开状态(因为是我的代码生成下载的流,所以我可以很容易地用断点将其暂停)。IE只是在下载完成时关闭弹出窗口,从不对下载的文件做任何操作(即启动相关程序)。而且,不,我没有尝试过单参数版本。MSDN文档说,它将在当前窗口中导航,我担心这会丢弃我正在运行的Silverlight应用程序。处理下载的文件实际上取决于操作系统,而不是IE。我怀疑您没有为尝试下载的pkg文件类型配置处理程序。我相信你已经体验过文件下载,下载链接不会重新加载当前页面,因为它是在IE之外处理的。作为一个测试,你为什么不尝试更改这个。。。内容处置:附件;filename=object-1.pkg返回.zip文件名。如果它起作用,那么您的操作系统文件关联就是问题所在。我们在下载excel文件时遇到了相同的行为。似乎点击HyperlinkButton比HtmlPage.Window.Navigate更安全,IE处理此类请求的方式也不同。我认为另一个问题与此相关:
[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);
[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);