Aquí hay algo muy extraño que notaria.Copiar permisos/autenticación a hilos hijo ...?
Estoy escribiendo un CRM 2011 Silverlight extensiones y, bueno, todo está bien en mi instancia de desarrollo local. La aplicación usa OData para comunicarse, y usa System.Threading.Tasks.Task
mucho para realizar todas las operaciones en segundo plano (FromAsync
es una bendición).
Sin embargo, decidí probar mi aplicación en CRM 2011 Online y descubrí, para mi sorpresa, que ya no funcionaría; Recibiría una excepción de seguridad cuando termine las tareas de recuperación.
Usando violinista, encontré que el CRM está tratando de redirigir a la página de inicio de sesión en vivo, que no tiene mucho sentido, teniendo en cuenta que ya se había iniciado la sesión.
Después de algunos intentos más, he encontrado que la los errores se debieron a que estaba accediendo al servicio desde un hilo diferente al hilo de UI.
Aquí está un ejemplo rápido:
//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;
});
}
Parece casi obvio que me falta algunos fundamentos sobre cómo utilizan hilos permisos. Como en mi caso es preferible usar un hilo separado, ¿hay alguna forma de "copiar" los permisos/autenticación? Tal vez algún tipo de suplantación?
EDITAR: En caso de que alguien más tenga problemas con esto, es posible utilizar otros hilos (o Task
, según sea el caso) siempre que se ejecute query.BeginExecute(null, null);
en el hilo de la interfaz de usuario. Necesita una forma de recuperar el IAsyncResult
devuelto al hilo de llamada, pero puede hacerlo utilizando un ManualResetEvent
.
Pero todavía me gustaría saber por qué el permisos zurcidos/autenticación no es compartida entre los hilos ...
Es probablemente relacionado con [contexto de ejecución del hilo actual] del (http://msdn.microsoft.com/en-us/library /system.threading.thread.executioncontext). – shambulator
Muy posible, sin embargo, me gustaría señalar que cuando probaba mi código en servidores CRM locales, todo funcionaba bien. Por lo tanto, todavía no está claro qué está sucediendo exactamente. – Shaamaan