Silverlight的HtmlPage.Window.Navigate和HyperlinkButton之间有什么区别?

4

我正在尝试让我的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

当我使用超链接按钮时,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文件时遇到了相同的问题。似乎点击HyperlinkButton比HtmlPage.Window.Navigate更安全,而IE会以不同的方式处理这些请求。 - Alexander K.
我认为这个问题与以下问题有关:https://stackoverflow.com/questions/16927571/silverlight-hyperlink-button-and-unc-path - Trinition
2个回答

1

这里有一篇简短的文章在这里,阐述了这个问题的一些情况 - 我发现HtmlPage.Window.Navigate在IE之外根本不起作用。

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

跟踪HyperlinkButton 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);

0

这可能是弹出窗口拦截器的问题。

您尝试在其他浏览器中或使用只接受 Uri 的 Navigate 重载进行操作了吗?

HtmlPage.Window.Navigate(uri);

我没有开启任何弹出窗口拦截器。实际上,在HamlPage.Window.Navigate情况下,弹出窗口确实会出现并保持打开状态,而下载正在进行中(因为是我的代码生成下载流,我可以轻松地使用断点暂停它)。IE只是在下载完成时关闭该弹出窗口,并且从未对已下载的文件执行任何操作(即启动关联程序)。 - Trinition
我还没有尝试过单参数版本。MSDN文档说这将在当前窗口中导航,我担心这会丢弃我的正在运行的Silverlight应用程序。 - Trinition
这实际上取决于操作系统来处理下载的文件,而不是IE。我怀疑您没有为您尝试下载的pkg文件类型配置处理程序。我相信您已经遇到过文件下载,其中下载链接不会重新加载当前页面,因为它在IE之外处理。作为测试,为什么不尝试更改此内容... Content-Disposition: attachment; filename=object-1.pkg 以返回_.zip_文件名。如果它起作用,那么问题就在于您的操作系统文件关联。 - BenCr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接