0

语言:C# 5.0
平台:IIS 7.5 上的 ASP.Net 4.5
操作系统:Windows Server 2008 R2 Standard 64 位

我正在开发一个旧的 Web 窗体应用程序来添加从我们的数据库动态生成的 XML 站点地图。我创建了一个通用处理程序 (.ashx) 并正在使用 XmlWriter 构建 XML。我打电话给 site.com/SitemapIndex.ashx,瞧!到目前为止,一切都很好。

我有一个业务要求,即站点地图以 .xml 扩展名结尾。我在 web.config 中添加了一个简单的 URL 重写规则,我的本地钻机通过 SitemapIndex.ashx 文件处理 SitemapIndex.xml。

当我将解决方案部署到我们的登台服务器时,我在 SitemapIndex.xml 文件上收到 404 not found 错误。但是 .ashx 仍然有效,所以我在该服务器上添加了一个处理程序映射。我为使用 System.Web.UI.SimpleHandlerFactory 的路径 *.xml 使用了托管处理程序。当我再次请求 SitemapIndex.xml 时,输出正确呈现。

然后我尝试在服务器上请求一个物理 XML 文件并收到以下错误消息:“没有为扩展 '.xml' 注册构建提供程序。您可以在 machine.config 或 web.config 的部分中注册一个。确保它有一个 BuildProviderAppliesToAttribute 属性,其中包含值“Web”或“All”。”

现在我可以通过我的 .ashx 处理程序动态处理 .xml 文件,但将不再提供真正的 xml 文件。我需要两者都做。非常感谢任何帮助!

4

2 回答 2

0

我使用的解决方案是删除我为 *.xml 创建的处理程序映射,并为我希望 ASP.Net 处理的特定文件添加一个。在我的开发平台上一切都已经正常工作了,所以我在我的暂存和发布配置上使用了配置转换来添加我在部署时想要的处理程序。我的 web.staging.config 文件的相关部分如下所示:

<system.webServer>
  <!-- Handler mappings for our xml sitemaps-->
  <handlers>
    <add name="SimpleHandlerFactory-SitemapIndex" path="SitemapIndex.xml" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" resourceType="Unspecified" preCondition="integratedMode" xdt:Transform="Insert"  />
  </handlers>
</system.webServer>
于 2013-04-19T15:39:29.147 回答
0

我认为问题是“返回物理 XML 文件”

所以你应该正确设置你的标题信息。

在你的 ashx 中,

内容类型应该是

内容类型:应用程序/八位字节流

                 context.Response.ContentType = "application/octet-stream"; 
                 context.Response.AddHeader("Content-Transfer-Encoding", "binary");

                FileInfo fileInfo = new FileInfo(xmlFileName);
                long length = fileInfo.Length;

                context.Response.WriteFile(xmlFileName, 0, length);

我希望我能很好地理解这个问题,与 URLRewrite 无关,它与中继无关。

于 2013-04-19T14:56:45.417 回答