ここに私が気づくだろう非常に奇妙なものがあります。子スレッドへのアクセス許可/認証をコピーしますか?
私はCRM 2011 Silverlight拡張機能を作成しています。ローカル開発インスタンスではすべて問題ありません。アプリケーションはODataを使用して通信し、背景ですべての操作を実行するために多くの場合System.Threading.Tasks.Task
を使用します(FromAsync
は祝福です)。
しかし、私はCRM 2011 Onlineで自分のアプリケーションをテストすることにしました。私の驚いたことに、もはや機能しなくなりました。私は検索タスクを終了するときにセキュリティ例外を受け取ります。私はCRMは私が既にログインして考えると、あまり意味がありませんでしたライブログインページ、に私をリダイレクトしようとしていることがわかったフィドラーを使用して
、。
は、いくつかのより多くの試行の後、私が発見しましたUIスレッドとは別のスレッドからサービスにアクセスしていたためにエラーが発生しました。
//this will work
private void button1_Click(object sender, RoutedEventArgs e)
{
var query = ctx.AccountSet;
query.BeginExecute((result) =>
{
textBox1.Text = query.EndExecute(result).First().Name;
}, null);
}
//this will fail
private void button2_Click(object sender, RoutedEventArgs e)
{
System.Threading.Tasks.Task.Factory.StartNew(RestAsync);
}
void RestAsync()
{
var query = ctx.AccountSet;
var async = query.BeginExecute(null, null);
var task = System.Threading.Tasks.Task.Factory.FromAsync<Account>(async, (result) =>
{
return query.EndExecute(result).First(); // <- Exception thrown here
});
textBox1.Dispatcher.BeginInvoke(() =>
{
textBox1.Text = task.Result.Name;
});
}
私がスレッドがアクセス許可を使用方法についていくつかの基本を欠けていることはほぼ明らかに思える:
は、ここでは簡単な例です。私の場合は、別のスレッドを使用する方が望ましいですから、権限/認証を「コピーする」方法はありますか?多分、偽装のいくつかの並べ替え?
EDIT:他の誰かがこれに苦労している場合は、query.BeginExecute(null, null);
がUIスレッド上で実行されている限り、他のスレッド(場合によってはTask
)を使用することができます。返されたIAsyncResult
を呼び出し元のスレッドに戻す方法が必要ですが、ManualResetEvent
を使用してこれを行うことができます。
しかし、私はまだ私はかなりわからない
を使用していますそれはおそらく[現在のスレッドの実行コンテキスト]に関連する何である(http://msdn.microsoft.com/en-us/library /system.threading.thread.executioncontext)。 – shambulator
かなり可能ですが、ローカルの社内CRMサーバーで自分のコードをテストすると、すべて正常に動作することを指摘したいと思います。だから、正確に何が起こっているのかはまだ不明です。 – Shaamaan