2009-10-29 7 views
6

Tôi có một dự án WCF Service trong Visual Studio 2008 chứa khoảng 12 phương thức, một số trong đó trả về các kiểu nguyên thủy như bool hoặc chuỗi. Tôi cũng có một dự án thử nghiệm đơn vị Visual Studio tham chiếu đến dịch vụ WCF đã xuất bản. Dự án thử nghiệm biên dịch thành công khi tất cả các kiểu trả về là nguyên thủy.Dịch vụ WCF trả về một lớp tùy chỉnh tạo ra lỗi trong Reference.cs

Nếu tôi thêm phương thức mới vào dịch vụ trả về một lớp tùy chỉnh, hãy xuất bản nó và cập nhật tham chiếu dịch vụ trong Dự án thử nghiệm, nó không biên dịch. Các lỗi là: -

  1. Loại 'PublisherFaultException' đã chứa định nghĩa cho 'Lý do'.
  2. Loại 'PublisherFaultException' đã chứa định nghĩa cho 'PropertyChanged'.
  3. Nhập 'Publisher.Test.LibraryReference.PublisherFaultException' đã xác định thành viên có tên 'RaisePropertyChanged' có cùng các loại thông số.

tất cả trong tệp tham chiếu được tạo tự động.cs.

Hợp đồng đối với phương pháp của các dịch vụ WCF là: -

Page GetItem(string path); 

và trang lớp có thuộc tính DataContract và đó là tài sản công cộng có thuộc tính DataMember.

Tôi không muốn sửa đổi tệp Reference.cs vì tôi sẽ cần thực hiện việc này mỗi khi Dịch vụ được cập nhật.

Bất kỳ ai biết tại sao điều này xảy ra?

Stuart.

+0

những gì đang xảy ra là WCF thêm tham chiếu dịch vụ là một bitch - Tôi cảm thấy nỗi đau của bạn – JohnIdol

+0

Bạn đã cố gắng tạo proxy bằng svcutil chưa? Tôi nhớ có vấn đề này trước đây, và đó là khi tôi đã tạo ra các lỗi ngoại lệ tùy chỉnh bằng cách sử dụng thuộc tính FaultContract. Tôi không nhớ giải pháp. Vì vậy, hy vọng ý kiến ​​của tôi có thể giúp đỡ. Tôi sẽ tiếp tục đào và xem liệu tôi có thể tìm ra giải pháp hay không. Hãy thử SvcUtil.exe và xem những gì xảy ra và cho chúng tôi biết. – CkH

Trả lời

1

Khi bạn thêm tham chiếu dịch vụ, bạn sẽ nhận được tùy chọn 'sử dụng lại các loại trong lắp ráp' - đây có thể là chìa khóa để phân loại trùng lặp.

Hoặc bạn có một số Tài liệu tham khảo thử nghiệm đang gây ra sự trùng lặp không?

Ngoài ra, hãy xem phần Tham chiếu của cây dự án và xem có bất kỳ điều gì không mong muốn trong đó (bạn có tham chiếu đến 2 hội đồng chứa cả Tham chiếu dịch vụ trong cùng một không gian tên không?).

+0

"Các loại tái sử dụng trong tất cả các bộ tham chiếu" được chọn. Điều này có đúng không? Lớp Trang thuộc về một hội đồng mà, trong khi nó nằm trong giải pháp VS, không được tham chiếu trực tiếp bởi dự án thử nghiệm. –

+0

Tái sử dụng là công trình chung tốt, mặc dù có [đối số dài] đối với chỉ đạo rõ ràng về hợp đồng chia sẻ theo cách này. PublisherFaultException có trong hợp đồng không? Nó có được đánh dấu bằng Thuộc tính hợp đồng thích hợp không? (Tôi havent nhìn thấy trường hợp chính xác bạn đang nhìn thấy, nhưng tôi muốn được root gây ra nó bằng cách làm theo các dấu vết của tài liệu tham khảo). Tôi lấy nó, bạn đã nhấp vào nút hiển thị tất cả các tập tin trên đỉnh của trình thám hiểm dự án và nhìn vào references.cs để xem mã được tạo ra để xác định những gì nó có thể được đụng độ với? –

+0

PublisherFaultexception nằm trong tệp Reference.cs được tạo tự động khi cập nhật tham chiếu Dịch vụ. Nó chứa hai khai báo lớp cho PublisherFaultException (cả hai lớp một phần là tốt), nhưng cả hai đều có thuộc tính Public Reason, PropertyChanged event và phương thức RaisePropertyChanged. Bản thân lớp ReportPublisherException thực sự nằm trong dự án WCF và không có các thuộc tính DataContact và DataMember. –

1

Sử dụng lớp proxy được tạo tự động luôn là sự đau đớn.

Để xử lý tình huống như thế này, tôi sử dụng lắp ráp riêng với các lớp hợp đồng dữ liệu và giao diện dịch vụ.

Hợp đồng dll sẽ có:


public interface IService 
{ 
    [OperationContract] 
    List GetContentList(); 
} 

[DataContract] 
public class ContentItem 
{ 
    [DataMember] public string Name; 
    [DataMember] public object Data; 
} 

Các khách hàng sẽ phải tham chiếu đến Contract.dll. Proxy sẽ được tạo theo cách thủ công:


class ServiceProxy : ClientBase<IService>, IService 
{ 
    public List GetContentList() 
    { 
    return Channel.GetContentList(); 
    } 
} 

Dll máy chủ sẽ có tham chiếu đến cùng một dll hợp đồng. Vì vậy, chúng tôi sẽ có thể tránh bất kỳ lỗi nào với proxy được tạo tự động. Cũng proxy được tạo thủ công sẽ đơn giản hơn, dễ quản lý hơn.

0

Khi thêm tham chiếu dịch vụ, hãy thử nhấp vào Nâng cao và chọn "Tạo hoạt động không đồng bộ".

Tôi nghĩ điều đang xảy ra là có một số phương pháp không đồng bộ trong dịch vụ web, với tên kết thúc bằng "Async", sẽ xung đột với các phương thức được tạo trong References.cs.

ví dụ: hãy tưởng tượng dịch vụ web chứa 2 phương pháp: (1) SayHello và (2) SayHelloAsync.

Tạo bằng cách sử dụng phương pháp mặc định nhiệm vụ dựa trên sản xuất:

  • SayHelloSayHelloAsync cho (1)
  • SayHelloAsyncSayHelloAsyncAsync cho (2).

Xung đột xảy ra do có 2 phương pháp được tạo được gọi là SayHelloAsync.

Ít nhất tôi nghĩ đó là những gì đang diễn ra. Dù sao thiết lập "Tạo hoạt động không đồng bộ" làm việc cho tôi.