2014-10-10 60 views
0

我正在開發CRM 2013中的自定義活動工作流。我的工作流訪問xml文件。當我部署我的工作流程並運行時,它將引發錯誤;在CRM 2013中加載xml時獲取安全性異常

未處理的異常:Microsoft.Crm.CrmException:意外的異常 從插件(執行):MyProj.WorkFlows.ReadXML: System.Security.SecurityException:請求 類型「的許可System.Security .Permissions.FileIOPermission,mscorlib, Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089' 失敗。

我寫的代碼是as;

public string GetBookAuthor(string key, string bookId) 
     { 
      string fileName = @"books.xml"; 
      XmlTextReader reader = new XmlTextReader(fileName); 
      XmlDocument doc = new XmlDocument(); 
      doc.Load(reader); 
      reader.Close(); 

      XmlNode bookAuthor; 
      if (doc != null) 
      { 
       XmlElement root = doc.DocumentElement; 
       if (root != null) 
       { 
        bookAuthor= root.SelectSingleNode("/books/book[@key='" + key + "']/Author[@bookId='" + bookId + "']"); 
        if (bookAuthor!= null) 
         return bookAuthor.InnerText; 
        return string.Empty; 
       } 
       return string.Empty; 
      } 
      return string.Empty; 
     } 

回答

1

自定義工作流活動只有在沙箱外註冊時纔可以訪問文件系統。

此外,允許自定義工作流程活動或插件使用文件系統並不是最佳實踐,更好地使用Web資源或Web服務來存儲/處理文件。

+0

如果該文件存在於webresources中,我可以訪問它嗎? – 2014-10-10 05:15:12

+0

是的,您可以閱讀自定義工作流程活動中的網頁資源內容 – 2014-10-10 05:51:01

+0

您可以幫我解決問題嗎?我試圖通過谷歌搜索它,但不知道我是否處於正確的方向。 – 2014-10-10 05:57:55

0

(請注意下面的任何組件是真實的:自定義活動,插件...)如果你想跟隨100%支持的方法,所以你可以留在沙箱內

,你不能永遠離開CRM「環境」。這意味着:沒有文件系統訪問,到外部Web服務沒有電話(更多的下面),沒有SQL查詢等

要在您的情況下做到這一點,很容易:

  1. 存儲XML文件在客戶關係管理中作爲網絡資源(注意唯一的名稱,您需要它)
  2. 在您的代碼中,將您訪問文件系統的部分更改爲WebResource實體上的QueryExpression。網頁資源的內容將被Base64編碼,所以你有一個額外的箍來跳過來獲取原始文本。
 
    var filename = "your_web_resource_unique_name_here"; 
    XmlDocument doc = new XmlDocument(); 

    var xmlQuery = new QueryExpression("WebResource") 
    { 
     ColumnSet = new ColumnSet("Content"), 
     Criteria = new FilterExpression(LogicalOperator.And) 
     { 
      Conditions = { 
       new ConditionExpression("Name", ConditionOperator.Equal, filename) 
      } 
     } 
    }; 
    var xmlEncoded = organizationService.RetrieveMultiple(xmlQuery).First().GetAttributeValue("Content"); 
    var xmlPlain = Encoding.UTF8.GetString(Convert.FromBase64String(xmlEncoded)); 

    doc.LoadXml(xmlPlain); 
  • doc被填滿,並準備
  • 關於外部Web服務,它據稱支持,但數據傳輸是很容易被誤認爲是過載(和平臺殺死工作者進程)。這可能會導致插件執行失敗,導致客戶「無效」!支持票...

    +1

    沙盒內允許和支持對外部Web服務的訪問。有限制,他們在這裏描述:http://msdn.microsoft.com/en-us/library/gg334752.aspx – 2014-10-10 09:46:44

    +0

    這是正確的,但它似乎是*非常嚴格執行此:'如果沙箱工託管此自定義代碼的進程超出了閾值CPU,內存或處理限制,否則將無法響應,該進程將被平臺終止。幾次我試圖從平臺外部傳輸一些數據到我的程序集上郵遞...... – Alex 2014-10-10 10:04:22

    +0

    好吧,我們對此有不同的體驗:) – 2014-10-10 10:32:18