2017-02-20 11 views
0

カスタムコンフィグレーションファイルを持つアセンブリライブラリ内でWCFサービスを呼び出す際に苦労しています。 WCFサービスはCitrix Xen Server環境内で実行されるため、おそらく問題の原因になります。wcfサービスとカスタムコンフィグレーションパスを使用

アセンブリライブラリを参照するコンソールアプリケーションをセットアップし、WCFサービスエンドポイントに接続するライブラリ内のパブリックメソッドを呼び出し、WCF関数の呼び出しから取得したデータをWindowsフォームのDatagrid内に表示します。そのよう

var assembly = Assembly.GetAssembly(typeof(E2ADokumente)); 
var assemblyFilePath = assembly.Location; 
var assemblyDirectory = Path.GetDirectoryName(assemblyFilePath); 
var dllName = assembly.GetName().Name + ".dll.config"; 
string configPath = Path.Combine(assemblyDirectory, dllName); 
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", configPath); 

WCFプロキシがあるの構築:

は今、私は、アセンブリライブラリによって表示されるウィンフォームクラスのE2ADokumente "のコンストラクタ内の現在のアプリケーションドメインの設定パスを設定しています:

WSTrustChannelFactory channelFactory = new WSTrustChannelFactory("STSEndpunkt") 

"STSEndpunkt"は、設定ファイルで定義されています。

コードをローカルで実行するとすべて動作しますが、ターミナルサービス環境内で同じアプリケーションを実行すると、設定ファイルが見つからないことがあります。 "STSEndpunkt"が見つかりませんというエラーメッセージが表示されます。

新しいアプリケーションドメイン内でアセンブリライブラリを実行しても、ターミナルサービス環境内で動作します。しかし、別のレイヤーを持ち、リフレクションによってメソッドを呼び出すのはオーバーヘッドがあまりにも大きいので、私は単純なソリューションを探しています。

ターミナルサービス内で実行されるアセンブリライブラリ内のWCF構成の詳細を含む構成ファイルのパスを設定するにはどうすればよいですか?

コードでのWCFチャネル設定の構築はオプションではありません。

答えて

0

多くのgoogle-fuの後に解決策が見つかりました。

アセンブリライブラリのコンフィグレーションパスの設定は、クラスの静的コンストラクタ内で行われた場合に機能します。

static E2ADokumente() 
{ 
    var assembly = Assembly.GetAssembly(typeof(E2ADokumente)); 
    var assemblyFilePath = assembly.Location; 
    var assemblyDirectory = Path.GetDirectoryName(assemblyFilePath); 
    var dllName = assembly.GetName().Name + ".dll.config"; 
    string configPath = Path.Combine(assemblyDirectory, dllName); 
    AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", configPath); 
} 

その後、WCFサービスの設定ファイルがアセンブリライブラリによって読み込まれました。

ターミナルサービス内でアプリケーションが実行されている点がどのように異なるのかは分かりませんが、少なくともこれは簡単な修正です。

関連する問題