【问题标题】:Using QueryExpression creates OrganizationServiceFault使用 QueryExpression 创建 OrganizationServiceFault
【发布时间】:2021-03-18 20:47:57
【问题描述】:

我需要一些帮助。这是我使用的第一个 QueryExpression,因为我必须将我的 SDK 更新到 365。

此时我什至没有做任何努力,但如果我在代码中使用 QueryExpression(就像我之前做过 100 次一样),我会得到一个 OrganizationServiceFault。

这是在 VisualStudio 2017 中构建的,使用 365SDK 插件注册工具来创建插件。

所以这是基本代码(在这一点上它真的很基本)

using System;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;

namespace TrainerAppHistory.TransferHistory
{

/// <summary>
/// PreOperationipmahr_trainerapplicationUpdate Plugin.
/// Fires when the following attributes are updated:
/// ipmahr_transferhistory
/// </summary>    
public class PreOperationipmahr_trainerapplicationUpdate : PluginBase
{

    public PreOperationipmahr_trainerapplicationUpdate(string unsecure, string secure)
        : base(typeof(PreOperationipmahr_trainerapplicationUpdate))
    {

        // TODO: Implement your custom configuration handling.
    }
    private readonly string preImageAlias = "PreImage";
    protected override void ExecuteCrmPlugin(LocalPluginContext localContext)
    {
        if (localContext == null)
        {
            throw new InvalidPluginExecutionException("localContext");
        }

        IPluginExecutionContext context = localContext.PluginExecutionContext;
        IOrganizationService server = localContext.OrganizationService;
        Entity Training = (Entity)context.InputParameters["Target"];
        Entity preImageEntity = (context.PreEntityImages != null && context.PreEntityImages.Contains(this.preImageAlias)) ? context.PreEntityImages[this.preImageAlias] : null;
        EntityReference Contact = (EntityReference)preImageEntity.Attributes["ipmahr_contactid"];
        
        bool transfer = Training.GetAttributeValue<bool>("ipmahr_transferhistory");
        Guid recordID = Training.GetAttributeValue<Guid>("ipmahr_trainerapplicationid");
        Guid contactid = Contact.Id;
        

        if (transfer == true)
        {
            QueryExpression TopRecord = new QueryExpression("ipmahr_trainerapplication");
            TopRecord.ColumnSet = new ColumnSet("ipmahr_trainerapplicationid");
             EntityCollection results1 = server.RetrieveMultiple(TopRecord);

            if (results1.Entities.Count > 1)
            {
                Training.Attributes["new_comments"] = "found them all";
               
            }

            //End Code

        }
    }
}
}

当我删除 QueryExpression 并像这样对记录使用简单的更新时 Training.Attributes["new_cmets"] = "这行得通"; 那么我更新记录就没有错误了。

我尝试在 QueryExpression 中填充一个变量,然后在 QE 之外更新(以测试)。但问题似乎只是 QE 的存在。

我不知道接下来要看什么。我发现似乎没有任何帮助。我使用了注册插件工具来生成这个插件。

插件跟踪显示以下内容,我认为这是关键。但我找不到答案。

System.ServiceModel.CommunicationObjectFaultedException:通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为它处于故障状态。

【问题讨论】:

  • 您能否将您的results1 = server.RetrieveMultiple(TopRecord); 包装在try/catch 块中并检查内部异常?
  • 一直想回到这个。事实证明,这根本不是代码,而是分析器服务和/或沙盒服务。 (我不确定哪个托管公司没有回复我。但是在他们在周末对它做了一些事情之后,代码现在可以工作了。)但是谢谢你的回答。

标签: plugins visual-studio-2017 dynamics-crm-2016


【解决方案1】:

一直想回到这个。事实证明,这根本不是代码,而是分析器服务和/或沙盒服务。 (我不确定哪个托管公司没有回复我。但是在他们周末对服务器做了一些事情之后,代码现在可以工作了。)但是感谢您的回答。

【讨论】:

    猜你喜欢
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多