0

私はこれに対する解決策を探してみましたが、今のところ運がありませんでした。

一連のクラスライブラリがあり、各ライブラリ(モジュール/プラグイン)は1つ以上のWCFサービスを実装しています。ここで、アクセス可能なプラグインに基づいてこれらすべてのサービスを追加できる「ホスティング」プロジェクトが必要です。ファイルレスアクティベーションを使用できるため、すべての構成時に実行できることはわかっていますが、インストールされているプラ​​グインを調べて(そのためのコードがあります)、公開されたサービスランタイムを追加するコードが必要です。HTTPだけでなくTCPバインディングも必要なので、すべてをWASを使用してIIS 7(またはそれ以降)でホストする必要があります。

私が見つけたのは、ASP.NET RouteTableクラス(Application_Startに型を追加)を使用して可能であるように思われることですが、これにより、HTTPホスティングのみを使用するように制限されることを理解しています。

私が欲しいのは、「エンドポイント/アクティベーション」にフックして追加できるWAS用のAPIだと思いますが、これまでのところ何も見つかりませんでした。次の設定に相当するもの:

<serviceActivations>
    <add relativeAddress="AwesomeService.svc" service="Classlibrary.WCF.AwesomeService"/>
</serviceActivations>

誰もがそのようなことがどのようにできるか知っていますか?

4

1 に答える 1

0

私はここで説明されているアプローチをうまく使用しました:

http://weblogs.asp.net/andresv/archive/2011/08/29/registering-a-wcf-service-dynamically.aspx

リフレクションハッキングを使用してServiceHostingEnvironmentクラスのプライベートフィールドにアクセスし、実行時にカスタムの「構成ベースのアクティベーション」エントリを追加します。

HttpModuleを使用して、次のようなサービスアクティベーション要素を登録することを選択しました。

    public class ServiceRegistrationModule : IHttpModule
    {
        public void Dispose()
        {
        }

        public void Init(HttpApplication context)
        {
            // Discover and register your services here
            RegisterService("~/Some/Path.svc", null, "The full service class name");
        }

        static object _syncRoot = new object();
        static Hashtable serviceActivations;

        private static void RegisterService(string addr, string factory, string service)
        {
            // This is the code that injects the service activation configuration.
            // In WCF 4 we have the "not very well known" CBA Services (Configuration Based Activation)
            // to allow us to define "file-less" WCF Services (like our Service2 here in this demo) where
            // we have a section in our web.config to register services without the need of having a physical .svc file.
            // The section in the web.config looks like this:
            //
            //      <serviceHostingEnvironment multipleSiteBindingsEnabled="true" >
            //          <serviceActivations>
            //              <add relativeAddress="Service2.svc" service="WcfService2.Service2" />
            //          </serviceActivations>
            //      </serviceHostingEnvironment>
            //
            // And is this configuration what we are going to inject at runtime to simulate having that 
            // information in our web.config, while we haven't.

            lock (_syncRoot)
            {
                if (serviceActivations == null)
                {
                    var ensureInitialized = typeof(ServiceHostingEnvironment).GetMethod("EnsureInitialized");
                    ensureInitialized.Invoke(null, new object[] { });
                    var hostingManagerField = typeof(ServiceHostingEnvironment).GetField("hostingManager", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.GetField);
                    var hostingManager = hostingManagerField.GetValue(null);
                    var serviceActivationsField = hostingManager.GetType().GetField("serviceActivations", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField);
                    serviceActivations = (Hashtable)serviceActivationsField.GetValue(hostingManager);
                }

                if (!serviceActivations.ContainsKey(addr))
                {
                    string value = string.Format("{0}|{1}|{2}", addr, factory, service);
                    serviceActivations.Add(addr, value);
                }
            }
        }
    }

HttpModuleを使用することの欠点は、TCPベースのエンドポイントでは実際には機能しないことです。それは私にとっては問題ではありませんでした。問題がある場合は、上記で参照したブログ投稿で、TCPベースのエンドポイントで機能するアプローチについて説明しています。

于 2013-05-20T19:43:25.163 に答える