1

私はプラグインの作業に行きます、そして私はここで作業コードを更新しました。それが役に立てば幸い!!

メールレコードの「FROM」フィールドから連絡先エンティティを取得するプラグインを含むワークフローを作成しています。そのメールが連絡先エンティティに存在するかどうかを確認しようとしています。入力は「FROM」電子メールであり、出力は連絡先エンティティを返します。このコードを機能させることができませんでした。さまざまなエラーが発生したか、エラーが発生していませんが、機能していないことはわかっています。助けてください!前もって感謝します!

using System.Activities;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Messages;
using System;

namespace GetSenderPlugin
{
  public class GetSenderPlugin : CodeActivity
  {
    protected override void Execute(CodeActivityContext executionContext)
    {
        //Create the tracing service
        ITracingService trace = executionContext.GetExtension<ITracingService>();
        trace.Trace("*****Tracing Initiated*****");

        //Create the IWorkflowContext and the IOrganizationService for communication with CRM
        IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
        IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
        IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
        trace.Trace("*****IOrganizationService created*****");

        trace.Trace("*****Entity logical Name: " + Email.Get<EntityReference>(executionContext).LogicalName + "*****");
        trace.Trace("*****Entity ID: " + Email.Get<EntityReference>(executionContext).Id + "*****");

        if (Email != null && string.Compare(Email.Get<EntityReference>(executionContext).LogicalName, "email", false) == 0)
        {
            EntityReference retrieveEmail = new EntityReference();
            retrieveEmail.Id = Email.Get<EntityReference>(executionContext).Id;
            retrieveEmail.LogicalName = Email.Get<EntityReference>(executionContext).LogicalName;
            retrieveEmail.Name = Email.Get<EntityReference>(executionContext).Name;

            string[] strArrays = new string[1];
            strArrays[0] = "from";

            ColumnSet columnSet = new ColumnSet();
            columnSet.AddColumn(strArrays[0]);

            RetrieveRequest retrieveRequest = new RetrieveRequest();
            retrieveRequest.Target = retrieveEmail;
            retrieveRequest.ColumnSet = columnSet;
            trace.Trace("*****Retrieve Request declared*****");

            RetrieveResponse retrieveResponse = (RetrieveResponse)service.Execute(retrieveRequest);
            trace.Trace("*****Retrieve Response executed*****");

            Email businessEntity = (Email)retrieveResponse.Entity;
            trace.Trace("*****businessEnitity retrieved*****");

            //ActivityParty activitypartyArray = (ActivityParty)businessEntity.From.FirstOrDefault;
            foreach (ActivityParty activityParty in businessEntity.From)
            {
                trace.Trace("*****Activity Party Name: " + activityParty.PartyId.LogicalName + "*****");
                trace.Trace("*****Activity Party Id: " + activityParty.PartyId.Id + "*****");
                if (activityParty != null && activityParty != null && activityParty.PartyId != null)
                {
                    string str = activityParty.PartyId.LogicalName;
                    if (str.CompareTo("contact") != 0)
                    {
                        trace.Trace("*****Not Contact*****");
                        if (str.CompareTo("account") != 0)
                        {
                            trace.Trace("*****Not Account*****");
                            if (str.CompareTo("lead") != 0)
                            {
                                trace.Trace("*****Not Lead*****");
                                if (str.CompareTo("systemuser") != 0)
                                {
                                    trace.Trace("*****Not System User*****");
                                    if (str.CompareTo("queue") == 0)
                                    {
                                        Queue.Set(executionContext, activityParty.PartyId);
                                        Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
                                        User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
                                        Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
                                        Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
                                    }
                                    else
                                    {
                                        trace.Trace("*****User not found*****");
                                        Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
                                        Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
                                        User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
                                        Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
                                        Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
                                    }
                                }
                                else
                                {
                                    User.Set(executionContext, activityParty.PartyId);
                                    Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
                                    Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
                                    Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
                                    Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
                                }
                            }
                            else
                            {
                                Lead.Set(executionContext, activityParty.PartyId);
                                Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
                                Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
                                User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
                                Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
                            }
                        }
                        else
                        {
                            Account.Set(executionContext, activityParty.PartyId);
                            Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
                            Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
                            User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
                            Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
                        }
                    }
                    else
                    {
                        trace.Trace("*****Contact assigned*****");
                        Contact.Set(executionContext, activityParty.PartyId);
                        Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
                        User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
                        Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
                        Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
                    }
                }
                break;
            }
        }
        else
        {
            trace.Trace("*****Email is null*****");
            Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
            Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
            User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
            Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
            Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
        }
    }

    #region Properties
    [Input("E-mail")]
    [ReferenceTarget("email")]
    public InArgument<EntityReference> Email { get; set; }

    [Output("Account")]
    [ReferenceTarget("account")]
    public OutArgument<EntityReference> Account { get; set; }

    [Output("Contact")]
    [ReferenceTarget("contact")]
    public OutArgument<EntityReference> Contact { get; set; }

    [Output("Lead")]
    [ReferenceTarget("lead")]
    public OutArgument<EntityReference> Lead { get; set; }

    [Output("Queue")]
    [ReferenceTarget("queue")]
    public OutArgument<EntityReference> Queue { get; set; }

    [Output("User")]
    [ReferenceTarget("systemuser")]
    public OutArgument<EntityReference> User { get; set; }
    #endregion        
  }
}

そのため、内部CRMシステムを4.0から2011にアップグレードしています。これは、ワークフロー上にあったプラグインでした。私は元のソースコードを持っていなかったので、コードが何をしているのか本当にわかりませんでした。しかし、ソリューションをエクスポートした後、元の.dllファイルを逆コンパイルしました。CRM 2011のコードを書き直そうとしましたが、これが私が持っているものです。ワークフローをテストした後、「空でないGUIDが必要です」というエラーが表示されます。コードはループの後の最後の行に移動し、エラーが発生します。トレースは次のとおりです。

Workflow paused due to error: Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Expected non-empty Guid.Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220989</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
  <Message>Expected non-empty Guid.</Message>
  <Timestamp>2013-02-21T23:46:37.0376093Z</Timestamp>
  <InnerFault>
   <ErrorCode>-2147220970</ErrorCode>
    <ErrorDetails xmlns:d3p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
    <Message>System.ArgumentException: Expected non-empty Guid.
Parameter name: id</Message>
    <Timestamp>2013-02-21T23:46:37.0376093Z</Timestamp>
    <InnerFault i:nil="true" />
    <TraceText i:nil="true" />
 </InnerFault>
 <TraceText>[Microsoft.Xrm.Sdk.Workflow: Microsoft.Xrm.Sdk.Workflow.Activities.RetrieveEntity]
[RetrieveEntity]
    *****Tracing Initiated*****
    *****IOrganizationService created*****
    *****Entity logical Name: email*****
    *****Entity ID: c49e4c7c-8724-de11-86ce-000c290f83d7*****
    *****Retrieve Request declared*****
    *****Retrieve Response executed*****
    *****businessEnitity retrieved*****
    *****Activity Party Name: contact*****
    *****Activity Party Id: 79ed3a33-8eb9-dc11-8edd-00c09f226ebb*****
    *****Activity Party not null*****
    *****Contact assigned*****
    *****foreach ended*****</TraceText>
</OrganizationServiceFault>
   at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Retrieve(String entityName, Guid id, ColumnSet columnSet, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType)
   at Microsoft.Crm.Extensibility.InprocessServiceProxy.RetrieveCore(String entityName, Guid id, ColumnSet columnSet)
   at Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.Retrieve(String entityName, Guid id, ColumnSet columnSet)
   at Microsoft.Crm.Workflow.Services.RetrieveActivityService.<>c__DisplayClass1.<RetrieveInternal>b__0(IOrganizationService sdkService)
   at Microsoft.Crm.Workflow.Services.ActivityServiceBase.ExecuteInTransactedContext(ActivityDelegate activityDelegate)
   at Microsoft.Crm.Workflow.Services.RetrieveActivityService.ExecuteInternal(ActivityContext executionContext, RetrieveEntity retrieveEntity)
   at Microsoft.Crm.Workflow.Services.RetrieveActivityService.Execute(ActivityContext executionContext, RetrieveEntity retrieveEntity)
   at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)
   at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)
4

2 に答える 2

3

さまざまなエラーが発生したか、エラーが発生していませんが、機能していないことはわかっています

まず、質問にエラーをリストすることをお勧めします。答えたり、-1を避けたりする方がはるかに簡単です。:)次に、ワークフローでトレースサービスを使用します。

ITracingService tracingService = context.GetExtension<ITracingService>();
tracingService.Trace("I'm tracing something....");

指定したメールアドレスの連絡先が見つからない場合はどうなりますか?この場合を処理する必要があります。おそらくここでは失敗します。これを確認するには、問題のエラーログを投稿してください。

于 2013-02-20T09:11:46.847 に答える
2

私がヒップからショットの答えを出すとしたら、これが問題であると思います。場合によっては、一致が得られず、すべてが除外されるということです。次に、どこかでnullを取得します (または、空のGUID を参照しようとするか、入力されていない属性を選択しようとするため、定義されていても提供されません)。

どのような正確なエラーが発生しますか? いつそれらを取得し、いつ取得しないのですか?

また、私が気付いたコードのいくつかの問題 (解決策ではありませんが、改善される可能性があります)。

名前のタイプミス。ContactReferenceが必要だったと思います。

[Output("output")]
[ReferenceTarget("contact")]
public OutArgument<EntityReference> ContactRefernce { get; set; }

少し異なる方法でクエリを設計します。一致させたい住所がわかっているので、それを正確にフィルタリングすることをお勧めします。また、メールに基づいて一致するための GUID のみが必要なようですので、それを取得するだけで済みます。

private Guid MatchSenderWithExistingContact(
  IOrganizationService service, String fromAddress)
{
  QueryExpression query = new QueryExpression
  {
    EntityName = "contact",
    ColumnSet = new ColumnSet("emailaddress1"),
    Criteria = new FilterExpression
    {
      Filters =
      {
        new FilterExpression
        {
          Conditions =
          {
            new ConditionExpression(
              "emailaddress1", ConditionOperator.Equal, fromAddress)
          }
        }
      }
    }
  };

  EntityCollection retrieveMultipleRequest = service.RetrieveMultiple(query);
  IEnumerable<Entity> entities = retrieveMultipleRequest.Entities;
  return entities.FirstOrDefault().Id;
}

ステップバイステップの構文でクエリの宣言を行いたい場合があります。高度なクエリを作成するときに便利なので、私はこの方法を好みます。しかし、上に示したように、反復してブレークを使用した部分は確実に改善されます。

ハッピーコーディング!

トレースを使用するのが適切かもしれません。通常、トレース オブジェクトをプラグイン クラスのメンバ変数として宣言し、すべての操作でそれに書き込みます。そうすれば、少なくとも肥料が AC に当たる場所がわかり、その直前の変数の値をログに記録できます。

private ITracingService trace;

public void Execute(IServiceProvider serviceProvider)
{
  trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
  _trace.Trace("Tracing successful!");
  throw new Exception("Intentional! Nice.");
}

キャッチされない例外が発生しない限り、トレースは表示されないことに注意してください。実際、変数の内容を確認するためだけに、意図的に実行をクラッシュさせたこともあります。したがって、グローバルなtry-catchがある場合は、例外を手動で再スローする必要があることに注意してください。

この方法の利点は、オンプレミスとオンラインの両方でトレースできることです。非同期を除くすべてのプラグイン登録で機能します。それにも回避策がありますが、それはあなたの質問のトピックではなく、私はすでに十分に脱線しました。

于 2013-02-20T10:17:19.940 に答える