在 Web 服务器上不注册 MIME 类型的情况下托管 Silverlight 的 XAML 文件






4.29/5 (4投票s)
IIS 会拒绝未知类型的文件,ISP 供应商可能尚未更新其服务器以包含 XAML MIME 类型。本文提出了一种托管 XAML 文件的变通方法。
引言
我正在使用 Silverlight 1.0 编写一个简单的 JavaScript 应用程序,它没有流媒体功能,并且想将其托管在公共 Web 服务器上。但是,互联网服务提供商尚未准备好 WPF,他们的 IIS 不响应未知内容类型 (XAML)。例如,带有 Silverlight 控件的页面是空白的,即,控件已创建但 XAML 未加载。
本文提出了一种托管简单 Silverlight 应用程序的变通方法,这些应用程序带有 XAML 文件,这些文件被 ISP 阻止或 MIME 类型尚未在 IIS 中更新。
背景
创建 Silverlight 控件后,它包含一个名为“source
”的属性,该属性指向要加载的 XAML 文件。请参阅 Visual Studio 为 Silverlight JavaScript 应用程序生成的代码(我正在使用 Visual Studio 2005)。
当引用服务器上的 XAML 文件时,会生成一个名为 createSilverlight()
的 JavaScript 函数。当执行此代码并且 Silverlight 调用服务器以获取 XAML 文件时,如果未返回或被 Web 服务器阻止,则会出现空白页面(没有错误!)。
解决方案
解决该问题的一种方法是将 XAML 文件的扩展名更改为其他名称,例如 XML 或 TXT,并在 createSilverLight()
方法中更改源文件扩展名以匹配相同的名称。如果您的项目已准备好部署并且您的项目截止日期是昨天,这是一个快速解决方案!
从长远来看,上述解决方案可能会成为一个部署问题,因为您必须在部署之前更改文件的扩展名和 JavaScript 文件(特别是如果您的项目非常动态并且不断增长,并且有多个 XAML 文件)。
一个更优雅的解决方案是在开发和生产中都有效,那就是拥有一个通用的 ASP.NET 处理程序来处理 XAML 文件。这不需要在 IIS 中注册 MIME 类型或修改 *web.config* 文件。另请注意,它仅适用于依赖 XAML 和 JavaScript 而没有其他扩展名的简单 Silverlight 应用程序。
通用文件处理程序的代码如下
public class GetXAMLFile : IHttpHandler
{
string fileList = ",scene.xaml,";
public void ProcessRequest(HttpContext context)
{
string fname = context.Request["fname"].ToString().ToLower();
// check if the file is in XAML file list you want to send
// for your applications only
if (fileList.IndexOf("," + fname + ",") == -1)
context.Response.End();
context.Response.ContentType = "text/xaml";
string uri = context.Request.Url.AbsoluteUri;
string xamlstring = System.IO.File.ReadAllText(
context.Server.MapPath(fname));
context.Response.Write(xamlstring);
context.Response.Flush();
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
在发送内容之前检查所请求文件的行是为了避免任何恶意应用程序调用此处理程序并访问所需 XAML 文件以外的文件的内容。
创建处理程序后,将 createSilverlight()
函数中的 source 行更改为
source: 'GetXAMLFile.ashx?fname=Scene.xaml'
现在,当 Silverlight 控件加载时,它会调用 ASHX 处理程序,该处理程序会将 XAML 文件的内容发送到客户端。
与上述 IIS 和 ASP.NET 组合的情况类似,如果您正在使用任何其他 Web 服务器并遇到类似问题,请编写并托管一个某种扩展类型的文件脚本,该脚本可以解释查询字符串并发送 XAML 文件的内容。请注意确保将 Response
内容类型设置为“text/xaml
”,以便客户端正确解释它。
历史
- 2007 年 11 月 28 日:首次发布