2009-11-04 45 views
0

我正在尝试编写一个页面来托管,代码一直在抛出异常。我相信问题是服务器上的权限不会让XmlUrlResolver的子类得到实例化,但我想用这个请求一些帮助...GoDaddy不会让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> 

回答

4

GoDaddy共享主机帐户在Medium Trust下运行。有如何你的代码可能会触犯中等信任的运行(至少)三种可能性:

  • 的XSLT包含的业务,如嵌入脚本,这与中等信任不兼容。见http://social.msdn.microsoft.com/Forums/en-US/xmlandnetfx/thread/b643e335-f1b4-4fb3-b81f-f4ace3f156fa。除了删除剧本之外,我不知道有什么方法可以解决这个问题。
  • 设置自定义XmlResolver可能不支持中等信任(我见过几个关于此论坛的帖子)。如果这是真的,您可能需要预先处理您的XML,以避免需要自定义解析器。
  • 我在线阅读了XmlResolver.ResolveUri确实需要完全信任,所以您可能不允许在派生类中调用它。建立你自己的解析器可能没有问题,它不会调用基类的ResolveUri方法。如果你这样做,要非常小心 - 自己解析URL是恶意数据访问Web服务器上私人文件的好方法!

有关于XmlResolver的一些相关的线索,包括this one,这可能是有用的。

+0

谢谢你的帮助。这是一个难题。我不再传入XmlResolver,而是将导入的样式表的标准网址。这已经解决了测试页面的问题,但是我的完整代码仍然会抛出安全异常。 – 2009-11-04 22:22:27

+0

你可以添加异常的调用堆栈到你的问题吗?这将有助于了解现在您修复第一个解决问题的位置。另外,你的样式表是否包含任何脚本?听起来像脚本不能包含在中等信任下的已编译样式表中。 – 2009-11-05 01:03:23

+0

您可能还想调整自己的开发者服务器以在中等信任度下运行,这样您可以在离家较近的地方进行调试 - 这可能会加快诊断速度,而不是每次尝试修复时必须上传到GoDaddy。 :-) – 2009-11-05 01:04:22