1

障害処理に Unity/Unity.WCF/Unity.Interceptors を使用する WCF サービスを作成しました。

ここで、SOAP 要求を実行し、要求に必要なノードを含めない場合 (サービス メソッドが実行されます)、例外をスローし、インターセプターがこれを SOAP 障害にします。

例:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v10="http://services.....nl/.../Schemas/v10">
   <soapenv:Header/>
   <soapenv:Body>
      <v10:TheRequestObject>
      </v10:TheRequestObject>
   </soapenv:Body>
</soapenv:Envelope>

デバッガーを使用してサービス呼び出しをステップ実行できます。要求オブジェクトを検証するときに例外をスローし、インターセプターがこれを SOAP エラーにします。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <s:Fault>
         <faultcode>s:Client</faultcode>
         <faultstring xml:lang="nl-NL">Error msg</faultstring>
         <detail> ...
         </detail>
      </s:Fault>
   </s:Body>
</s:Envelope>

今 - 私たちのテスターは、次のように必要なパラメーターに空のノードを提供しました:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v10="http://services.....nl/.../Schemas/v10">
   <soapenv:Header/>
   <soapenv:Body>
      <v10:WagenlijstRequest>
         <v10:RequiredInteger></v10:RequiredInteger>
      </v10:WagenlijstRequest>
   </soapenv:Body>
</soapenv:Envelope>

また、サービスは次のエラー メッセージを返します。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <s:Fault>
         <faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode>
         <faultstring xml:lang="nl-NL">The server was unable to process the request due to an internal error.  For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the &lt;serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework SDK documentation and inspect the server trace logs.</faultstring>
      </s:Fault>
   </s:Body>
</s:Envelope>

問題は、このリクエストがサービスに到達しないため、このエラー メッセージに対して何もできないことです。ここで起こることにどう影響を与えることができますか?

これは、MVC でのモデルバインディングを少し思い出させます。バインディングの動作などに影響を与えることはできますか?

4

1 に答える 1

0

はい、分かりました。必要な作業は次のとおりです。

  • この記事を読む: http://msdn.microsoft.com/en-us/magazine/cc163302.aspx
  • 操作属性を作成し、サービスのメソッドの上に配置します
  • 次のようなもので IOperationBehavior を実装します

    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) {dispatchOperation.Formatter = new ExceptionHandlingFormatter(); }

  • IDispatchMessageFormatter を実装するフォーマッタを作成し、次のようにします。

    public void DeserializeRequest(Message message, object[] parameters)
    {
        var serializer = new XmlSerializer(typeof(WagenlijstRequest), "http://services.prorail.nl/OVGS/Schemas/v10");
    
        try
        {
            // Attempts to deserialize the object given the message body
            var result = serializer.Deserialize(message.GetReaderAtBodyContents());
            parameters[0] = new SomeRequest(result as AnotherType);
        }
        catch (Exception e)
        {
            // In case of an exception - wraps the exception in a Dutch one + logs it
            var exception = new RequestDeserializationException(e);
            this.log.Fatal(string.Format("Error while deserializing the following request:\r\n{0}\r\nException:\r\n{1}", message, exception), exception);
            throw new SomeFaultType(exception).AsFaultException();
        }
    }
    
    public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
    {
        return Message.CreateMessage(messageVersion, string.Empty, result);
    }
    

最終的には、カスタムのデシリアライゼーション動作を操作に適用できるようになります。その動作は逆シリアル化されますが、例外をオランダ語のメッセージで例外にラップする try キャッチを使用します。

于 2013-05-01T10:22:58.367 に答える