我正在与C#中的MS Dynamics GP WebServices集成,我不知道如何处理异常。
如果我使用不一致的ID执行GetCustomer,则Web服务会返回“通用”SoapException,并且消息为“找不到业务对象”。因此,我看到确定它是一个无效的ID而不是任何其他错误的唯一方法是通过解析错误消息,我发现这个解决方案非常脆弱。我的GP版本是英文,在客户网站上它将是法语,我不知道将使用哪种语言网络服务消息。我正在考虑捕获它,解析消息并抛出更有意义的错误类型。
你看到更好的选择吗?
答案 0 :(得分:1)
不幸的是,eConnect API和GP Web服务都返回了一般错误,只是很高兴您不必解析eConnect错误。
好的方面是,错误通常是静态的,因此您可以为它们构建解析器。使用这种类型的Web服务创建自定义异常绝对是一种很好的方法。
答案 1 :(得分: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服务以获取错误的详细信息。
答案 2 :(得分: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());
}
答案 3 :(得分:0)
对于对这些主题感兴趣的人的信息,雅各布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具有一个未存在的ID,“soapErr.Detail.HasChildNodes”行为false,因此失败。
网络服务似乎充满了有趣的行为,这将花费比我预期更长的时间:(。
答案 4 :(得分: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
}
}