Ecco qualcosa di strano che noterei.Copia permessi/autenticazione su thread figlio ...?
Sto scrivendo un'estensione Silverlight CRM 2011 e, beh, tutto va bene sulla mia istanza di sviluppo locale. L'applicazione utilizza OData per comunicare e utilizza molto System.Threading.Tasks.Task
per eseguire tutte le operazioni in background (FromAsync
è una benedizione).
Tuttavia, ho deciso di testare la mia domanda in CRM 2011 online e ho scoperto, con mia sorpresa, che non avrebbe funzionato più; Riceverò un'eccezione di sicurezza quando terminerò le attività di recupero.
Utilizzando Fiddler, ho scoperto che il CRM sta cercando di me reindirizzamento alla pagina di login dal vivo, che non ha molto senso, considerando che ero già collegato.
Dopo alcuni più tentativi, ho scoperto che il errori erano perché stavo accedendo al servizio da un thread diverso rispetto al thread dell'interfaccia utente.
Ecco un rapido esempio:
//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;
});
}
Sembra quasi ovvio che mi manca alcuni fondamenti su come le discussioni utilizzano i permessi. Dal momento che l'utilizzo di un thread separato è preferibile nel mio caso, esiste un modo per "copiare" le autorizzazioni/l'autenticazione? Forse una sorta di imitazione?
MODIFICA: nel caso in cui qualcun altro stia cercando di risolvere questo problema, è possibile utilizzare altri thread (o Task
, a seconda del caso) purché query.BeginExecute(null, null);
sia eseguito sul thread dell'interfaccia utente. È necessario un modo per recuperare il IAsyncResult
restituito al thread chiamante, ma è possibile farlo utilizzando uno ManualResetEvent
.
Ma mi piace ancora di sapere perché il permesso dannatamente/autenticazione non è condivisa tra i fili ...
E 'probabilmente legato alla [contesto di esecuzione del thread corrente] la (http://msdn.microsoft.com/en-us/library /system.threading.thread.executioncontext). – shambulator
Piuttosto possibile, tuttavia vorrei sottolineare che durante il test del mio codice su server CRM locali, tutto funzionava perfettamente. Quindi, è ancora piuttosto poco chiaro su cosa stia succedendo esattamente. – Shaamaan