Tôi đang sử dụng LINQPad để kiểm tra mã (một sản phẩm tuyệt vời, tôi phải nói) nhưng bây giờ tôi gặp phải một ngoại lệ khi tôi cố gắng đặt Thread.CurrentPrincipal thành một IPrincipal tùy chỉnh được đánh dấu với SerializableAttribute sau một mẫu mà chứng minh vấn đềlinqpad và tùy chỉnh IPrincipal serializable
void Main()
{
Thread.CurrentPrincipal = new MyCustomPrincipal();
}
// Define other methods and classes here
[Serializable]
public class MyCustomPrincipal : IPrincipal
{
public bool IsInRole(string role)
{
return true;
}
public IIdentity Identity
{
get
{
return new WindowsIdentity("RECUPERA\\m.casamento");
}
}
}
Khi tôi chạy mã này trong LINQPad (C Chương trình # như Language) tôi nhận được ngoại lệ sau đây
Type is not resolved for member 'UserQuery+MyCustomPrincipal,query_nhxfev, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null'
RuntimeMethodInfo: PluginWindowManager.get_Form()
Nếu tôi loại bỏ tất cả mọi thứ thuộc tính Serializable ổn. Có vẻ như một vấn đề liên quan đến kiến trúc AppDomain mà LINQPad sử dụng và không có khả năng của khung công tác để tìm ra assembly mà xác định MyCustomPrincipal. Ngoài ra, tôi tin rằng việc định nghĩa MyCustomPrincipal vào một assembly khác và đưa nó vào GAC sẽ giải quyết vấn đề, nhưng đó không phải là một lựa chọn cho tôi. Bất cứ ai cũng có ý tưởng?
Cảm ơn, Marco
EDIT: Tôi không biết nếu nó có thể giúp đỡ, nhưng tôi đã có cùng một vấn đề với SqlDependency.Start: đặt Serializable trên IPrincipal khiến khuôn khổ để ném ra một lỗi phàn nàn rằng nó không thể tìm thấy hội đồng xác định loại IPrincipal. Tôi đã giải quyết với một hack đáng ngại:
System.Security.Principal.IPrincipal principal;
principal = System.Threading.Thread.CurrentPrincipal;
System.Threading.Thread.CurrentPrincipal = null;
try
{
SqlDependency.Start(connectionString);
m_SqlDependencyStarted = true;
}
catch (Exception ex)
{
throw (ex);
}
finally
{
System.Threading.Thread.CurrentPrincipal = principal;
}
này trông giống như một vấn đề LINQPad. Tôi sẽ xem xét chi tiết hơn và đăng lại. –
@JoeAlbahari bạn có bất kỳ cập nhật nào về điều này không? Nó thực sự gây phiền nhiễu và tôi không tìm thấy bất kỳ workaround – mCasamento
Tôi nghĩ rằng tôi đã tìm thấy một câu trả lời ở đây: http://stackoverflow.com/questions/11489673/preventing-thread-currentprincipal-from-propagating-across-application-domains, nhưng nó không hoạt động cho LINQPad vì các cuộc gọi tên miền chéo được bắt đầu từ cả hai phía. A * lot * các dấu phẩy đi vào trong LINQPad giữa các tên miền máy chủ và nhân viên - có hơn một tá phương pháp - do đó, nó không chỉ là một câu hỏi hacking xung quanh một cuộc gọi duy nhất. –