Using the following code to update images stored in Azure Blob Storage and CRM Entity.
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext));
tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
var service = serviceFactory.CreateOrganizationService(context.UserId);
// The InputParameters collection contains all the data passed in the message request.
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
// Obtain the target entity from the input parmameters.
Entity OrigEntity = (Entity)context.InputParameters["Target"];
if (OrigEntity.LogicalName != "lm_image")
return;
try
{
Entity entity = service.Retrieve("lm_image", OrigEntity.Id, new ColumnSet(true));
Boolean lm_primaryimage = false;
String primaryImageFieldName = "lm_primaryimage";
if (OrigEntity.Attributes.Contains(primaryImageFieldName))
{
if (Boolean.TryParse(OrigEntity.Attributes[primaryImageFieldName].ToString(), out lm_primaryimage))
{
//entity.Attributes.Remove(primaryImageFieldName);
}
if (lm_primaryimage)
{
// Cloud Connection String
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=XXXX;AccountKey=XXXXX");
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
QueryExpression query = new QueryExpression("lm_image");
query.ColumnSet = new ColumnSet("lm_name", "lm_primaryimage", "lm_inventoryid", "lm_imageurl", "lm_imageurlorig", "lm_imageurlcrop", "lm_imageurlcropthumb");//true);//"lm_useformarketing", "lm_name", );
ConditionExpression cStatus = new ConditionExpression("statecode", ConditionOperator.Equal, 0);
ConditionExpression cPrimary = new ConditionExpression("lm_primaryimage", ConditionOperator.Equal, true);
ConditionExpression cregardingobjectid = new ConditionExpression("lm_inventoryid", ConditionOperator.Equal, ((EntityReference)entity.Attributes["lm_inventoryid"]).Id);
//ConditionExpression cregardingobject = new ConditionExpression("regardingobject", ConditionOperator.Equal, entity.Id);
query.Criteria.AddCondition(cregardingobjectid);
query.Criteria.AddCondition(cStatus);
query.Criteria.AddCondition(cPrimary);
EntityCollection results = service.RetrieveMultiple(query);
List<String> FieldsToUpdate = new List<string>() { "lm_imageurl", "lm_imageurlorig", "lm_imageurlcrop", "lm_imageurlcropthumb" };
if (results.Entities.Count > 0)
{
foreach (Entity snglImage in results.Entities)
{
if (!snglImage.Id.Equals(entity.Id))
{
Entity cleanEntity = new Entity(snglImage.LogicalName);
cleanEntity.Id = snglImage.Id;
foreach (String snglField in FieldsToUpdate)
{
Console.WriteLine(snglField);
if (snglImage.Attributes.Contains(snglField))
{
AzureImageData azureImageData = new AzureImageData(snglImage[snglField].ToString());
if (azureImageData.Filename.StartsWith("1_"))
{
CloudBlobContainer currentContainer = blobClient.GetContainerReference(azureImageData.Container);
CloudBlockBlob blockBlob = currentContainer.GetBlockBlobReference(azureImageData.Filename);
CloudBlobContainer newContainer = blobClient.GetContainerReference(azureImageData.Container);
CloudBlockBlob newblockBlob = newContainer.GetBlockBlobReference(azureImageData.FilenameClean.Substring(2));
newblockBlob.StartCopy(blockBlob);
blockBlob.Delete();
I get the following error:
"Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=XXXXXX]]: An error occurred in the plug-in.
Inheritance security rules violated while overriding member: 'Microsoft.WindowsAzure.Storage.StorageException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Security accessibility of the overriding method must match the security accessibility of the method being overriden.
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)
at Microsoft.WindowsAzure.Storage.Blob.CloudBlob.StartCopy(Uri source, AccessCondition sourceAccessCondition, AccessCondition destAccessCondition, BlobRequestOptions options, OperationContext operationContext)
at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.StartCopy(CloudBlockBlob source, AccessCondition sourceAccessCondition, AccessCondition destAccessCondition, BlobRequestOptions options, OperationContext operationContext)
at LM.CRM._2011.Plugins.InvPrimaryImages.InventoryImages.Execute(IServiceProvider serviceProvider)Detail:
<OrganizationServiceFault xmlns:i="www.w3.org/.../XMLSchema-instance" xmlns="schemas.microsoft.com/.../Contracts">
<ErrorCode>-2147220891</ErrorCode>
<ErrorDetails xmlns:d2p1="schemas.datacontract.org/.../System.Collections.Generic">
<KeyValuePairOfstringanyType>
<d2p1:key>OperationStatus</d2p1:key>
<d2p1:value xmlns:d4p1="www.w3.org/.../XMLSchema" i:type="d4p1:string">0</d2p1:value>
</KeyValuePairOfstringanyType>
</ErrorDetails>
<Message>An error occurred in the plug-in.
Inheritance security rules violated while overriding member: 'Microsoft.WindowsAzure.Storage.StorageException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Security accessibility of the overriding method must match the security accessibility of the method being overriden.
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)
at Microsoft.WindowsAzure.Storage.Blob.CloudBlob.StartCopy(Uri source, AccessCondition sourceAccessCondition, AccessCondition destAccessCondition, BlobRequestOptions options, OperationContext operationContext)
at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.StartCopy(CloudBlockBlob source, AccessCondition sourceAccessCondition, AccessCondition destAccessCondition, BlobRequestOptions options, OperationContext operationContext)
at LM.CRM._2011.Plugins.InvPrimaryImages.InventoryImages.Execute(IServiceProvider serviceProvider)</Message>
<Timestamp>2017-08-15T23:09:26.2172282Z</Timestamp>
<InnerFault i:nil="true" />
<TraceText>
[LM.CRM._2011.Plugins.InvPrimaryImages: LM.CRM._2011.Plugins.InvPrimaryImages.InventoryImages]
[XXXXX : LM.CRM._2011.Plugins.InvPrimaryImages.InventoryImages: Update of lm_image]
</TraceText>
</OrganizationServiceFault>"
Using ilmerge to combine dlls. Any help would really be appreciated.