当前位置: 代码迷 >> SharePoint >> 关于自动启动工作流失败的有关问题
  详细解决方案

关于自动启动工作流失败的有关问题

热度:205   发布时间:2016-05-02 07:00:16.0
关于自动启动工作流失败的问题
本帖最后由 zhaokunsummer 于 2014-12-30 12:11:33 编辑
环境:
                产品: Sharepoint2010
                 开发工具:Vs2012
                
问题描述:

我新建了一个WebService(外部独立的 网站),添加一条记录,没办法自动启动相关联的工作流,但如果用这个用户(非admin)手工去添加一条记录则可以启动工作流
这个是代码添加记录


手工添加记录


 
string SiteUrl = "http://localhost";
                    using (SPSite site = new SPSite(SiteUrl))
                    {
                        SPWeb web = site.RootWeb;
                        string loginName;
                        string spid; //sharepoint的审批ID 
                        loginName = web1.QueryLoinName(context.Request.QueryString["user"]);
                        spid = web1.CreateSpGuid(context.Request.QueryString["CRMID"]); 
                        SPUser user = web.EnsureUser(loginName);
                        SPUserToken token = user.UserToken;
                        //利用用户Token构造新的Site对象
                        SPSite siteWithUser = new SPSite(web.Url, token);
                        SPWeb webWidthUser = siteWithUser.RootWeb;
                        webWidthUser.AllowUnsafeUpdates = true;
                        SPList list = webWidthUser.Lists["审批工作流"];
                        SPListItem spi = list.Items.Add();
                        spi["Title"] = context.Request.QueryString["name"];
                        spi["CRMID"] = context.Request.QueryString["CRMID"];
                        spi["申请授信金额"] = context.Request.QueryString["je"];
                        spi["功能"] = "授信";
                        spi["功能"] = webWidthUser.CurrentUser;
                        spi["GUID0"] = spid;
                        spi.Update(); 
                      }
                });
                callback = context.Request.QueryString["callback"];
                json = "{\"name\":\"" + callback + "\",\"OK\":\"OK\"}";
                context.Response.ContentType = "application/json";
                context.Response.Write(callback + "(" + json + ")");
            }
   }



日志如下
MetadataWebServiceApplication.GetChanges called on 'Managed Metadata Service' completed.
Leaving Monitored Scope (ExecuteWcfServerOperation).
此用户不存在或不唯一。  
Leaving Monitored Scope (FireWorkflowStartingEvent). 执行时间=1.52365733633744
RunWorkflow: Microsoft.SharePoint.SPException: <Error><CompilerError Line="1" Column="1" Text="根 Activity 类型无效。" /></Error> 
Microsoft.SharePoint.SPException: <Error><CompilerError Line="1" Column="1" Text="根 Activity 类型无效。" /></Error> 
Leaving Monitored Scope (Event Receiver (Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c,
Entering monitored scope (Timer Job job-timer-locks) 65bb29bc-8806-4174-b430-216d3607c043
------解决思路----------------------
你的工作流是自定义的么?你用控制台程序试一下这段代码,看一下能否正常启动工作流。
在log中还有更详细的错误信息,贴出来会更容易找到问题。
------解决思路----------------------
SPUser user = web.EnsureUser(loginName);
是不是这里报错了?调试一下
用户不存在或不唯一
------解决思路----------------------
我建议你调试一下,看是哪句出的错
如果在命令行里可以,webservice中可能是缺少权限导致不好用的
------解决思路----------------------
代码在控制台中,是以当前登陆的账号执行的;代码在WebService,是以iis身份执行代码;执行的账号不一样,权限也不一样,报错也是正常的~~建议检查一下代码~~
------解决思路----------------------
此用户不存在或不唯一。   
这应该是代码里面跑异常自己加的输出,自己加的输出应该是知道什么情况或者什么错误会出现,还不好解决么?
------解决思路----------------------
引用:
此用户不存在或不唯一。   
这应该是代码里面跑异常自己加的输出,自己加的输出应该是知道什么情况或者什么错误会出现,还不好解决么?


我觉得你的问题是有 系统账户引起的。就是说,在  SPUser user = web.EnsureUser(loginName);,传入的loginname是 system account,不是一个具体的user。 

你调试一下,看看loginName是不是 system account, 如果是的话,问题就在这里了。因为 API找不到 system account 到底是谁。
  相关解决方案