1

イベントを受信するWCFサービスを作成しています。これは合意された基準に準拠しているため、サービス定義に固執する必要があり、クライアントが送信するデータを制御しません。データは異なる場合がありますが、これも合意された基準です。

これが私のサービスの方法の1つです:

complexType ErrorEvent(int requestId, complexType returnValue, ref string errorInfo)

クライアントは、関数が操作して返すerrorInfo文字列でXMLを送信します。

私が取得するデータは次のようなものです(完全なSOAPリクエスト):

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ErrorEvent xmlns="http://blah">
      <requestId>1</requestId>
      <returnValue>
        <returnCode>0</returnCode>
      </returnValue>
      <errorInfo>
        <ErrorMessage>An error message</ErrorMessage>
        <DefaultTask><!-- Complex data --></DefaultTask>
        <Task><!-- Complex data --></Task>
        <Task><!-- Complex data --></Task>
        <Task><!-- Complex data --></Task>
        <ExtraMessage>hello</ExtraMessage>
        <ExtraMessage>world</ExtraMessage>
      </errorInfo>
    </ErrorEvent>
  </s:Body>
</s:Envelope>

ただし、これを実行しようとすると、次のエラーが発生します(編集済み):

メッセージを逆シリアル化しようとしたときに、フォーマッターが例外をスローしました。パラメーターerrorInfoを逆シリアル化しようとしたときにエラーが発生しました。InnerExceptionメッセージは次のとおりです。'タイプSystem.Stringのオブジェクトの逆シリアル化中にエラーが発生しました。名前空間''からの終了要素'errorInfo'が必要です。名前空間''から要素'ErrorMessage'が見つかりました。

だから私の質問は、私のメソッドのシグネチャを変更せずにやりたいことを達成する方法はありますか?たとえば、サービスに属性を追加するなど?または、メッセージを傍受する必要がありますか?

ポインタをありがとう。

4

2 に答える 2

0

文字列として渡す必要がありますか?WCFでXmlElementとXElementsも受信できることをご存知ですか?

自分でSOAPリクエストを生成していますか?CDATAセクションを使用できますか?

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ErrorEvent xmlns="http://blah">
      <requestId>1</requestId>
      <returnValue>
        <returnCode>0</returnCode>
      </returnValue>
      <errorInfo>
        <![CDATA[<ErrorMessage>An error message</ErrorMessage>
        <DefaultTask><!-- Complex data --></DefaultTask>
        <Task><!-- Complex data --></Task>
        <Task><!-- Complex data --></Task>
        <Task><!-- Complex data --></Task>
        <ExtraMessage>hello</ExtraMessage>
        <ExtraMessage>world</ExtraMessage>]]>
      </errorInfo>
    </ErrorEvent>
  </s:Body>
</s:Envelope>
于 2012-08-30T11:57:45.000 に答える
0

これを機能させる方法が見つかりませんでした。@luksanが言うように、エスケープされていないXMLを文字列パラメーターに送信することはクライアントによる誤用です。

私が採用した回避策は、IClientMessageInspector、IDispatchMessageInspector、およびIEndpointBehaviorを実装するクラスを作成して、誤ったメッセージをインターセプト、チェック、および変更することでした。

インターフェイスを変更できた場合、別の回避策は文字列の代わりにXmlNode[]を受け入れることでした。

于 2012-08-31T07:33:13.217 に答える