2009-11-04 18 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