20

Json.NET (newtonsoft) をカスタム シリアライザーとして使用しているアプリケーションがあります。現在、この WebHttpBehavior の派生物をカスタム WebServiceHostFactory に追加しています。添付方法については、このブログの最後にあるコード スニペットを参照してください。

IIS でこのサービスをホストしているので、カスタム ホスティング コードを取り除き、カスタム動作を web.config に追加したいと考えています。手順は、このmsdn articleに示されています。

だから私はそれを次のようにしようとします:

<behaviors>
  <endpointBehaviors>
    <behavior name="jsonRest">
      <webHttp defaultOutgoingResponseFormat="Json" />
      <NewtonsoftJsonBehavior/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<extensions>
  <behaviorExtensions>
    <add name="NewtonsoftJsonBehavior" type="Newtonsoft.Json.Extensions.NewtonsoftJsonBehavior, NewtonsoftJsonExtensions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </behaviorExtensions>
</extensions>

残念ながら、私はそれを機能させることができません。これを行うと、Visual Studio から次のように通知されます。

要素 'behavior' には無効な子要素 'NewtonsoftJsonBehavior' があります

前述のmsdn の記事では、次のように述べられています。

要素に構成機能を追加するには、構成要素を作成して登録する必要があります。詳細については、System.Configurationのドキュメントを参照してください。

要素とその構成タイプを定義したら、次の例に示すように、拡張機能を使用できます。

私が欠けているのはまさにそれだと感じています。どういうわけか、要素とその構成タイプを登録します。悲しいことに、これを行う方法を教えてくれるはずのSystem.Configurationの頭や尾を作ることはできません。それが基本的に私の質問です:

構成要素を作成して登録するにはどうすればよいですか? それが私の問題でない場合、何が問題なのですか?

よろしくお願いします!

4

2 に答える 2

40

欠落している部分は、クラス BehaviorExtensionElement です。OPでは、WebHttpBehavior-derivativeを要素として追加しようとしていました。BehaviorExtensionElement は、特定の要素に使用する Type を config-parser に伝えます。

必要な実装は次のとおりです。

public class NewtonsoftJsonBehaviorExtension : BehaviorExtensionElement
{
    public override Type BehaviorType
    {
        get { return typeof(NewtonsoftJsonBehavior); }
    }

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

もちろん、これはカスタム WebServiceHostFactory を取り除くのに十分ではありませんでした。カスタム ContentTypeMapper も追加する必要があったためです。

public class NewtonsoftJsonContentTypeMapper : WebContentTypeMapper
{
    public override WebContentFormat GetMessageFormatForContentType(string contentType)
    {
        return WebContentFormat.Raw;
    }
}

その後、それらを Web.config で使用できます。作業構成の関連部分は次のとおりです。最初に拡張機能をセットアップし、それを使用して動作を構成します。

<extensions>
  <behaviorExtensions>
    <add name="newtonsoftJsonBehavior" type="Newtonsoft.Json.Extensions.NewtonsoftJsonBehaviorExtension, NewtonsoftJsonExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </behaviorExtensions>
</extensions>
<behaviors>
  <endpointBehaviors>
    <behavior name="jsonRestEndpointBehavior">
      <webHttp/>
      <newtonsoftJsonBehavior/>
    </behavior>
  </endpointBehaviors>
<behaviors>

次に、カスタム contentTypeMapper を使用して webHttpBinding を構成します。

<bindings>
  <webHttpBinding>
    <binding name="newtonsoftJsonBinding" contentTypeMapper="Newtonsoft.Json.Extensions.NewtonsoftJsonContentTypeMapper, NewtonsoftJsonExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </webHttpBinding>
</bindings>

最後に、上記を利用してエンドポイントを設定します。

<services>
  <service name="My.Namespaced.MyService" behaviorConfiguration="jsonRestServiceBehavior">
    <endpoint address=""                behaviorConfiguration="jsonRestEndpointBehavior"
              binding="webHttpBinding"  bindingConfiguration="newtonsoftJsonBinding" 
              contract="My.Namespaced.IMyService" />
  </service>
</services>

この内容が誰かを助けることを願っています。:)

于 2011-11-11T16:47:45.543 に答える
2

この app.config を svcconfigeditor で開くと、NewtonsoftJsonBehavior に関連付けられているアセンブリを選択するよう求められます。それを選択して app.config を再度保存すると、問題は解決しますか?

ところで、サービス構成ではカスタム バインディング拡張機能も使用しています。構成内の xml は常に、拡張機能に青い波線を付けて、説明したように要素がスキーマに認識されていないことを示します。ただし、サービスを開始すると、サービスと動作の両方が期待どおりに機能します。

于 2011-11-10T21:14:38.917 に答える