【问题标题】:GoDaddy won't let XmlUrlResolver runGoDaddy 不会让 XmlUrlResolver 运行
【发布时间】:2016-08-16 16:54:20
【问题描述】:

我正在尝试编写要托管的页面,但代码不断抛出异常。我认为问题在于服务器上的权限不会让 XmlUrlResolver 的子类被实例化,但我希望能得到一些帮助......

此代码确实适用于我的本地开发盒,如果我使用 File.ReadAllText(HostingEnvironment.MapPath("~/xml/home.xml")) 它确实有效,所以我相当确定它不是 IO 权限。 ...

例外:

     Security Exception
Description: The application attempted to perform an operation not allowed by the security policy.  To grant this application the required permission please contact your system administrator or change the application's trust level in the configuration file.

Exception Details: System.Security.SecurityException: Request failed.

Source Error:

Line 33:         t.Load(reader, null, new XsltUrlResolver());
Line 34:         sb = new StringBuilder(File.ReadAllText(HostingEnvironment.MapPath("~/xslt/url-encode.xslt")));
Line 35:     }
Line 36: </script>
Line 37: 

代码(这是我用来尝试缩小问题范围的一个简单页面):

<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="false" Inherits="System.Web.UI.Page" %>

<%@ Import Namespace="Web" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Web.Hosting" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Xml.Xsl" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.Web" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    public StringBuilder sb = new StringBuilder();

    public class XsltUrlResolver : XmlUrlResolver
    {
        public override Uri ResolveUri(Uri baseUri, string relativeUri)
        {
            if (baseUri != null)
                return base.ResolveUri(baseUri, relativeUri);
            else
                return base.ResolveUri(baseUri, HostingEnvironment.MapPath(relativeUri));
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        // create the readers for the xml and xsl
        XmlReader reader = XmlReader.Create(new StringReader(File.ReadAllText(HostingEnvironment.MapPath("~/xslt/home.xslt"))));
        XmlReader input = XmlReader.Create(new StringReader(File.ReadAllText(HostingEnvironment.MapPath("~/xml/home.xml"))));

        // create the xsl transformer
        XslCompiledTransform t = new XslCompiledTransform(true);
        t.Load(reader, null, new XsltUrlResolver());
        sb = new StringBuilder(File.ReadAllText(HostingEnvironment.MapPath("~/xslt/url-encode.xslt")));
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%= sb.ToString() %>
    </div>
    </form>
</body>
</html>

【问题讨论】:

    标签: c# .net xslt


    【解决方案1】:

    GoDaddy 共享主机帐户在 Medium Trust 下运行。有(至少)三种可能会导致您的代码与 Medium Trust 发生冲突:

    • XSLT 包含与 Medium Trust 不兼容的操作,例如嵌入式脚本。见http://social.msdn.microsoft.com/Forums/en-US/xmlandnetfx/thread/b643e335-f1b4-4fb3-b81f-f4ace3f156fa。除了删除脚本之外,我不知道有任何解决方法。
    • Medium Trust 可能不支持设置自定义XmlResolver(我看过一些关于此的论坛帖子)。如果这是真的,您可能需要预处理您的 XML,以避免需要自定义解析器。
    • 我在网上看到XmlResolver.ResolveUri 确实需要完全信任,因此您可能不允许在派生类中调用它。构建自己的解析器可能没问题,它不会调用基类的ResolveUri 方法。如果您这样做,请务必小心 - 自己解析 URL 是恶意数据访问您网络服务器上的私人文件的好方法!

    在 SO 上有一些关于 XmlResolver 的相关线程,包括this one,这可能很有用。

    【讨论】:

    • 感谢您的帮助。这是一个难题。我不再传递 XmlResolver,而是放置了导入样式表的完全限定网址。这已经解决了测试页面的问题,但是我的完整代码仍然会抛出安全异常。
    • 能否将异常的调用堆栈添加到您的问题中?既然您已解决了第一个解析程序问题,这将有助于了解失败的地方。另外,您的样式表是否包含任何脚本?听起来像脚本不能包含在中等信任下的编译样式表中。
    • 您可能还想调整自己的开发服务器以在中等信任下运行,以便您可以在离家更近的地方进行调试 - 可能会加快诊断速度,而不是每次尝试修复时都必须上传到 GoDaddy . :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2013-04-19
    • 2014-12-17
    • 2018-03-14
    相关资源
    最近更新 更多