webservices上的通用异常

时间:2009-01-15 20:57:09

标签: c# soap dynamics-gp

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

如果我使用不一致的ID执行GetCustomer,则Web服务会返回“通用”SoapException,并且消息为“找不到业务对象”。因此,我看到确定它是一个无效的ID而不是任何其他错误的唯一方法是通过解析错误消息,我发现这个解决方案非常脆弱。我的GP版本是英文,在客户网站上它将是法语,我不知道将使用哪种语言网络服务消息。我正在考虑捕获它,解析消息并抛出更有意义的错误类型。

你看到更好的选择吗?

5 个答案:

答案 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
    }
}