すべての Web サービスからアスペクト指向のコードを削除しようとした結果、奇妙な問題が発生しました。
検証を行い、応答を返す IErrorHandler でキャッチされる FaultException をスローする IParameterInspector があります。
ResponseBase は次のようになります。
[DataContract(Namespace = Namespaces.Data)]
public class ResponseBase
{
public ResponseBase()
{
this.Build = BuildHelper.GetBuild();
}
[DataMember(Name = CommonParameterNames.RequestId, Order = 0)]
public string RequestId { get; set; }
[DataMember(Name = CommonParameterNames.Status, Order = 1)]
public string Status { get; set; }
[DataMember(Name = CommonParameterNames.Errors, Order = 2, EmitDefaultValue = false)]
public Error[] Errors { get; set; }
[DataMember(Name = CommonParameterNames.Build, Order = 3, EmitDefaultValue = false)]
public Build Build { get; set; }
}
これは、Web サービス メソッドによって作成されるすべての応答の基本クラスです。
エラーまたは検証エラーが発生せずにサービス メソッドから返された場合、メッセージには、メソッド名自体の開始タグの直後に、"response" と呼ばれる名前空間を持つボディのラッパー要素が含まれます。
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body>
<BulkUploadImageBase64Response xmlns="http://www.mydomain.com/webapi/">
<response xmlns:a="http://www.mydomain.com/webapi/data/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:request_id>
ただし、Message.CreateMessage() メソッドを使用して IErrorHandler で障害を処理しようとすると、FaultException から ResponseBase オブジェクトを渡すと、結果が異なって見えます。
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body>
<BulkUploadImageResponse xmlns="http://www.mydomain.com/webapi/data/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<request_id>e505d0d3-fc5d-474f-8ec7-5c7521c8a869</request_id>
<status>DataValidationError</status>
エラー ハンドラから返されたメッセージは、別の方法でシリアル化されているようです。「応答」ラッパー要素が何らかの理由で欠落しています。
これはエラー ハンドラーの実装です (抜粋)。
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (error is FaultException<ResponseBase>)
{
var fe = error as FaultException<ResponseBase>;
fault = Message.CreateMessage(version, null, fe.Detail);
}
BodyReader を DataContractSerializer と一緒に使用する、MessageContract 属性を ResponseBase クラスに追加するなど、既に別のことを試しましたが、フレームワークによって暗黙的に生成された応答メッセージのように見せることはできません。
どんな助けでも大歓迎です、どうもありがとう!