关于CRM 3.0 Callout assembly 的调试和排错
虽然很多人已经开始使用新版本的 CRM 4.0 了,但是也有一些机构还在使用 CRM 3.0(譬如政府,银行等机构通常不会使用最新版本的软件;有些这类谨慎的机构甚至刚开始使用 3.0。去年我还听说过一家全球闻名的投资银行刚开始部署从SharePoint 2001 升级到 SharePoint 2003,要知道那个时候MOSS已经出来一年多了)。很多事情的道理是相通的,程序思想也是这样。所以我想还是有些用处的,就来简单总结一下在 CRM 3.0 Callout 遇到问题的时候调试和排错方法。
1. 我们首先到 eventlog(日至),看看是否有提示错误信息,然后对症下药。
2. 确定 CRMAppPool的运行者(这个用户可以是一个域用户,Local System 或 Network Service ,也就是安装 CRM 的时候指定运行CRM的那个用户,不是安装CRM的用户。可以在 iis 里面看到)有完全操作(full control)这个文件夹的权限(C:"Program Files"Microsoft CRM"Server"bin"assembly)这个文件夹就是存储 callout dll 的文件夹。(如果是Local System那么就是CRM服务器的名称)
3. 确定在注册表里HKEY_LOCAL_MACHINE"Software"Microsoft"MSCRM不存在键值SetupMode,或者其值为0
4. 在Visual Studio 里面删除CRMService,再重新添加CRMService。
5. 有效的使用try{} catch{} ,输出错误信息到文件(注意确定CRMAppPool的用户有操作这个文件的权限)
try
{
//
}
catch (System.Web.Services.Protocols.SoapException ex)
{
TextWriter log = TextWriter.Synchronized(File.AppendText(@"C:"CRM_Debug"error.txt"));
log.WriteLine("SoapException: " + DateTime.Now.ToString());
log.WriteLine("Error Message: " + ex.Detail.InnerText);
XmlDocument error = new XmlDocument();
error.LoadXml(ex.Detail.InnerXml);
log.WriteLine("Error Code: " + error.SelectSingleNode("/error/code").InnerText);
log.WriteLine("Error Description: " + error.SelectSingleNode("/error/description").InnerText);
log.WriteLine("Error Type: " + error.SelectSingleNode("/error/type").InnerText);
log.WriteLine();
log.Close();
}
catch (SqlException ex)
{
//
}
catch (Exception ex)
{
//
} 
6. 用Visual Studio 进行调试,别忘了PDB文件
Callout assembly: 调试这个进程 w3wp.exe ,
Workflow assembly: 调试这个进程 CrmWorkflowService.exe
7. 一些其他有用的信息:
http://blog.sonomapartners.com/2007/03/is_your_microso.html
http://ronaldlemmen.blogspot.com/2007/01/callout-not-working.html
http://support.microsoft.com/kb/933842


浙公网安备 33010602011771号