[C#] .NET Core/Standard 1.X 項目中如何使用XmlIgnoreAttribute等標準範圍外的內容,兼談如何解決“violation of security transparency rules failed”(違反安全透明規則失敗)異常

来源:http://www.cnblogs.com/zyl910/archive/2017/10/04/dotnet_standard_use_xmlignoreattribute.html
-Advertisement-
Play Games

作者: "zyl910" 一、緣由 XML序列化是一個很常用的功能,但對於.NET Core/Standard,其直到2.0版才內置支持XML序列化。具體來說, .NET Core 2.0 或 .NET Standard 2.0 才有 "XmlIgnoreAttribute" 類,而1.X版(.NE ...


作者: zyl910

一、緣由

XML序列化是一個很常用的功能,但對於.NET Core/Standard,其直到2.0版才內置支持XML序列化。具體來說, .NET Core 2.0 或 .NET Standard 2.0 才有 XmlIgnoreAttribute類,而1.X版(.NET Core 1.0~1.1 或 .NET Standard 1.0~1.6)版沒有。
這一點可以在官網的API參考頁面(.NET API Browser)驗證,若以 .NET Core/Standard 1.X版查看 XmlIgnoreAttribute 類,會被回退到 .NET Framework 4.7。這就表示XML序列化功能是在.NET Core/Standard 1.X版標準範圍外的。

可是XML序列化是很常用的功能,特別是XmlIgnoreAttribute很常用。有什麼辦法可以使 .NET Core/Standard 1.X 項目中 能使用它呢?

二、在 .NET Core 項目中使用NuGet的包,工作正常

查了一下,發現NuGet上有一個叫 System.Xml.XmlSerializer 的包。
把該包加入 .NET Core 項目,果然能正常使用XML序列化功能了。

三、在 .NET Standard 項目中使用NuGet的包,遇到“violation of security transparency rules failed”異常

3.1 問題

既然.NET Core項目能工作,那麼應該也能用到.NET Standard項目中。
於是我嘗試了一下,在.NET Standard類庫項目中增加此NuGet包。編譯成功了,隨後在使用時發現問題——

  • 在.NET Framework項目引用它(.NET Standard類庫項目)時,能正常工作。
  • 但在.NET Core項目引用它時,運行時卻報告“violation of security transparency rules failed”(違反安全透明規則失敗)異常。
Unhandled Exception: System.InvalidOperationException: There was an error reflecting type 'ZylLib.UnionTypes.UnionShort'. ---> System.MethodAccessException: Attempt to access method System.Xml.Serialization.XmlIgnoreAttribute..ctor() in violation of security transparency rules failed.
  at System.RuntimeMethodHandle.CheckLinktimeDemands(IRuntimeMethodInfo method, RuntimeModule module, Boolean isDecoratedTargetSecurityTransparent)
  at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes, Boolean isDecoratedTargetSecurityTransparent)
  at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeFieldInfo field, RuntimeType caType)
  at System.Attribute.GetCustomAttributes(MemberInfo element, Boolean inherit)
  at System.Xml.Serialization.XmlAttributes..ctor(MemberInfo memberInfo)
  at System.Xml.Serialization.XmlReflectionImporter.GetAttributes(MemberInfo memberInfo)
  at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
  at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
  at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
  --- End of inner exception stack trace ---
  at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
  at System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel model, XmlRootAttribute root, String defaultNamespace, RecursionLimiter limiter)
  at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace)
  at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
  at ZylLib.UnionTypes.UnionTypesExample.TestShort(StringBuilder sb)
  at ZylLib.UnionTypes.UnionTypesExample.Output(StringBuilder sb)
  at ZylLib.UnionTypes.ConsoleExample.Program.Main(String[] args)

3.2 中途分析

調試時查了一下程式集的位置,發現所引用的是這個dll——

C:\Users\<用戶名>\.nuget\packages\System.Xml.XmlSerializer\4.0.10\lib\DNXCore50\System.Xml.XmlSerializer.dll

看了一下,該程式集沒有 AllowPartiallyTrustedCallers、SecurityTransparent 特性。導致所有代碼預設是 SecurityCritical(安全關鍵)的,透明方法無法調用。

但這一點太奇怪了,.NET Core項目也用的是這個dll啊。.NET Core項目直接使用XML序列化是能正常工作的。表示.NET Core是 SecurityCritical(安全關鍵)的啊。
而且從異常來看,是Attribute.GetCustomAttributes這個底層方法報錯的。
難道是“不能用NuGet包,只能用標準範圍內”的嗎?

3.3 最終解決

整理一下目前的調用關係——

  • XmlIgnoreAttribute 位於 NuGet包System.Xml.XmlSerializer。雖然MSDN上說該類是安全透明的,但NuGet包中的該類是 SecurityCritical(安全關鍵) 的。
  • .NET Standard項目中有一個 UnionShort 結構,它其中的欄位用到了 XmlIgnoreAttribute。因本程式集配置了AllowPartiallyTrustedCallers,故該結構是安全透明的。
  • .NET Core 項目引用了 .NET Standard項目中的UnionShort結構,但根據該結構構造XmlSerializer時,底層的 CustomAttribute.GetCustomAttributes 拋“violation of security transparency rules failed”異常了。雖然.NET Core 項目是SecurityCritical的。

難道是安全透明類(或結構)裡面不能引用SecurityCritical(安全關鍵)的特性?
編譯時沒報錯啊,創建該類、調用方法也正常啊。現在只是在序列化時使用了該特性。

於是將 .NET Standard項目程式集的 AllowPartiallyTrustedCallers 特性去掉。發現能正常運行了。看來真的是“安全透明類(或結構)裡面不能引用SecurityCritical(安全關鍵)的特性”。

去掉“AllowPartiallyTrustedCallers”不利於安全透明規則,於是將它恢復了。隨後嘗試給該結構體加上 SecuritySafeCriticalAttribute 特性。發現能正常運行了。

四、心得

經過這件事後,有了以下心得——

  1. 對於 .NET Framework 已有但 .NET Core/Standard 沒有的功能。可嘗試搜索NuGet包,很多功能其實已經有官方包了。
  2. 安全透明類(或結構)裡面不能引用SecurityCritical(安全關鍵)的特性。需給類(或結構)加上 SecuritySafeCriticalAttribute 特性。
  3. 使用NuGet包時容易遇到SecurityCritical(安全關鍵)的類,即使是官方的包也有時會有這種情況,故需註意加上 SecuritySafeCriticalAttribute 特性。

同理,遇到缺少 DataContractAttribute 特性時,可引用 NuGet上的 System.Runtime.Serialization.Primitives 包。測試通過。

參考文獻


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、基本的編譯與安裝 1、安裝依賴項 2、下載新版本,到官網複製下載鏈接 3、解壓 4、編譯安裝 編譯選項說明: --prefix=path 如果在編譯的不指定安裝位置,那麼預設的位置/usr/local/nginx目錄--sbin-path=path 設置nginx執行腳本的位置,這裡如果設置在p ...
  • scp 是secure copy的簡寫,用於在Linux下進行遠程拷貝文件的命令,和它類似的命令有cp,不過cp只是在本機進行拷貝不能跨伺服器,而且 scp傳輸是加密的。可能會稍微影響一下速度。當你伺服器硬碟變為只讀 read only system時,用scp可以幫你把文件移出來。另 外,scp還 ...
  • 第1章 軟體查詢 1.1 查詢軟體是否安裝 rpm -qa |grep cron 查詢是否安裝了這個軟體. [root@znix ~]# rpm -qa |grep cron crontabs-1.10-33.el6.noarch cronie-1.4.4-16.el6_8.2.x86_64 cro ...
  • C#操作字元串方法總結 staticvoid Main(string[] args){ string s =""; //(1)字元訪問(下標訪問s[i]) s ="ABCD"; Console.WriteLine(s[0]); // 輸出"A"; Console.WriteLine(s.Length ...
  • ajax請求出現500錯誤——但是想實現的功能是,把一個頁面分成了兩份,點擊右邊導航欄,利用ajax請求,請求數據,在右邊出現相應頁面,當時使用的是partialAction然後出現了這個500錯誤,主要就是在這個action上,一個頁面不能ajax請求另一個頁面。當時對實體集也不是很瞭解,對於自動 ...
  • 本文內容整理自http://blog.csdn.net/tennysonsky/article/details/45062079 C/S架構和B/S架構是兩種頗具影響力的軟體體繫結構。C/S是一種歷史悠久且技術非常成熟的架構;B/S是新生代架構,從C/S派生出來,有很多創新,在web信息時代虎虎生威 ...
  • 摘要: 在這篇文章中,我將在一個例子中實際地展示MVC。 場景 假設一個朋友決定舉辦一個新年晚會,她邀請我創建一個用來邀請朋友參加晚會的WEB程式。她提出了四個註意的需求: 一個首頁展示這個晚會 一個表單用來提交申請 驗證表單內容,成功後顯示謝謝頁面 完成後給主人發送申請郵件 添加Model類Gue ...
  • 本篇文章帶你一步一步創建一個簡單的ASP.NET MVC程式。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...