1

すべての 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 クラスに追加するなど、既に別のことを試しましたが、フレームワークによって暗黙的に生成された応答メッセージのように見せることはできません。

どんな助けでも大歓迎です、どうもありがとう!

4

1 に答える 1