2017-05-23 2 views
0

ASP.Net Coreを使用してAPIを作成しています。 APIは公開されていません。私たちが開発している特定のB2B/B2Eモバイルアプリだけが使用することを意図しています。クライアントコードによって解析されるAPIからドメイン固有のエラーを伝達する方法

モバイルアプリにどのようなエラーが発生したのかを正確に伝える必要があるため、役に立つエラーメッセージが表示されます。ステータスコード自体は、アプリケーションで区別する必要のあるいくつかの異なるドメイン固有のエラーをカバーできるため、これには十分ではありません。したがって、これを行う唯一の方法は、APIとモバイルアプリプロジェクトの両方で参照される共有プロジェクトで定義された、魔法のような文字列を送信するように思われます。ここまでは順調ですね。

I最初のASP.NETのWeb API 2(ないコア)を使用し、私のコントローラはIHttpActionResultが返され、私は単にreturn this.ResponseMessage(new HttpResponseMessage { StatusCode = myStatusCode, ReasonPhrase = myReasonPhrase })(私は、コントローラ上の簡単なヘルパーメソッドに、この作成を委任でき、そのアクションはとてもきれいだったし、ショート)。ただし、ResponseMessageResultはASP.Netコアで定義されていないようです。

私は以前のASP.Net Coreの経験がなく、どこにでも私のユースケースに対する答えを見つけることができないと思われるので、これについて最善の方法を知りたいと思っています。

  • 特定の理由でコントローラにエラー応答を作成します。これは私が以前にやっていたことであり、かなりきれいでシンプルなようです。
  • コントローラー(またはコントローラーの依存関係)に例外をスローし、例外フィルターを使用して、特定の理由フレーズのエラー応答に変換します。私が戻ってきたい理由コードとして、多くのカスタム例外を定義する必要があるかもしれないので、私はこれが好きであると確信しています。
  • 上記のいずれの場合も、理由句に文字列を配置する代わりに、応答本体のオブジェクトに配置します。私の目的のために十分な理由のフレーズで魔法の文字列として見ているように見えます。おそらくErrorプロパティを各コントローラの通常のAPIレスポンスに追加することができますが、いずれの場合も単にObjectResultを返します。

ASP.Net Core APIからドメイン固有のエラーを伝えるには、これらの解決策、あるいはおそらく別の解決策のいずれかが賢明な方法であるとは考えられません。

クライアントコードで解析するASP.Net Core REST APIを使用して、ドメイン固有のエラーをきれいに堅牢に伝達するにはどうすればよいですか?

答えて

1

私はそれを行う方法:それは読み出しREPONSEクライアントが非2xxのを受信したときに

try 
{ 
    // something that throws 
} catch (ExpectedException e) 
{ 
    return BadRequest(new SerializableMessage("You messed up"); 
} 

その後、私のコントローラで

public class SerializableMessage { 
    public SerializableMessage(string message) 
    { 
     Message = message; 
    } 

    public string Message { get; set; } 
} 

を(例えば、コンテンツタイプがJSONの場合)response.message

クライアントは何が起こるべきかを知っているので、ほとんどのエラーはユーザーの介入によって回復不可能であるため、何が間違っているかについてメッセージが表示されるか、失敗する可能性があります。

モデルステートエラーについては、SerializableErrorMessageクラスのErrorsプロパティとして、これらをasp.netコアと同じようにシリアル化しています。これにより、追加のメッセージエラー文字列を指定するオプションが与えられます。キャッチされていない例外については、グローバルフィルタに500のレスポンスを送信させ、何かを使って例外を記録するようにしました(アプリケーションの洞察)。

Controllerクラスで使用できるメソッドを見てください。 Intellisense(実際の名前を覚えることはできません)のドキュメントは、asp.netコアライブラリではかなり良いです。あなたにインスピレーションを与えるかもしれません!

結論としては、役に立つと思われるプロパティを含む直列化可能なクラスがあります。魔法の動的オブジェクトに頼らず、コンテキストプロパティを避けてください(たとえば、endpoint1がエラーを返すと、endpoint2がErrorMessageとErrorを返します)。

+0

ありがとうございました。 「*私は文脈上のプロパティを避けるだろう(例えば、endpoint1はエラーEndMethod2がErrorMessageとErrorを返す)メンテナンスの悪夢はどんなプロパティが期待されているかを覚えている!* " - これがレスポンスオブジェクトにErrorプロパティを持つことに対する引数であるなら、私は同意しない。応答オブジェクトはAPIとクライアントの間で共有されるため、すべてが強く型付けされます。 – cmeeren

+0

ああ、私は、既知のプロパティを持つ定義済みのErrorオブジェクトがあることを意味します。たとえば、文字列を返し、エラーのリストを返すだけでなく、エラーのリストを持つErrorsプロパティを持つ共通のオブジェクトを返すようにしてください。例えば、これは私がそれを行うことを決めた方法です。あなたとあなたのチームにはもっと意味をなさせるものがあります。それがうまくいく。 – Mardoxx

+0

あなたの意見では、各応答オブジェクトに 'Error'プロパティ(enumなど)を付けるのは大丈夫でしょうか?たとえば、 'SignInResponse'の' SignInError Error'、 'GetTodoResponse'の' GetTodoError Error'などです。次に、実際のステータスコードに依存せずにレスポンスを逆シリアル化するだけで、クライアントコードを少し簡略化できます。 – cmeeren

関連する問題