2009-03-17 9 views
10

Tôi thích hợp với việc có được khoảnh khắc "ma thuật" khi WCF được cấu hình độc đáo và jQuery đang cấu trúc các yêu cầu/sự hiểu biết của nó một cách độc đáo.JQuery/WCF mà không có ASP.NET AJAX:

Tôi có một dịch vụ:

<%@ ServiceHost Language="C#" Debug="true" Service="xxx.yyy.WCF.Data.ClientBroker" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %> 

này đã được đề nghị bởi người đàn ông Rick Strahl để tránh việc để xác định hành vi trong Web.config.

giao diện của tôi cho các dịch vụ WCF ngồi trong lắp ráp khác:

namespace xxx.yyy.WCF.Data 
{  
    [ServiceContract(Namespace = "yyyWCF")] 
    public interface IClientBroker 
    { 
     [OperationContract]   
     [WebInvoke(Method="POST",BodyStyle=WebMessageBodyStyle.Wrapped,ResponseFormat=WebMessageFormat.Json)] 
     IClient GetClientJson(int clientId);  
    } 
} 

Lớp dịch vụ cụ thể là:

namespace xxx.yyy.WCF.Data 
{ 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    class ClientBroker : IClientBroker 
    { 
     public IClient GetClientJson(int clientId) 
     { 
      IClient client=new Client(); 

      // gets and returns an IClient 
      return client; 
     } 
    } 
} 

IClient tôi là một lớp Entity Framework nên được trang trí với DataContract thuộc tính/DataMember thích hợp.

Tôi đang cố gắng gọi dịch vụ WCF của mình bằng các phương pháp được nêu trên blog của Rick Strahl tại http://www.west-wind.com/weblog/posts/324917.aspx (phiên bản "đầy đủ chất béo"). Trình gỡ rối nhảy vào dịch vụ WCF tốt (vì vậy jQuery/JSON của tôi đang được hiểu) và nhận IClient và trả về nó. Tuy nhiên, khi tôi trả lời câu trả lời, tôi nhận được nhiều lỗi vô dụng. Các lỗi tôi đang nhận được không có nghĩa là nhiều.

Tôi đang sử dụng POST.

Tôi có quyền sử dụng Giao diện thay vì đối tượng cụ thể không? Khi nó nhận được vào dịch vụ WCF, nó dường như là mã hóa của kết quả đó là không.

Có ai có ý tưởng nào không?

Trả lời

10

Thoạt nhìn có ba vấn đề với mã của bạn:

1: bạn nên sử dụng ServiceKnownTypeAttribute để xác định loại được biết đến khi phơi bày chỉ các loại cơ sở trong hợp đồng hoạt động của bạn:

[ServiceContract(Namespace = "yyyWCF")]  
public interface IClientBroker 
{ 
    [OperationContract] 
    [ServiceKnownType(typeof(Client))] 
    [WebInvoke(
     Method="GET", 
     BodyStyle=WebMessageBodyStyle.WrappedRequest, 
     ResponseFormat=WebMessageFormat.Json)] 
    IClient GetClientJson(int clientId); 

} 

2: Bạn nên sử dụng WebMessageBodyStyle.WrappedRequest thay vì WebMessageBodyStyle.Wrapped vì sau không tương thích với WebScriptServiceHostFactory.

3: IMHO sử dụng Method = "GET" sẽ được yên tĩnh hơn cho một phương pháp gọi là GetClientJson hơn Method = "POST"

lời khuyên khác tôi có thể cung cấp cho bạn khi làm việc với các dịch vụ WCF là sử dụng SvcTraceViewer.exe kèm với Visual Studio. Nó là một công cụ tuyệt vời cho các mục đích gỡ lỗi. Tất cả bạn cần là thêm phần sau đây để ứng dụng của bạn/web.config:

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="sdt" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData= "WcfDetailTrace.e2e" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

Sau đó gọi phương thức web và tập tin WcfDetailTrace.e2e sẽ được tạo trong thư mục gốc trang web của bạn. Tiếp theo, mở tệp này bằng SvcTraceViewer.exe và bạn sẽ thấy nhiều thông tin hữu ích.Ví dụ nó có thể nói:

Không thể serialize tham số có kiểu 'MyNamespace.Client' (đối với hoạt động 'GetClientJson', hợp đồng 'IClientBroker') vì nó không phải là chính xác gõ 'MyNamespace.IClient' trong số chữ ký phương thức và không có trong bộ sưu tập loại đã biết. Để tuần tự hóa tham số, hãy thêm loại vào bộ sưu tập loại đã biết cho hoạt động sử dụng ServiceKnownTypeAttribute.

Tất nhiên bạn không nên quên nhận xét phần này trước khi đi vào sản xuất hoặc bạn có thể kết thúc với một số tệp khá lớn.

+0

Cảm ơn Darin, Nó chỉ ra vấn đề của tôi là với JSON serializing Entity Framework đối tượng (blogged: http://tinyurl.com/cc4k37). Nhưng mẹo của bạn về SvcTraceViewer là vô giá trong việc nhắc tôi về công cụ tuyệt vời này và cũng phát hiện ra ngoại lệ. Đồng thời: Đồng ý về REST cho một số phương pháp, chỉ cần không phải 1 này! –

2

Tôi chắc chắn 99% bạn không thể trả lại giao diện. Tôi không nghĩ rằng giao diện được serializable.

check out này thread

+0

Cảm ơn Mike, bạn thực sự đúng. Rất nhiều cho API dựa trên giao diện đẹp của tôi, eh ?! Đã hạ cấp giao diện WCF của tôi thành các chuỗi JSON, mang theo tuần tự hóa "trong nhà". –