2011-10-23 4 views
2

javascriptから呼び出す必要があるwcfサービスを作成する必要があります。DataContractResolverをAJAX対応のwcfサービスで使用する

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
public class ClientRequestService : IClientRequestService 
{ 
    [WebGet] 
    [ApplyProxyDataContractResolver] 
    public ResponseData ProcessClientRequest(String pageId) 
    { 
     ... 
    } 
} 

このメソッドは、そのタイプIは、コンパイル時に知っていないオブジェクトを返す必要があります。次のようにサービスが定義されています。だから、呼び出されたときに次の例外が発生します。

タイプ...データ契約名...は必要ありません。 DataContractResolverの使用を検討するか、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知の型のリストに追加するなど、既知の型のリストに静的に知られていない型を追加することを検討してください。

カスタムDataContractResolverを作成し、カスタムDataContractResolverをサービスに追加するために、インターフェイスIOperationBehaviorを実装する属性を作成します。

public class ApplyProxyDataContractResolverAttribute : Attribute, IOperationBehavior 
{ 
    public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch) 
    { 
     var dataContractSerializerOperationBehavior = 
       description.Behaviors.Find<DataContractSerializerOperationBehavior>(); 
     dataContractSerializerOperationBehavior.DataContractResolver = new ProxyDataContractResolver(); 
    } 
} 

ApplyDispatchBehaviorが正常に呼び出されますが、私のカスタムDataContractResolverのメソッドが呼び出されることはありませんと私は同じ例外を取得する方法

ServiceRouteクラスを使用するか、svcファイルを使用してサービスを登録しようとしましたが、それは動作しません。

+0

この解決方法を知ったのはどのドキュメントですか? – kroonwijk

+0

私は同じ問題を抱えています。誰でも答えがありますか? – kelloti

答えて

2

WebHttpBehaviorとWebScriptEnablingBehaviorは、独自のシリアライザをプラグインする独自のシリアライゼーションフォーマッタをプラグインしています。カスタムシリアライザはすべてのシリアライゼーションとデシリアライズで呼び出されるため、パスが呼び出されることはありません。

あなたがする必要があるのは、そのパスを完全に上書きすることです。これを行う方法は次のとおりです。

WebHttpBehaviorを使用している場合は、サブクラス化してください。 WebScriptEnablingBehaviorを代わりに使用している場合は、その代わりにサブクラス化してください。 、それらを無効にリフレクターを使用し、WebHttpBehaviorとWebScriptEnablingBehaviorでのデフォルトの実装を見てみましょうする方法を理解するには

System.ServiceModel.Description.WebHttpBehavior.GetDefaultClientFormatter(OperationDescription, Boolean, Boolean) : IClientMessageFormatter 

System.ServiceModel.Description.WebHttpBehavior.GetDefaultDispatchFormatter(OperationDescription, Boolean, Boolean) : IDispatchMessageFormatter 

次に、これらの2つのメソッドをオーバーライドします。

あなたは順番にあなたの新しいシリアライザにプラグ自身の動作の挙動、中に順番にプラグ独自の操作フォーマッタ、プラグインする必要がありますことに気づくでしょう。 DataContractJsonSerializerOperationFormatterとDataContractJsonSerializerOperationBehaviorの実装を見て、それらがどのように使用され、インスタンス化されているかを見て、私の意味を理解してください。

私は、これはあなたがおそらく必要以上の仕事ですけど、聞こえるよりも簡単だし、それはあなたが探している正確に何をやらせます!

関連する問題