3

これが私のサービスコードです。すべてのベスト プラクティスの記事が示唆するように、WebFaultException の形式でエラーをスローします。

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class API
{
    [OperationContract]
    [WebGet()]
    public int MyMethod()
    {
        throw new WebFaultException<string>("TESTERROR", HttpStatusCode.BadRequest);
    }
}

リクエストを送信すると、次のhttp://localhost:1389/API.svc/MyMethodJSON オブジェクトが取得されます。

{"ExceptionDetail":null,"ExceptionType":null,"Message":"サーバーは内部エラーのため、要求を処理できませんでした。エラーの詳細については、IncludeExceptionDetailInFaults をオンにしてください (ServiceBehaviorAttribute または例外情報をクライアントに送り返すか、Microsoft .NET Framework 3.0 SDK のドキュメントに従ってトレースをオンにして、サーバーのトレース ログを調べます。","StackTrace":null}

web.config で有効にしようとしincludeExceptionDetailInFaultsましたが、メッセージは少し変わりましたが、それでも「TESTERROR」はどこにも表示されません!

4

3 に答える 3

1

わかりました、これを .svc-file に追加する必要があることがわかりました:Factory="System.ServiceModel.Activation.WebServiceHostFactory"

そして<behaviors>、web.config からセクションを削除し、これだけを残します。

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
        <service name="MyAPI"><endpoint address="" binding="webHttpBinding"/></service>
    </services>
</system.serviceModel>
于 2012-11-10T00:03:42.363 に答える
1

何が起こっているのかというと、なんらかのリターンが発生しておらず、応答コードだけが発生していると思います。したがって、サーバーは追加情報なしで 500 をスローしています。例外の詳細をログ ファイルに出力することで、これを引き続き使用できます。

私が通常行うことは、クライアントに返すメッセージとコードを含むシリアライズ可能な応答オブジェクトを作成することです。次に、例外をキャッチし、応答オブジェクトを構築して、それをクライアントに返します。その後、クライアントは、読み取り可能な xml ペイロードを受け取ります。したがって、200 (OK) 以外の場合は、障害と見なし、適切なメッセージ (または xml.xml に含めた詳細) を表示します。

<ServiceError>
   <ServerCode>
      500
   </ServerCode>
   <ApplicationCode>
      9100
   </ApplicationCode>
   <Message>
      API key is expired.
   </Message>
</ServiceError>

アップデート:

JSON 標準に関する限り、実際のドキュメント標準を見たことがありません。私が見たのは、一種の事実上の標準、またはむしろ次の傾向です。

{
  "status": "success", //or "failed"
  "data": {
    //any app specific payload here
  },
  "message": null //or additional info here (i.e. exception details)
}
于 2012-10-25T20:21:27.923 に答える