0

エンドポイントで 2 つの動作を構成しています。

  1. 1 つは json シリアライゼーション用で、基本的にはここの例と非常によく似ています。そこで重要なのは次のことです。
public class NewtonsoftJsonBehaviorExtension : BehaviorExtensionElement
{
    public override Type BehaviorType
    {
        get { return typeof(NewtonsoftJsonBehavior); }
    }

    protected override object CreateBehavior()
    {
        return new NewtonsoftJsonBehavior();
    }
}

public class NewtonsoftJsonContentTypeMapper : WebContentTypeMapper
{
    public override WebContentFormat GetMessageFormatForContentType(string contentType)
    {
        return WebContentFormat.Raw;
    }
}
  1. もう 1 つはエラー処理用です。そのため、例外がスローされると、json 形式のメッセージがクライアントに送信されます。コードはhereから取得されます(「上記の情報に基づく完全なソリューションは次のとおりです:」で始まる答え)。

動作 1 のみを使用すると、すべて正常に動作します。2 番目の動作を追加すると、次の例外が発生します。

{"ExceptionType":"System.InvalidOperationException","Message":"受信メッセージに予期しないメッセージ形式 'Raw' があります。操作で予期されるメッセージ形式は 'Xml'、'Json' です。これは、WebContentTypeMapper が原因である可能性がありますバインディングで構成されていません。詳細については、WebContentTypeMapper のドキュメントを参照してください。"}

私のweb.configは次のようになります。

<services>
      <service name="Algotec.Services.Archive.Data.ArchiveDataService" behaviorConfiguration="defaultBehavior">
        <endpoint name="soap" address="soap" binding="basicHttpBinding" contract="Algotec.Interfaces.Archive.Data.IArchiveData" bindingNamespace="http://algotec.co.il/ArchiveData"/>
        <endpoint name="restXml" address="" binding="webHttpBinding" contract="Algotec.Interfaces.Archive.Data.IArchiveData" behaviorConfiguration="restBehavior" bindingNamespace="http://algotec.co.il/ArchiveData"/>
        <endpoint name="restJson" address="json" binding="webHttpBinding" contract="Algotec.Interfaces.Archive.Data.IArchiveData" behaviorConfiguration="jsonBehavior" bindingConfiguration="jsonBinding" bindingNamespace="http://algotec.co.il/ArchiveData"/>
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex"/>
      </service>
    </services>

...

    <endpointBehaviors>
            <behavior name="restBehavior">
              <enhancedWebHttp defaultOutgoingRequestFormat="Xml" defaultOutgoingResponseFormat="Xml"/>
            </behavior>
            <behavior name="jsonBehavior">
              <enhancedWebHttp defaultOutgoingRequestFormat="Json" defaultOutgoingResponseFormat="Json" helpEnabled="true"/>
              <newtonsoftJsonBehavior/>
              <jsonErrorBehavior/>
            </behavior>
          </endpointBehaviors>

    ...

        <extensions>
              <behaviorExtensions>
                <add name="newtonsoftJsonBehavior" type="Algotec.Services.Infra.BehaviorExtensions.NewtonsoftJsonBehaviorExtension, Algotec.Services.Infra, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
                <add name="jsonErrorBehavior" type="Algotec.Services.Infra.Behaviors.JsonErrorWebHttpBehaviorElement, Algotec.Services.Infra, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
              </behaviorExtensions>
            </extensions>

何か案は?

4

2 に答える 2

0

これが私の問題を解決したものです:

<newtonsoftJsonBehavior/>web.config では、 と の間で順序を単純に切り替えました<jsonErrorBehavior/>。私はこのすべての動作を完全に理解していないことを認め、なぜそれが助けになったのかわかりませんが、そうしました.

于 2014-10-08T05:10:30.710 に答える
0

NewtonsoftJsonContentTypeMapper から WebContentFormat.Raw を返すのはなぜですか? フォーマットが正しく一致するように WebContentFormat.Json を返すべきではありませんか?

あなたが達成しようとしていることを少し明確にできますか?

于 2014-10-07T15:36:11.740 に答える