2010-12-30 13 views
3

Windows Server 2003(Amazon仮想マシン)にWindowsサービスがあります。いくつかのアプリケーションは、(パイプを使用して)それと通信することができますが、それを行うためのラッパーがあります。それはテストされ、それは動作します。また、C#(ASP.NET)で書かれたWebサービスがあり、上記のWindowsサービスと通信します。 Webメソッドが呼び出されると、クラスのインスタンスが作成され、関数が呼び出されます。関数はWindowsサービスに「接続」し、そのサービスにジョブを送信します。しかし、内部Webメソッドがスレッドを作成し、Windowsサービスに「接続」する関数がスレッド内で呼び出された場合、接続は失敗します。 Windowsサービスへの接続はパイプを使用します。 WebサービスはIIS7上で動作します。私のローカルマシン上では、デバッガ(VS 2010で起動されたローカルサーバ)から、あるいはIEからローカルのIIS7で動作するWebサービスのWebメソッドを呼び出すと、すべて動作します。ローカルのすべての作品で - しかし、Amazonインスタンスではありません。私はウェブプログラマーではないので、セキュリティに関する問題があると思います。何かヒント?ありがとう。ASMX Webサービスの問題Windowsサービスと別のスレッドで通信する

編集:ウウェのコメントは私に思い出させました - ウェブメソッドはまずhttpを使っていくつかのファイルをダウンロードしようとし、パスC:\ intetpub \ wwwroot \ files \に保存します。例外:アクセスが拒否されたため、上記のフォルダのセキュリティ設定を変更し、IIS7(IIS_IUSRS)によって作成されたユーザーが明示的にフォルダを読み書きできるようにしました。 。今のファイルをダウンロードすることができますこれらの問題のソースが同じであるように思わ

EDIT:。。溶液はウィルの提案の答えに移動し

+0

「接続に失敗しました」という動作が実際にどのように動作するのか詳細を投稿できますか?私。スタックトレース、ビヘイビアーなどのエラーメッセージが表示されます。 –

+1

「接続」が関数呼び出しであるため、接続が失敗する方法は関係ありません。問題は、Webメソッドを実行する同じスレッドからの通信の場合は、WebサービスからWindowsサービスと通信できます。 Webメソッドが新しいスレッドを作成した場合、通信は失敗します。私は上記のWindowsサービスから詳細を受け取っていません。 Amazon Virtual Machine上の同じスレッドからの作業であり、スレッドが異なっていても、異なるスレッドであっても自分のローカルコンピュータで動作するわけではないので、セキュリティやアクセス権に関連するものだと思っていました。ありがとう。 – Vladimir

+1

@Vladimir:接続がどうして失敗するかは関係ありません。どうして失敗しないのですか?もちろん関連性があります。 –

答えて

2

[OK]をみんな、解決策が見つかり、とされます私自身の質問に対する答えとして、ここに投稿してください。したがって、解決策:

問題は、Webメソッドで作成されたスレッドを偽装する必要があるためです。すべてだ

[WebMethod] 
public void Fnc() 
{ 
    ... 
    ... 
    System.Security.Principal.WindowsIdentity wi = System.Security.Principal.WindowsIdentity.GetCurrent(); 
    System.Threading.Thread postJobThread = new Thread(PostJobThread); 
    postJobThread.Start(wi); 
    ... 
} 

... 

private void PostJobThread(object ob) 
{ 
    System.Security.Principal.WindowsIdentity wi = (System.Security.Principal.WindowsIdentity)ob; 
    System.Security.Principal.WindowsImpersonationContext ctx = wi.Impersonate(); 

    ... 
    // Do some job which couldn't be done in this thread 
    ... 
    // OK, job is finished 
    if(ctx != null) 
    ctx.Undo(); 
} 

:だから、呼び出し元メソッドに私のような何かに持っていました。私の質問にコメントしてくれた皆さん、ありがとうございます。

関連する問題