复制注释会导致附件损坏

时间:2014-05-06 14:37:47

标签: c# plugins encoding dynamics-crm-2011

我正在实施一个插件(POST引号创建,同步,沙盒),以便在修改报价时将Notes复制到新记录中。

我的插件归结为此(摘录):

var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
var Service = serviceFactory.CreateOrganizationService(context.UserId);

var notesQuery = new QueryExpression("annotation");
notesQuery.ColumnSet = new ColumnSet(true);
notesQuery.Criteria = new FilterExpression
{
    FilterOperator = LogicalOperator.And,
    Conditions =
    {
        new ConditionExpression("objecttypecode", ConditionOperator.Equal, "quote"),
        new ConditionExpression("objectid", ConditionOperator.Equal, revisedQuoteId)
    }
};
var notes = Service.RetrieveMultiple(notesQuery).Entities;
foreach (var n in notes)
{
    var newNote = new Entity("annotation");

    newNote.Attributes.Add("ownerid", n.GetAttributeValue<EntityReference>("ownerid"));

    newNote.Attributes.Add("objectid", new EntityReference("quote", sourceEntity.Id));
    newNote.Attributes.Add("objecttypecode", "quote");

    newNote.Attributes.Add("subject", n.GetAttributeValue<string>("subject"));
    newNote.Attributes.Add("notetext", n.GetAttributeValue<string>("notetext"));

    newNote.Attributes.Add("isdocument", n.GetAttributeValue<bool>("isdocument"));

    if (n.GetAttributeValue<bool>("isdocument"))
    {
        newNote.Attributes.Add("filesize", n.GetAttributeValue<int>("filesize"));
        newNote.Attributes.Add("documentbody", n.GetAttributeValue<string>("documentbody"));
        newNote.Attributes.Add("filename", n.GetAttributeValue<string>("filename"));
        newNote.Attributes.Add("mimetype", n.GetAttributeValue<string>("mimetype"));
    }

    Service.Create(newNote);
}

基本上,我复制了一切,包括最终的附件。一切似乎都很好,新版本正确地显示字段,详细记录和注释......所有但附件的注释。

如果我只有一个音符,附加的test.txt内容为:

  

测试附件

OrganizationData服务内容如下:

<d:FileName>test.txt</d:FileName>
<d:FileSize m:type="Edm.Int32">39</d:FileSize>        
<d:DocumentBody>H4sIAAAMaVMA/wtJLS5RSCwpSUzOyE3NK+HlAgCLmj1zEQAAAA==</d:DocumentBody>

其“克隆”具有正确的主题和文字,并且还显示附加了test.txt的内容

  

mimetype filesize (在检查odata时,我注意到filesize 实际上是正确的!)似乎是正确(又名:和我试图复制的原始笔记相同),但OData似乎确认了某些内容(它不同!):

<d:FileName>test.txt</d:FileName>
<d:FileSize m:type="Edm.Int32">60</d:FileSize
<d:DocumentBody>H4sIAED6aVMA/5Pv5mBg4MkMZvjP7amrF+iho+npc+6E71nth0+ZGLpn2RYLMjAwAABXqCwTJQAAAA==</d:DocumentBody>

test.txt文件是从命令提示符(COPY CON test.txt,类型,CTRL+Z)创建的。

我尝试更改文件,并通过PDFCreator创建了test.pdf:AcroRead反过来发牢骚并说文档已损坏(所以看起来问题是mimetype-agnostic)。

我还尝试通过早期绑定(通过CRMSVCUTIL生成的类)重新实现相同的代码,但它产生完全相同的结果(垃圾而不是附件内容)。

我试图像这样手工制作documentbody

// "VGVzdCBhdHRhY2htZW50" is Base64 for "Test attachment"
newNote.Attributes.Add("documentbody", "VGVzdCBhdHRhY2htZW50");

,创建的文件正确

我无法弄清楚发生了什么:据我所知,documentbody应该是一个Base64编码的字符串(据我所知,再说一次)不应该有任何不同复制了一下。我错过了什么?

作为参考,CRM已更新为 UR13 ,但我在 UR16 环境中重新发布。

2 个答案:

答案 0 :(得分:0)

编辑:不起作用(仅适用于CRM 4)

试试这个(未经验证):

var notes = Service.RetrieveMultiple(notesQuery).Entities;
foreach (var newNote in notes)
{
    newNote.annotationid = null;

    newNote.Attributes.Add("objectid", new EntityReference("quote", sourceEntity.Id));
    newNote.Attributes.Add("objecttypecode", "quote");

    Service.Create(newNote);
}

答案 1 :(得分:0)

刚刚在MSDN的一篇文章中看到了这一点:

Annotation setupAnnotation = new Annotation()
{
  Subject = "Example Annotation",
  FileName = "ExampleAnnotationAttachment.txt",
  DocumentBody = Convert.ToBase64String(
  new UnicodeEncoding().GetBytes("Sample Annotation Text")),
  MimeType = "text/plain"
};

我看到文档正文根据Unicode编码进行编码。也许您应该尝试从文件中检索编码并相应地将其转换为字符串。