2009-01-15 94 views
3

我正在与C#的MS Dynamics GP WebServices集成,我不知道如何处理异常。通过Web服务的异常

如果我使用不确定的ID执行GetCustomer,则Web服务返回给我一个“泛型”SoapException,并且消息是“Business object not found。”。所以我唯一能够确定它是一个无效ID并且没有其他错误的方法是解析错误信息,我发现这个解决方案非常脆弱。我的GP版本是英文的,在客户网站上它会是法文的,我不知道哪种语言的Web服务消息会是。我正在考虑捕捉它,解析消息并抛出更有意义的错误类型。

您是否看到更好的选择?

回答

0

您是否在控制WebService代码?

在这种情况下,我会返回SoapExceptions与简单的错误代码,更容易解析,并让客户端应用程序决定什么消息显示基础和解析错误代码。

您可以使用WebService上的“错误代码”枚举使代码更具可读性。

//Example 
enum ErrorCodes 
{ 
    BusinessObjectNotFound = 1000, 
    AnotherPossibleError = 1002 
} 

try 
{ 
//Code 
} 
Catch(BusinessObjectNotFoundException bex) 
{ 
    throw new SoapException(ErrorCodes.BusinessObjectNotFound); 
    //Or maybe... 
    //throw new SoapException(((int)ErrorCodes.BusinessObjectNotFound).ToString()); 
} 
+0

没有这个错误Dynamics GP的是扔我。 – pmlarocque 2009-01-15 21:26:24

1

不幸的是,eConnect API和GP Web服务两者都返回一般性错误,只是很高兴你不必解析eConnect的。

好的是,错误通常是静态的,所以你可以为它们构建解析器。创建自定义异常绝对是用这种类型的Web服务完成的好方法。

+0

谢谢,是的,我很高兴地看到,我需要的所有服务都可以通过Web服务或我将不得不陷阱与eConnect。 – pmlarocque 2009-01-15 21:28:15

+0

eConnect是一种痛苦,不提及客户的额外成本我们正在使用它与大约10个不同的客户端,eConnect的唯一好处是如何冗长错误是,并且您可以始终在事件查看器中获取eConnect错误。 – 2009-01-15 21:37:39

1

我有a blog post,详细说明了如何克服WCF中的这个问题(虽然你可以看到,我不介意解析错误消息以获取细节)。下面是它的肉:

catch (FaultException soapEx) 
{ 
    MessageFault mf = soapEx.CreateMessageFault(); 
    if (mf.HasDetail) 
    { 
     XmlDictionaryReader reader = mf.GetReaderAtDetailContents(); 
     Guid g = reader.ReadContentAsGuid(); 
    } 
} 

一旦你的GUID,你可以用它来查询GP Web服务的错误的详细信息。

0

如需了解有关该主题的人的信息,Jacob Proffitt的回复看起来就像是要走的路。从这里Dynamics GP的文件一剪断:

catch(SoapException soapErr) 
{ 
    // If a validation exception occurred, the logid will be in a child node 
    if(soapErr.Detail.HasChildNodes == true) 
    { 
     // Create a guid for the logid value in the soap exception 
     Guid guid = new Guid(soapErr.Detail.InnerText); 

     // Get the validation result object 
     validationResult = wsDynamicsGP.GetLoggedValidationResultByKey(guid, context); 

     // Display the number of validation exceptions 
     MessageBox.Show("Number of validation exceptions: " + 
     validationResult.Errors.Length.ToString()); 
    } 

}

但在我引用的情况:GETCUSTOMER与unexisting ID,行 “soapErr.Detail.HasChildNodes” 是假的,因此失败。 。

web服务似乎满搞笑的行为,这将需要更长的时间比我预期:(

0

我开始厌恶GP,这可能是“坏的形式”,但这里是我所做的:

try 
{ 
    // query service for object by key 
} 
catch (System.ServiceModel.FaultException e) 
{ 
    if (e.Message == "Business object not found.") 
    { 
     // create new object 
    } 
    else 
    { 
     // log the exception appropriately 
    } 
}