これが私が気付いた非常に奇妙なことです。
私はCRM2011Silverlight拡張機能を作成していますが、ローカル開発インスタンスではすべて問題ありません。アプリケーションはODataを使用して通信System.Threading.Tasks.Task
し、バックグラウンドですべての操作を実行するために多くを使用します(FromAsync
これは祝福です)。
しかし、CRM 2011 Onlineでアプリケーションをテストすることにしましたが、驚いたことに、アプリケーションが機能しなくなったことがわかりました。取得タスクを終了すると、セキュリティ例外が発生します。
Fiddlerを使用して、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;
});
}
スレッドがパーミッションをどのように使用するかについてのいくつかの基本が欠けていることはほぼ明らかなようです。私の場合は別のスレッドを使用することが望ましいので、権限/認証を「コピー」する方法はありますか?おそらく、ある種のなりすまし?
編集:他の誰かがこれに苦労している場合は、UIスレッドで実行されているTask
限り、他のスレッド(または場合によっては)を使用することが可能です。返されたスレッドにquery.BeginExecute(null, null);
戻る方法が必要ですが、を使用してそれを行うことができます。IAsyncResult
ManualResetEvent
しかし、なぜ私はとんでもない許可/認証がスレッド間で共有されないのか知りたいです...