遇到 Web Server 中不能使用 XmlSerializer 的問題
剛剛解決了這個問題,查了N多的資料,終于被我解決了。
問題是如下的一段測試代碼:
[Serializable]public class TTT{public string NNN; public string DDD;}
void ttt()
{
TTT t = new TTT();
t.DDD = "dddddd"; t.NNN = "yyyyyyyy";
string xml;
using(MemoryStream s = new MemoryStream())
{
XmlSerializer ser = new XmlSerializer(typeof(TTT));
ser.Serialize(s, t);
s.Flush();
xml = Encoding.Default.GetString(s.ToArray());
}
using(MemoryStream s = new MemoryStream(Encoding.Default.GetBytes(xml), false))
{
XmlSerializer ser = new XmlSerializer(typeof(TTT));
TTT a = (TTT)ser.Deserialize(s);
System.Diagnostics.Debug.WriteLine(string.Format("a={0}; b={1}", a.DDD, a.NNN));
}
}
在本地直接調用的時候一切正常,但是放到WebServer下面就出錯:
Exception: System.InvalidOperationException
Message: Unable to generate a temporary class (result=1).
error CS2001: Source file 'C:\WINNT\TEMP\awwihhwh.0.cs' could not be found
error CS2008: No inputs specified
Source: System.Xml
at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, CompilerParameters parameters, Evidence evidence)
at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, CompilerParameters parameters, Assembly assembly, Hashtable assemblies)
at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type)
開始就意識到肯定是調用者 ttt() 的權限不夠,于是開始找如何把權限提高。首先用這個方法來強制提高權限,結果不幸:
PermissionSet ps = new PermissionSet(null);
ps.AddPermission(new SecurityPermission(SecurityPermissionFlag.Infrastructure
//|SecurityPermissionFlag.SerializationFormatter
|SecurityPermissionFlag.RemotingConfiguration
|SecurityPermissionFlag.AllFlags
));
ps.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read, new string[]{BASE_PATH,DATA_PATH}));
//ps.AddPermission(new FileIOPermission(System.Security.Permissions.PermissionState.Unrestricted));
ps.Assert();
然后開始考慮使用自定義的策略文件,找到了Microsoft Windows SharePoint Services 與代碼訪問安全,仿照它做了一個策略文件,在我的Web.config中加了如下的一段:
<system.web>
<securityPolicy>
<trustLevel name="aaa" policyFile="aaa.config"/>
</securityPolicy>
<trust level="aaa" originUrl=""/>
<!-- trust level="Full" originUrl=""/ -->
</system.web>
然后把系統的 C:\WINNT\Microsoft.NET\Framework\v1.1.4322\CONFIG\web_lowtrust.config 復制過來改名aaa.config,并在其中添加了一下內容,部分如下:
<NamedPermissionSets>
<PermissionSet class="
" Name="ASP.Net">

</PermissionSet>
<PermissionSet class="NamedPermissionSet" version="1" Name="_TtTtTtT_">
整個節點從節點 ASP.Net 復制過來的,改一個名字 _TtTtTtT_
</PermissionSet>
</NamedPermissionSets>
<CodeGroup class="FirstMatchCodeGroup" version="1" PermissionSetName="Nothing">
<!-- 在第一個 CodeGroup 之前插入 -->
<CodeGroup class="UnionCodeGroup" version="1" PermissionSetName="_TtTtTtT_">
<IMembershipCondition class="StrongNameMembershipCondition" version="1.1.1.12345"
Name="我的.dll"
PublicKeyBlob="
" />
</CodeGroup>
<!-- 原來的內容 -->

</CodeGroup>結果還是不行
,錯誤的原因是無法給“我的.dll”設置權限(看來以后還要多多研究這個內容)。
無奈之中,再到google搜索,結果發現確實有一個bug報告http://support.microsoft.com/default.aspx?scid=kb;en-us;322886,可惜是.net 1.0 的,我用的是1.1
。但是在這片文章http://support.microsoft.com/default.aspx?scid=317012中卻明確要求ASP.net 正常運行需要有%installroot%\ASP.NET Temporary Files 和 %windir%\temp 兩個目錄的權限。
最后,檢查兩個目錄的權限,發現前者有權限,而后者沒有。于是設置 c:\winnt\temp 讓 asp.net 有 Full Access權限。問題解決
!但是這個是不是M$的安裝程序的問題啊
??
整個過程歷時從前天下午到現在。痛苦![]()
另外,發現很多人都遇到相同的問題,有仁兄建議說重裝.net和vs,幸好沒聽他的,否則不累死也要后悔死。

公眾號:老翅寒暑

浙公網安備 33010602011771號