1

セルフホステッド WCF サービスの実装に成功しました。従来の問題については、ホスト バインディング構成は (app.config ではなく) 非標準ソースから読み取られます。このサービスを IIS に移植するときに、設定の読み込みで問題が発生しました。その解決策には、.NET から継承されたクラスの実装が必要であることがわかりましたServiceHostFactory

ただし、私の問題は、CreateServiceHostメソッドが SVC ファイルから具象型と URI のみを受信することですが、このクラスを再利用してさらに実装したかったため、より多くの情報が必要です: を定義するインターフェイスServiceContractや既に構成されているバインディングなど.

@carlosfigueira のこの優れた記事を見つけましたが、その実装ではファクトリを使用して、サービスに固有のホストを 1 対 1 の関係で返します。確かにできますが、それは多くのコピーアンドペーストコードを含むいくつかの特定の工場につながるので、むしろ避けたいと思います. 出来ますか?もしそうなら、どうすればいいですか?

4

1 に答える 1

1

どのコントラクトがサービス クラスによって実装されているかを調べる組み込みの方法はありませんが、コードが難しくなりすぎないようにする必要があります。これは、以下の関数の行に沿ったものです。コントラクトの種類が複数ある場合は、相対アドレスを決定するロジックが必要です (つまり、コントラクトが 1 つの場合は "" を使用し、複数の場合はコントラクト名をアドレスとして使用します)。

private IEnumerable<Type> GetContractType(Type serviceType) 
{ 
    if (HasServiceContract(serviceType))
    { 
        yield return serviceType; 
    } 

    var contractInterfaceTypes = serviceType.GetInterfaces() 
        .Where(i => HasServiceContract(i));

    foreach (var type in contractInterfaceTypes)
    {
        yield return type;
    }

    // if you want, you can also go to the service base class,
    // interface inheritance, etc.
} 

private static bool HasServiceContract(Type type) 
{ 
    return Attribute.IsDefined(type, typeof(ServiceContractAttribute), false); 
}
于 2012-05-18T19:07:10.870 に答える