zoukankan      html  css  js  c++  java
  • 遇到 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,幸好没听他的,否则不累死也要后悔死。

  • 相关阅读:
    Windows平台下MySQL常用操作与命令
    button和sumbit提交表单的区别
    AjaxPro.Net的使用
    小写金额转换成大写
    sqlserver自动定时备份数据库并按日期命名
    dw文档的当前编码不能正确保存文档所有字符.....
    windows 2003 ii6 上运行asp出现http500错误
    图片提示预览效果
    一个网站优化seo的年终工作总结
    很COOL的相册
  • 原文地址:https://www.cnblogs.com/BigTall/p/51276.html
Copyright © 2011-2022 走看看