- PR -

.NET Remoting IISをホストとする設定ファイルについて

投稿者投稿内容
たかよ
会議室デビュー日: 2005/11/16
投稿数: 7
投稿日時: 2007-01-03 23:54
お世話になっております。
VB2005で.NET Remotingを使用した開発を行っています。
構成ファイルを使用してIISをホストとする設定を行いたいのですが、
以下例外が発生し正常動作することができません。
コンソールアプリを作成しtcpでの設定では正常に動作しました。

ConfigurationErrorsException
現在の構成システムでは、ユーザーによってスコープされた設定はサポートされません。
-- 構成 -----------------------
インターフェイス:
Public Interface IRemote1
Public Interface IRemote2

クライアント設定ファイル:
<system.runtime.remoting>
 <application>
  <client>
   <wellknown
    type="XXX.IRemote1, XXX"
    url="http://localhost/test/MyApp1.soap"/>
   <wellknown
    type="XXX.IRemote2, XXX"
    url="http://localhost/test/MyApp2.soap"/>
  </client>
 </application>
</system.runtime.remoting>

サーバクラス:
XXX.RemoteClass1
XXX.RemoteClass2

サーバ設定ファイル(Web.config):
<configuration>
 <system.runtime.remoting>
  <application>
   <service>
    <wellknown mode="SingleCall"
     type="XXX.RemoteClass1, XXX"
     objectUri="MyApp1.soap"/>
    <wellknown mode="SingleCall"
     type="XXX.RemoteClass2, XXX"
     objectUri="MyApp2.soap"/>
   </service>
  </application>
 </system.runtime.remoting>
</configuration>

考えられる原因など、ご教授いただければと思います。

以上、よろしくお願いいたします。
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-01-04 10:08
ユーザースコープの設定として認識されちゃってる箇所があるっぽいですねぇ・・・。ぱっと見、クライアント設定ファイルにルート要素 <configuration> の記述がないのが気になりますがどうでしょうか?

いきなり <system.runtime.remoting>要素が登場するから、これがユーザースコープの設定と認識されちゃうのかも

ところで、コンソールアプリはこのクライアント設定ファイルを読み込んだ上で正常動作したのですか?
たかよ
会議室デビュー日: 2005/11/16
投稿数: 7
投稿日時: 2007-01-04 11:28
回答ありがとうございます。

クライアント設定ファイルに<configuration>タグは記述しています。ユーザセッティングも設定している関係でRemotingに関係する箇所のみ記述していました。
以下の形式で記述していますが、Remotingを挿入する箇所がおかしいのでしょうか?
<configuration>
 <configSections>
 ・・・
 </configSections>
 <system.runtime.remoting>
 ・・・
 </system.runtime.remoting>
 <userSettings>
 ・・・
 </userSettings>
</configuration>

コンソールアプリは、クライアントのURL、サーバのobjectUri、<channels>を以下のように変更して実行しました。
クライアント:URL

http://localhost/test/MyApp1.soap
http://localhost/test/MyApp2.soap

tcp://localhost:8085/MyApp1
tcp://localhost:8085/MyApp2

サーバ:objectUri

MyApp1
MyApp2

MyApp1.soap
MyApp2.soap
以下追加
<channels>
<channel ref="tcp" port="8085" />
</channels>
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-01-04 14:06
うちでやってるIISでのリモーティングの設定(1.1ですが)と比べてみると

・サーバ側<channels>要素の中に<channel ref="http"/>を記述してる。
・URIの拡張子が.rem (.soapでも.remでもどっちでもいいんですよね、確か。
・クライアント側は、リモーティング構成とその他のアプリケーション構成のファイルを分けてる。(サンプルで分かれてたから。でも、1つのファイルでも問題なかったと記憶してます

う〜ん・・・、大差ないですねぇ・・・

ところで、ConfigurationErrorsExceptionが発生するタイミングはどこでしょうか?
クライアント側で RemotingConfiguration.Configure メソッドを実行した時ですか?
サーバ側でconfigが読み込まれた時ですか?
たかよ
会議室デビュー日: 2005/11/16
投稿数: 7
投稿日時: 2007-01-04 15:26
回答ありがとうございます。

サーバ側に<channel>タグを追加してもだめでした。

>ConfigurationErrorsExceptionが発生するタイミングはどこでしょうか?
サーバ側のメソッドを実行する際に発生します。
クライアントのConfigは読めているようです。

Dim entry As WellKnownClientTypeEntry = RemotingConfiguration.IsWellKnownClientType(GetType(IRemote1))
oAccessObject = Activator.GetObject(GetType(IRemote1)), entry.ObjectUrl)
oAccessObject.GetXXXX #<-ここで発生

かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-01-04 18:38
なるほど、クライアントにインタフェースのみ公開するやり方ですね。

で、ちと試してみたんですが、特に問題なく動いちゃいました・・・。ただちょっと気になったのは、クライアント側の構成ファイルがNGの場合、クライアントアプリが起動して最初のconfig読み込みでエラーとならず、サーバ側のメソッドを実行する時点で初めてエラーとなるケースもボチボチありました。構成ファイルをぐちゃぐちゃいじってみて同じエラーを出そうとしたんですが出ませんでした・・・。

一応、試したことを書いておきます。
元ネタ⇒リモート処理の例 : インターネット インフォメーション サービス (IIS) でのホスト
@まずそのまんま動くように配置
Aインタフェースのみ公開するやり方に修正して動作することを確認
BconfigSectionsとそこで定義したsectionを追加して正常に動作することを確認
C構成ファイルをいじって目的のエラーを出そうとしてみた

Aで変更した箇所
・クライアント側構成ファイルのwellknownのtypeのとこ、クラス名ではなくインタフェース名に変更
・クライアント側コード
コード:
  //ServiceClass service = new ServiceClass(); 
  //  ↓
  WellKnownClientTypeEntry entry = RemotingConfiguration.IsWellKnownClientType(typeof(IService));
  IService service = (IService) Activator.GetObject(typeof(IService), entry.ObjectUrl); 



このサンプル、もう1度見直してみてはいかがでしょうか。
参考になればよいのですが。
たかよ
会議室デビュー日: 2005/11/16
投稿数: 7
投稿日時: 2007-01-05 12:52
回答ありがとうございます。

サンプルではうまく動作することができました。
しかし、開発環境ではやはり同じメッセージが表示されてしまいます。
ユーザ設定の仕方が間違っているのではないかと考えて、ユーザ設定をすべて
削除し、以下のコードだけで試みましたがだめでした。
他に考えられる原因はありますでしょうか?
また、かめたろ様は構成ファイルを分けているとのことですが、
物理ファイルとして分けているのでしょうか?それとも、プロジェクト内で分けていて
物理ファイルは1つなのでしょうか?

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown
type="xxx.IRemote1, xxx"
url="http://localhost:80/testweb/MyApp2.rem" />
</client>
</application>
</system.runtime.remoting>
</configuration>
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-01-05 14:33
もう、正常動作するサンプルとの相違点を探していくしかないのかないですかねぇ。設定ファイルもサンプルのと比較すると省略してる部分が見受けられるので、できるだけサンプルに近づけてみてはどうでしょうか。または、正常に動くサンプルに肉付けしていくとか。
#実際はあの部分を省略しても動くはずだけど、一応ね

クライアント側の構成ファイルを分けていることについてですが、web.configとRemotingClient.configの2つに物理的に分けています。(クライアントがWebアプリ)

あと、思い出したんですが、サーバ側の設定がうまくいっているかどうかをwsdlを参照することでチェックした記憶があります。
http://localhost:80/testweb/MyApp2.rem?wsdl こんなURLをブラウザでたたいてみて、正常に動いていればwsdlが表示されるはずです。

サーバ側がOKなようでしたら、クライアント側の問題と絞ってもいいような気がします。

スキルアップ/キャリアアップ(JOB@IT)