Đây là điều gì đó rất lạ mà tôi đã nhận thấy.Sao chép quyền/xác thực vào chủ đề con ...?
Tôi đang viết một phần mở rộng Silverlight CRM 2011 và, tốt, tất cả đều tốt trên phiên bản phát triển cục bộ của tôi. Ứng dụng sử dụng OData để giao tiếp, và sử dụng System.Threading.Tasks.Task
rất nhiều để thực hiện tất cả các hoạt động trong nền (FromAsync
là một phước lành).
Tuy nhiên, tôi đã quyết định thử nghiệm đơn đăng ký của mình trong CRM 2011 Online và thấy rằng, với sự ngạc nhiên của tôi, điều đó sẽ không còn hoạt động nữa; Tôi sẽ nhận được một ngoại lệ bảo mật khi kết thúc nhiệm vụ truy xuất.
Sử dụng Fiddler, tôi thấy rằng CRM đang cố gắng chuyển hướng tôi đến trang đăng nhập trực tiếp, mà không có ý nghĩa nhiều, xem xét tôi đã được đăng nhập.
Sau một số nỗ lực nhiều hơn, tôi phát hiện ra rằng lỗi là vì tôi đã truy cập dịch vụ từ một chuỗi khác với chuỗi giao diện người dùng.
Dưới đây là một ví dụ nhanh:
//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;
});
}
Có vẻ như gần như rõ ràng rằng tôi đang thiếu một số nguyên tắc cơ bản về cách sử dụng bài quyền. Kể từ khi sử dụng một thread riêng biệt là thích hợp hơn trong trường hợp của tôi, có cách nào để "sao chép" các điều khoản/xác thực? Có lẽ một số loại mạo danh?
EDIT: Trong trường hợp bất kỳ ai đang đấu tranh với điều này, sử dụng các chủ đề khác (hoặc Task
, tùy từng trường hợp) có thể miễn là query.BeginExecute(null, null);
được thực hiện trên chuỗi giao diện người dùng. Bạn cần một cách để truy xuất trả lại IAsyncResult
quay lại chuỗi cuộc gọi, nhưng bạn có thể thực hiện điều đó bằng cách sử dụng ManualResetEvent
.
Nhưng tôi vẫn muốn biết lý do tại sao các điều khoản darned/chứng thực không được chia sẻ giữa các chủ đề ...
Nó có thể liên quan đến [Context Execution hiện chủ đề của] sự (http://msdn.microsoft.com/en-us/library /system.threading.thread.executioncontext). – shambulator
Rất có thể, tuy nhiên tôi muốn chỉ ra rằng khi kiểm tra mã của tôi trên máy chủ CRM tại chỗ, tại chỗ mọi thứ hoạt động tốt. Vì vậy, nó vẫn còn chưa rõ ràng như những gì chính xác đang xảy ra. – Shaamaan