3

C#のMS Dynamics GP WebServicesと統合していますが、例外の処理方法がわかりません。

IDが存在しないGetCustomerを実行すると、Webサービスから「一般的な」SoapExceptionが返され、「ビジネスオブジェクトが見つかりません」というメッセージが表示されます。したがって、それが無効なIDであり、他のエラーではないことを確認する唯一の方法は、エラーメッセージを解析することです。このソリューションは、非常に脆弱であることがわかります。私のGPバージョンは英語ですが、顧客サイトではフランス語になり、Webサービスメッセージがどの言語になるかわかりません。私はそれをキャッチし、メッセージを解析し、より意味のあるエラータイプをスローすることを考えています。

より良い選択肢がありますか?

4

5 に答える 5

1

WCF でこの問題をどのように解決したかを詳しく説明したブログ投稿があります (ご覧のとおり、詳細を取得するためにエラー メッセージを解析してもかまいません)。これがその肉です:

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

GUID を取得したら、それを使用して GP Web サービスにエラーの詳細を問い合わせることができます。

于 2009-01-15T22:39:32.493 に答える
1

残念ながら、eConnect API と GP Web サービスの両方が一般的なエラーを返しますが、eConnect のものを解析する必要がないことを嬉しく思います。

良いことに、エラーは一般に静的であるため、エラー用のパーサーを作成できます。カスタム例外を作成することは、このタイプの Web サービスで行うには間違いなく良い方法です。

于 2009-01-15T21:23:50.850 に答える
0

トピックに興味のある人への情報については、JacobProffittの応答は進むべき道のように見えます。DynamicsGPドキュメントのスニッパーは次のとおりです。

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());
    }

}

しかし、私が引用した場合:存在しないIDを持つGetCustomerの場合、「soapErr.Detail.HasChildNodes」の行はfalseであるため、失敗します。

Webサービスはおかしな振る舞いでいっぱいのようです、これは私が予想したよりも長くかかります:(。

于 2009-01-16T18:42:10.673 に答える
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());
}
于 2009-01-15T21:11:07.570 に答える
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
    }
}
于 2011-11-08T20:21:35.853 に答える