現在、ウィンドウ サービスで wcf サービスをホストする作業を行っています。wcf サービスは、クライアントがエンティティ フレームワークを使用してデータベースにアクセスできるようにします。私はそれらすべてを機能させました。私が試した2つの条件があり、異なる結果が得られます。
1) app.config ファイルの接続文字列内でデータソースを動的に変更するために、Windows サービスの Service クラスにプログラムでデータベース パスをハードコーディングしたとき。以下のコードを実行した後、Web を使用してサービスを介してクエリ データを取得できます。 XML ドキュメントを返すブラウザ。ただし、2) は何らかの理由で機能しません。app.config のデータソースの変更を動的に保存するには、次のコードを参照してください。
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
EntityConnectionStringBuilder efb =
new EntityConnectionStringBuilder(
config.ConnectionStrings.ConnectionStrings["iPhysioAndroidDBEntities1"]
.ConnectionString);
SqlConnectionStringBuilder sqb =
new SqlConnectionStringBuilder(efb.ProviderConnectionString);
**// hard-coded the db path
sqb.DataSource = "C:\\Users\\Siu W\\Desktop\\data\\iPhysioAndroidDB";**
efb.ProviderConnectionString = sqb.ConnectionString;
Console.WriteLine(sqb.ConnectionString);
config.ConnectionStrings.ConnectionStrings["iPhysioAndroidDBEntities1"]
.ConnectionString = efb.ConnectionString;
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("connectionStrings");
2) 上記の同じコードで完全な db ファイル パスに System.environment.Username を使用してマシンから現在のユーザー名を取得しようとすると、デバッグ モードでブレークポイントを配置すると、マシンのユーザー名が返されます。しかし、Web ブラウザーを使用してサービスを介してクエリ結果を取得できません。「リクエストエラー」と表示されます。
**// dynamically get the user name for the db path
sqb.DataSource = "C:\\Users\\" + System.Environment.UserName + "\\Desktop\\data\\iPhysioAndroidDB";**
問題は本当に奇妙です。どちらの方法でも同じ db パスが返されることを確認しましたが、ハードコードされた方法のみが機能します。誰かがこれの理由とこれを解決する方法を知っていますか?