- PR -

.Net Remotingで公開するクラス

1
投稿者投稿内容
ラフレシア
会議室デビュー日: 2006/01/30
投稿数: 7
投稿日時: 2006-01-30 10:05
初めて投稿します。

単一のDLLで複数のクラスを提供したいと考え、
http://support.microsoft.com/default.aspx?scid=kb;ja;312107
の手順に従い、リモートオブジェクトを作成しました。

コード:
namespace XXXX
{
  public class A : MarshalByRefObject
  {
    ....
  }
  public class B : MarshalByRefObject
  {
    ....
  }
}

web.configファイル
<system.runtime.remoting>
<application>
      <service>
        <wellknown mode="SingleCall" type="XXXX.A, XXXX" objectUri="XXXX.soap" />
      </service>
</application>
</system.runtime.remoting>



提供するクラスが1つの場合は正常に動作します。
2つ目のクラスを提供しようと、wellknown行を追加(type="XXXX.B, XXXX")すると
例外が発生します。
「メソッドを呼び出そうとしていることが XXXX.B を公開するオブジェクトのタイプ XXXX.A で定義されました。」
serviceから追加しても同様です。

私は何か、根本的な勘違いをしているのでしょうか?
どなたかご教授願います。

環境は
Visual Stadio 2003
Windows XP(IIS5.1)
です。
ラフレシア
会議室デビュー日: 2006/01/30
投稿数: 7
投稿日時: 2006-02-06 08:51
どうやらできないらしいので、
class A と class B を持った class S をつくり、
Sを通して下位の機能にアクセスするようにしましたが、新たな問題が。
試行錯誤の末、
クライアント側のアプリケーション構成ファイルに、
コード:
<channel ref="http" useDefaultCredentials="true" port="0">


と、wellknownの定義を書いて、class A,Bの関数を呼び出すところまでは
動作しているのですが、権限が伝わらない。
class Aを直接使用しているときはexeのユーザ権限で動いていましたが、
class Sはexeの権限で、class A,Bは別の権限に変わっています。
MicrosoftのWebを検索した結果、「これは仕様である」らしい。

リモートオブジェクト全体を、特定の権限で動かしたいだけなのですが
何か設定はないものでしょうか?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-02-06 12:02
とりあえず普通に複数のクラスを公開できます。
設定とかでどこか間違えてないですか?
例えばURLがどちらも一緒になっていたとか。

権限の話もちょっとよく分かりません。
内部で使用するクラスとはどういう使用の仕方をしてますか?
普通に作っている分には、自分のメソッド呼び出しで勝手に権限?
が変わることはないように思いますが…
※まあ複数オブジェクトが普通に呼べたらこちらはあまり意味はないかもしれませんが。
ラフレシア
会議室デビュー日: 2006/01/30
投稿数: 7
投稿日時: 2006-02-06 17:30
ありがとうございます。

引用:
例えばURLがどちらも一緒になっていたとか。



まさにこれでした。

権限の件ですが、試行錯誤の何が影響したのかわかりませんが、
途中で動作がおかしくなりました。
つまりリモートオブジェクトの呼び出し全体に権限が伝わらない。
最終的に
コード:
  <channel ref="http">
	<serverProviders>
		<provider ref="wsdl" />
		<formatter ref="soap" typeFilterLevel="Full" />
		<formatter ref="binary" typeFilterLevel="Full" />
	</serverProviders>
  </channel>


と、
コード:
 <system.web>
    <authentication mode="Windows" /> 
   <identity impersonate="true" userName="user" password="password" />  
 </system.web>


を追加した状態で動きました。
クライアントの設定は変えていません。

class A だけの時は、上記の記述なしで動いていたので、
何がなんだかさっぱりです。
閉じたネットワークの中で動かすので、これで運用します。
ありがとうございました。
1

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