2011-11-10 16 views
19

Json.NET(newtonsoft)をカスタムシリアライザとして使用しているアプリケーションがあります。現在、このWebHttpBehaviorの派生をカスタムWebServiceHostFactoryに追加しています。添付ファイルについては、this blogの最後のコードスニペットをご覧ください。カスタム動作は私のweb.configに登録されません

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が

要素の行動が「無効な子要素afforementioned msdn article 'においてNewtonsoftJsonBehavior'

を持っていることを私に伝え、

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

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

私が紛失しているのはまさにそれです。何らかの形でエレメントとその構成タイプを登録します。悲しいことに私はこれを行う方法を教えてくれるSystem.Configurationの頭や尾を作ることはできません。それは基本的に私の質問です。

構成要素を書き込んで登録するにはどうすればよいですか?これは私の問題ではない場合、何が問題なのですか?

事前に感謝します。

答えて

37

欠けている部分は、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> 

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

2

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

ところで、サービス設定でカスタムバインディング拡張も使用しています。 config内のxmlは、あなたが記述しているように要素がスキーマに知られていないことを示す青い波で、拡張子に常に下線を引いています。しかし、サービスを開始すると、サービスとビヘイビアの両方が期待どおりに機能します。

+0

私は明日最初にsvcconfigeditorを試して、報告して戻ってきます。他の部分については、私のアプリケーションを実行しようとすると、サービスを呼び出すとブラウザのweb.configが表示され、サービスが実行できない理由としてカスタムタグが強調表示されます。正確なメッセージは覚えていませんが、明日も投稿できます。 – Mithon

+0

自分の答えを追加しましたが、SvcConfigEditorを私に指摘してから、自分が必要としていたことを追跡するのに役立ちました。 – Mithon

関連する問題