【问题标题】:Differences between Silverlight's HtmlPage.Window.Navigate and HyperlinkButton?Silverlight 的 HtmlPage.Window.Navigate 和 HyperlinkBut​​ton 的区别?
【发布时间】:2014-09-04 18:44:58
【问题描述】:

我正在尝试让我的 Silverlight 4.0 应用程序在用户单击某些内容以将它们带到其 Web URL 时启动关联的程序文件的文件扩展名,但无论我使用 HtmlPage.Window.Navigate,我都有不同的体验或超链接按钮。

我的 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 社区能够确认或否认这个问题。

【问题讨论】:

  • 我们在下载 excel 文件时遇到了同样的问题。似乎点击 HyperlinkBut​​ton 被视为比 HtmlPage.Window.Navigate 更安全,并且 IE 以不同方式处理此类请求。
  • 我认为另一个问题是相关的:stackoverflow.com/questions/16927571/…

标签: silverlight internet-explorer silverlight-4.0 hyperlink


【解决方案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);

【讨论】:

    【解决方案2】:

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

    您是否在任何其他浏览器中或仅使用 Uri 的 Navigate 重载尝试过此操作?

    HtmlPage.Window.Navigate(uri);
    

    【讨论】:

    • 我没有打开任何弹出窗口拦截器。事实上,在 HamlPage.Window.Navigate 的情况下,弹出窗口确实会发生并在下载过程中保持打开状态(因为它是我的代码生成下载的流,我可以很容易地用断点暂停它)。下载完成后,IE 只会关闭该弹出窗口,并且不会对下载的文件执行任何操作(即启动相关程序)。
    • 而且,不,我没有尝试过单参数版本。 MSDN 文档说这将在当前窗口中导航,我担心这会处理我正在运行的 Silverlight 应用程序。
    • 真正由操作系统来处理下载的文件,而不是 IE。我怀疑您没有为您尝试下载的 pkg 文件类型配置处理程序。我敢肯定你经历过文件下载,下载链接不会重新加载当前页面,因为它是在 IE 之外处理的。作为一个测试,你为什么不尝试改变它... Content-Disposition: attachment; filename=object-1.pkg 返回一个 .zip 文件名。如果可行,则问题出在您的操作系统文件关联
    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多