2012-04-04 52 views
1

我们拥有一个带有WCF服务中间层的Silverlight 4前端,后者又引用了CRM 4 Web服务。通过WCF从MS Dynamics CRM插件获取有用的错误消息

当我们的插件中发生InvalidPluginExecutionException时,我可以从WCF FaultException获得的最佳错误消息是一般的SoapException消息,这实际上并没有那么有用。

有没有办法从我们的插件中获取特定的错误消息,这些消息一直传播到我们的WCF(最终到我们的Silverlight应用程序)。我们想知道哪些插件失败。


我张贴我的答案在这里:

http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/e8ea5060-74dc-4ae6-9a3b-3c824d6dfb1b

+0

经过这一天的工作,基本上我试图做的是从InvalidPluginExecutionException获取自定义消息传播到我的WCF错误处理。再次,我可以在WCF服务中得到一个SoapException错误,但是无法想出从CRM获取自定义消息的方法。 有人吗? 在此先感谢。 – Pliskin 2012-04-04 18:05:01

回答

0

如果我理解正确的话,你可以使用的try-catch这样在乌拉圭回合插件:

try{ 
... 
}  
catch (Exception e) 
{ 
    throw new InvalidPluginExecutionException("Error in MyCustomPlugin:" + e.Message); 
} 
0

我们使用广泛的尝试catch块。错误消息存储在名为errorMessage的变量中,然后作为记录保存在我们创建的称为错误日志的自定义实体中(我们在finally方法中检查它,如果它不为空,我们创建记录)。

try 
{ 
    //invoke the web service here 
} 
catch (System.Net.WebException ex) 
{ 
    tracingService.Trace("WebException"); 
    if (errorMessage != null && errorMessage.Length > 0) 
     errorMessage += "The application terminated with an error.<br />"; 
    else 
     errorMessage = "The application terminated with an error.<br />"; 
    if (ex.Status == WebExceptionStatus.ProtocolError) 
    { 
     errorMessage += "Error Code: " + ((HttpWebResponse)ex.Response).StatusCode; 
     if (ex.Response != null) 
     { 
      using (var errorResponse = (HttpWebResponse)ex.Response) 
      { 
       using (var reader = new StreamReader(errorResponse.GetResponseStream())) 
       { 
        string error = reader.ReadToEnd(); 
        errorMessage = "Error Message (JSON Format): " + error + "<br />"; 
       } 
      } 
     } 
    } 
} 
catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex) 
{ 
    if (errorMessage != null && errorMessage.Length > 0) 
     errorMessage += "The application terminated with an error.<br />"; 
    else 
     errorMessage = "The application terminated with an error.<br />"; 
    errorMessage += "Timestamp: " + ex.Detail.Timestamp + ".<br />"; 
    errorMessage += "Code: " + ex.Detail.ErrorCode + ".<br />"; 
    errorMessage += "Message: " + ex.Detail.Message + ".<br />"; 
    errorMessage += "Inner Fault: " + 
     (null == ex.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault") + ".<br />"; 

    tracingService.Trace("The application terminated with an error."); 
    tracingService.Trace("Timestamp: {0}", ex.Detail.Timestamp); 
    tracingService.Trace("Code: {0}", ex.Detail.ErrorCode); 
    tracingService.Trace("Message: {0}", ex.Detail.Message); 
    tracingService.Trace("Inner Fault: {0}", 
     null == ex.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault"); 
} 
catch (System.TimeoutException ex) 
{ 

    if (errorMessage != null && errorMessage.Length > 0) 
     errorMessage += "The application terminated with an error.<br />"; 
    else 
     errorMessage = "The application terminated with an error.<br />"; 
    errorMessage += String.Format("Message: {0} <br />", ex.Message); 
    errorMessage += String.Format("Stack Trace: {0} <br />", ex.StackTrace); 
    errorMessage += String.Format("Inner Fault: {0} <br />", 
     null == ex.InnerException.Message ? "No Inner Fault" : ex.InnerException.Message); 


    tracingService.Trace("The application terminated with an error."); 
    tracingService.Trace("Message: {0}", ex.Message); 
    tracingService.Trace("Stack Trace: {0}", ex.StackTrace); 
    tracingService.Trace("Inner Fault: {0}", 
     null == ex.InnerException.Message ? "No Inner Fault" : ex.InnerException.Message); 
} 
catch (System.Exception ex) 
{ 
    tracingService.Trace("The application terminated with an error."); 
    tracingService.Trace(ex.Message); 

    errorMessage = String.Format("The application terminated with an error.<br />"); 
    errorMessage += String.Format(ex.Message + "<br />"); 

    // Display the details of the inner exception. 
    if (ex.InnerException != null) 
    { 
     tracingService.Trace(ex.InnerException.Message); 

     FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> fe = ex.InnerException 
      as FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>; 
     if (fe != null) 
     { 
      tracingService.Trace("Timestamp: {0}", fe.Detail.Timestamp); 
      tracingService.Trace("Code: {0}", fe.Detail.ErrorCode); 
      tracingService.Trace("Message: {0}", fe.Detail.Message); 
      tracingService.Trace("Trace: {0}", fe.Detail.TraceText); 
      tracingService.Trace("Inner Fault: {0}", 
       null == fe.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault"); 

      errorMessage += String.Format("Timestamp: {0} <br />", fe.Detail.Timestamp); 
      errorMessage += String.Format("Code: {0} <br />", fe.Detail.ErrorCode); 
      errorMessage += String.Format("Message: {0} <br />", fe.Detail.Message); 
      errorMessage += String.Format("Trace: {0} <br />", fe.Detail.TraceText); 
      errorMessage += String.Format("Inner Fault: {0} <br />", 
       null == fe.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault"); 
     } 
    } 
} 
相关问题