2013-03-13 18 views
8

Câu hỏi này có liên quan đến Bug in the dynamic language runtime in combination with IIS 7.5lỗi ChannelFactory với đối số động

ChannelFactory treo nếu tôi cung cấp nó với một gõ đúng đối tượng năng động.

dynamic src = "MSFT"; 

var binding = new BasicHttpBinding(); 
var endpoint = new EndpointAddress("http://www.restfulwebservices.net/wcf/StockQuoteService.svc"); 
var channel = new ChannelFactory<IStockQuoteService>(binding, endpoint).CreateChannel(); 

// this will print just fine 
Console.WriteLine(channel.GetStockQuote(src as string)); 

// this will print just fine 
Console.WriteLine(new StockQuoteServiceClient().GetStockQuote(src)); 

// this will never print and the application will hang with no exceptions 
Console.WriteLine(channel.GetStockQuote(src)); 
  • dịch vụ Trên đây là công cộng, không phải của tôi, và bạn có thể kiểm tra mã này mình nếu bạn chỉ cần thêm tài liệu tham khảo phục vụ cho các thiết bị đầu cuối cung cấp trong mã;
  • StockQuoteServiceClient được tạo bởi mục menu Thêm dịch vụ tham chiếu và chỉ mất đối tượng động;
  • Điều kỳ diệu này không xảy ra khi tôi khởi chạy ứng dụng với F5 trên Debug, tất cả các dòng in và chương trình thoát ra chính xác;
  • Nếu tôi chạy nó và sau đó đính kèm trình gỡ rối trong khi thực hiện, tôi có thể nhìn thấy nó treo trên các cuộc gọi đến channel.GetStockQuote(src);
  • Nếu tôi rời khỏi chương trình, chương trình sẽ ăn hết bộ nhớ của tôi;
  • Nó chỉ bị treo khi tôi sử dụng ChannelFactory của riêng mình với các đối tượng động, như được mô tả trong các nhận xét.

Tại sao số điện thoại ChannelFactory của tôi bị treo khi cần đối tượng động làm thông số khi được tạo bởi tham chiếu thêm dịch vụ chỉ chạy tốt?

+0

Sử dụng tính năng phản chiếu cũng hoạt động. var method = channel.GetType(). GetMethod ("GetStockQuote"); var value = (StockQuote) method.Invoke (kênh, đối tượng mới [] {src}); – lstern

Trả lời

3

Khi bạn sử dụng từ khóa động, mọi mã liên quan đến biến động sẽ được DLR biên dịch trong thời gian chạy. Khi bạn gọi một phương pháp sử dụng một biến động, phương pháp chữ ký thực tế là chưa được biết trong thời gian biên dịch và cũng là loại phương thức hoàn trả và tất cả mọi thứ liên quan đến nó tạo ra một cái gì đó Eric Lippert gọi "Dynamic Contagion":

"Như tôi đã chỉ ra lần cuối cùng , khi một đối số của một cuộc gọi là động thì tỷ lệ cược là khá tốt mà trình biên dịch sẽ phân loại kết quả của cuộc gọi là năng động là tốt, sự lây lan taint. kết quả là loại động, với một vài ngoại lệ. ("là" ví dụ luôn trả về một bool.) Bạn có thể "chữa" một biểu thức để ngăn chặn nó lan rộng năng động bằng cách đúc nó để đối tượng, hoặc bất cứ điều gì khác không năng động loại bạn muốn; đúc động để đối tượng là một chuyển đổi danh tính."

WCF internals sử dụng rất nhiều các giao diện và trừu tượng và có một known DLR limitation liên quan đến trừu tượng và giao diện nơi DLR không giải quyết được đúng loại. (Ngoài ra hãy xem tại this SO discussion)

tôi đã có thể gọi một cách chính xác các ChannelFactory sử dụng phản xạ và đúc các tham số với các loại khác (và cũng cố gắng để gọi dịch vụ sử dụng sai loại). vấn đề phải DLR liên quan.

tôi không thể gỡ lỗi trình biên dịch DLR nhưng vấn đề có thể liên quan đến "dyna mic contagion "và lỗi giải quyết giao diện. Với "sự lây lan", mọi phần của lời gọi WCF có thể được biên dịch trong thời gian chạy và lỗi độ phân giải kiểu có thể tạo ra một số vòng lặp trong một số trường hợp góc như thực hiện phương thức ghi đè gọi phương thức cơ sở và lớp cơ sở đã được giải quyết sai cho cùng một đứa trẻ lớp học.

Một số nội bộ WCF thực hiện các hướng dẫn bổ sung khi trình gỡ lỗi được đính kèm (Debugger.IsAttached) bổ sung chung bao gồm trong các xác nhận, kiểm tra và phân bổ. Các hướng dẫn bổ sung có thể cung cấp một số thông tin giết chết "sự lây lan động" và tránh vòng lặp vô tận không có thật.

Các vấn đề liên quan