0

私は WCF サービスを作成していますが、サービス メソッドからさまざまなメッセージを返すための推奨パターンがあるかどうか疑問に思っていました。

たとえばpublic User Login(string userName, string passWord)、サービスでメソッドを呼び出す場合、有効なユーザーである場合にユーザー オブジェクトを返すようにします。ただし、詳細が正しくない場合、またはアカウントが無効になっている場合は、そのデータをクライアントに返せるようにしたいと考えています。

LogonFailureException最初は、これら 2 つのシナリオのいずれかが発生したときに (カスタム例外クラス)をスローすると考えていました。クライアントでは、このタイプをキャッチして、必要に応じて処理できます。ただし、アプリケーションをデバッグしている場合は、例外がスローされると中断します (FaultException でラップしても)。

また、すべてのメソッドが戻り値の型として使用するクラスを作成することもできます。ServiceResponseその中に「メッセージ」コレクションを作成できますが、直感に反する可能性があります。メソッドの戻り値の型は、通常の状況で返されると予想されるものであることが望ましいです。

要するに、推奨されるサービス メソッドから返されるメッセージを処理する特定のパターンはありますか?

ありがとう

4

2 に答える 2

1

強く型付けされた soap faultをスローする必要があります:

[DataContract]
public class ConnectionFault
{
  [DataMember]
  public string Issue { get; set; }
  [DataMember]
  public string Details { get; set; }
}


[FaultContract(typeof(ConnectionFault))]
[FaultContract(typeof(DataReaderFault))]
[OperationContract]
Int16 GetInStock(int productId);

//when it's time to throw the exception
var connectionFault = new ConnectionFault();
connectionFault.Issue = "Problem connecting to the database";
connectionFault.Details = ex.Message;
throw new FaultException<ConnectionFault>(connectionFault);

その後、クライアントはそれをキャッチできます。

于 2013-07-27T00:29:19.450 に答える
0

私の意見では、2 つのシナリオがあります。
1. サービス側で一種の例外をスローしたい。
2. Service で何か問題が発生したというエラー データを含むクラスを返したい。

違いはなんですか ?最初は yaron が書いたように、FaultException をスローしてキャッチします。
2 つ目は、オブジェクトを返すだけです。たとえば、サービスで何か問題が発生した場合、常に ErrorData を返します。これは、メッセージと例外スタックを文字列として含むデータ コントラクトです。ErrorData.Update メソッドを追加できます。サービスで新しい例外をキャッチし、ErrorData メッセージを更新します。これは、複数の例外をキャッチする可能性があるが、最初の例外で中止したくない長時間実行される呼び出しに適しています。

これらのどれを選択しても、例外から継承しないでください。これは悪い習慣であると読みました.WCFを介して例外ベースのデータコントラクトをシリアル化および転送したくない.

于 2013-07-27T10:38:48.710 に答える