Plugins 如何强制Post操作中的插件提交?

Plugins 如何强制Post操作中的插件提交?,plugins,dynamics-crm-2011,Plugins,Dynamics Crm 2011,我有一个插件在后期操作中,它需要通过webservice在sharepoint上创建一个文件夹,为此,我的插件调用一个webservice来执行FechXML以从实体获取信息,但问题是该实体仍然不存在,它给我空值 如何强制插件将数据提交/保存到我的FechXml以使其工作 插件代码: 试试看 { 实体; if(context.InputParameters.Contains(“目标”)&&context.InputParameters[“目标”]是实体) { 实体=(实体)上下文.InputPa

我有一个插件在后期操作中,它需要通过webservice在sharepoint上创建一个文件夹,为此,我的插件调用一个webservice来执行FechXML以从实体获取信息,但问题是该实体仍然不存在,它给我空值

如何强制插件将数据提交/保存到我的FechXml以使其工作

插件代码:

试试看
{
实体;
if(context.InputParameters.Contains(“目标”)&&context.InputParameters[“目标”]是实体)
{
实体=(实体)上下文.InputParameters[“目标”];
if(entity.LogicalName!=“fcg_processos”)
{
抛出新的InvalidPluginExecutionException(“Ocorreu um erro no PlugIn Create Folder.”);
}
}
其他的
{
抛出新的InvalidPluginExecutionException(“Ocorreu um erro no PlugIn Create Folder.”);
}
processosid=(Guid)((实体)上下文.InputParameters[“目标”])[“fcg_processosid”];
字符串processoid2=processosid.ToString();
PluginSharepointProcessos.ServiceReference.PrxActivityResult结果=log.CreateFolderSP(“Processo”,processoid2);
字符串resultado=result.xmlContent;
如果(result.retCode>0)
{
抛出新的InvalidPluginExecutionException(“Ocorreu um erro na criação Folder do Processo.”);
}
Web服务代码:

{
//WEBSERVICE从实体调用XML
PrxActivityResult Processo=ProcessoFetch2(“,”,guid);
字符串stxml;
stxml=Processo.XmlContent;
XmlDocument xmlDoc=新的XmlDocument();
LoadXml(stxml);
XmlNodeList nodeList=xmlDoc.SelectNodes(“结果集/结果”);
List lista=新列表();
字符串[]strs=新字符串[7];
if(nodeList.Count!=0)//验证注册号
{
foreach(节点列表中的XmlNode)
{
if(xmlnode.SelectSingleNode(“//fcg\u numero”)!=null)
strs[2]=xmlnode.SelectSingleNode(“//fcg_numero”).InnerText;
其他的
strs[2]=“”;
if(xmlnode.SelectSingleNode(“//Concurso.fcg_numero”)!=null)
strs[3]=xmlnode.SelectSingleNode(//Concurso.fcg_numero”).InnerText;
其他的
strs[3]=“”;
}
}
IwsspClient FmwSharepoint=新的IwsspClient();
PrxActivityResult folderresult=新的PrxActivityResult();
List arrayfields=新列表();
ws.fcg.sipp.svc.ServiceReferenceSharePoint.PareChave nprocesso=new ws.fcg.sipp.svc.ServiceReferenceSharePoint.PareChave();
nprocesso.Key=“FCG\u Numero\u Processo”;
nprocesso.value=strs[2];
arrayfields.Add(nprocesso);
ws.fcg.sipp.svc.ServiceReferenceSharePoint.PareChave npconcurso=new ws.fcg.sipp.svc.ServiceReferenceSharePoint.PareChave();
npconcurso.Key=“FCG\u Numero\u Concurso”;
NPSO.value=strs[3];
arrayfields.Add(NPSO);
ws.fcg.sipp.svc.ServiceReferenceSharePoint.PareChave npguid=新的ws.fcg.sipp.svc.ServiceReferenceSharePoint.PareChave();
npguid.Key=“FCG\u Guid\u CRM”;
npguid.value=guid;
arrayfields.Add(npguid);
folderresult=FmwSharepoint.CreateFolder(“http://localhost/folder“,”Processos“,strs[2],arrayfields.ToArray());
res=folderresult;
}

当插件在Post操作上运行时,它仍然在数据库事务中,并且实际上还没有提交到数据库。使用作为插件上下文一部分传入的服务引用执行的任何调用都将在数据库事务的上下文中执行,您将能够检索新创建的如果您创建一个全新的OrganizationServiceProxy(我猜您正在这么做),它将在数据库事务之外执行,并且不会看到新创建/更新的值


正如@AndyMeyers在他的评论中所建议的那样(这真的应该是IMHO的答案),通过前/后映像或目标从插件上下文中获取数据是理想的,因为这样可以消除另一个数据库调用。如果您必须查找可能由先前启动的另一个插件创建的记录,则需要使用插件上下文中包含的IOrganizationService。

我没有选择,也没有选择我使用此代码运行基于图像的Web服务,忘记了FecthXml,如前所述,我在post操作中从图像获取所有信息并发送回Web服务。谢谢,以下是代码:

 entity = (Entity)context.InputParameters["Target"];

            concursid = (Guid)entity.Attributes["fcg_concursid"];
            guid = concursid.ToString();

            string npconcurs = (string)entity.Attributes["fcg_numer"];
            nconcurs= npconcurs;

            EntityReference nprograma = (EntityReference)entity.Attributes["fcg_unidadeorganica"];

            program = nprogram.Name;

            if (entity.LogicalName != "fcg_concurs")

如果您正在对实体执行post操作,根据定义,它是在事务之后。此外,如果您正在从当前实体检索数据,那么您应该只从上下文和前置/后置图像中获取该数据,这样您就不必进行额外调用。如果您显示代码,其他人也可以更轻松地帮助您完成任务好的。我只是用代码编辑了这篇文章。我不知道你在哪里实际执行FetchXml查询。这是在Fetch2的过程中吗?+1纠正了我,文章插件仍然在事务中。在以前的CRM版本(4.0)中,这不是真的,我想我把我的思路弄错了。