2010-07-27 42 views
7

Tôi có một phương thức dịch vụ WCF khá đơn giản trả về một IQueryable, chỉ để thử nghiệm. Có lẽ tôi đã có một cái gì đó sai khi cố gắng hiểu những gì IQueryable được thiết kế cho. Tôi rõ ràng có kế hoạch sử dụng điều này với nhà cung cấp IQueryable của NHibernate sau đó. Nhưng trước tiên tôi gặp phải một số vấn đề serialization (ít nhất tôi nghĩ rằng nó có thể là vấn đề) bất cứ khi nào sử dụng một phương pháp WCF trả về một IQueryable. Nó thậm chí không làm việc cho một chuỗi đơn giản.Các vấn đề về IQueryable khi sử dụng WCF

Dưới đây là mã của tôi:

public IQueryable<string> GetEquipmentConfigurations() 
{ 
    var returnValue = new List<string>(); 
    returnValue.Add("test"); 
    return returnValue.AsQueryable(); 
} 

Nó có thể không có nhiều ý nghĩa, nó chỉ là để thử nghiệm cho dù tôi thực sự có được những IQueryables qua dây sử dụng WCF. Bất cứ khi nào tôi gọi phương pháp này bằng cách sử dụng một khách hàng như SoapUI tôi nhận được một ngoại lệ ổ cắm và thiết lập lại kết nối, giống như tôi đã cố gắng trả lại một cái gì đó mà không được đánh dấu là DataContract. Nhưng điều duy nhất tôi làm ở đây là cố gắng trả lại một số danh sách chuỗi tệ hại. Có chuyện gì vậy?

tôi sử dụng basicHttpBinding, sau đây là các thiết lập của tôi:

<system.serviceModel> 
    <services> 
     <service name="EquipmentConfigurationService" behaviorConfiguration="DefaultBehavior"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8000/Krones.KBase/Services/EquipmentConfigurationService"/> 
      </baseAddresses> 
     </host> 
     <endpoint address="" 
        binding="basicHttpBinding" 
        contract="Krones.MES.KBase.Public.Service.EquipmentDefinition.IEquipmentConfigurationService" /> 
     <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="DefaultBehavior"> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="True"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Thuộc tính OperationContract được thiết lập cho giao diện:

[OperationContract] 
IQueryable<string> GetEquipmentConfigurations(); 

Tất cả đều hoạt động tốt khi chỉ trả lại một chuỗi đơn giản. Dù sao tôi muốn lấy lợi nhuận từ các tính năng IQueryable sử dụng LINQ sau này.

Bất kỳ ai có ý tưởng gì đang xảy ra ở đây không?

Cảm ơn và Chúc mừng,

Stefan

+0

Nếu bạn đăng mã hoặc XML, ** vui lòng ** làm nổi bật các dòng đó trong trình soạn thảo văn bản và nhấp vào nút "mã" (101 010) trên thanh công cụ trình soạn thảo để định dạng và cú pháp tô sáng nó! –

Trả lời

5

(cũ) AFAIK nó là không thể ra khỏi hộp để serialize IQueryable <> hoặc Trees Expression (suy nghĩ về nó - nó có nghĩa là cây biểu thức/lambda cần phải được tuần tự hóa và hàm được tạo lại)

Tuy nhiên, khi có ý chí, có vẻ như có cách - bạn có thể muốn xem các dự án như vậy http://code.msdn.microsoft.com/exprserialization

Chỉnh sửa: Lưu ý rằng thời gian đã thay đổi - Xem WCF RIA Services theo bài đăng của Marc Gravell.

Chúc may mắn!

HTH

+0

OK, nhưng sau đó tôi không hiểu làm thế nào WCF Rịa dịch vụ làm việc - họ dường như được sử dụng IQueryables và phơi bày chúng cho khách hàng bằng cách sử dụng một số loại kỹ thuật webservice. Làm thế nào để họ quản lý điều này? Theo như tôi hiểu đây là một trong những lợi ích chính của dịch vụ WCF Rịa, để đường hầm các truy vấn LINQ từ khách hàng thông qua một webservice xuống đến công cụ serialization ...? – Pilsator

+0

Marc Gravell là chính xác. WCF Ria Services (bây giờ gọi là dịch vụ dữ liệu) proxy thực hiện IQueryable cục bộ, tuần tự hóa biểu thức, gửi nó đến IQueryable ở đầu kia và thực hiện ở đó, sau đó proxy trả về kết quả. –

10

Lõi WCF được thiết kế để gửi dữ liệu , không thắc mắc. Stick để trở về List<Foo> vv; nó sẽ giúp bạn tiết kiệm nhiều trầy xước.

Tuy nhiên, bạn có thể có nhiều may mắn hơn khi làm gì sau WCF Data Services, cho phép bạn hiển thị IQueryable<> nguồn.

Cách hoạt động này là công cụ xây dựng ứng dụng khách sẽ hiển thị tương tự như tìm kiếmIQueryable<> móc; khi bạn truy vấn dữ liệu, nó đại diện cho biểu thức trên dây, truy vấn dữ liệu và đưa nó trở lại máy khách. Nhưng nó vẫn là kết quả (không phải truy vấn) đi qua dây.

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