2013-08-16 27 views
7

Tôi có dịch vụ WCF, hãy gọi số UserService. UserService có tham chiếu đến thư viện lớp học. Hãy gọi nó là DoWork.dll. Các DoWork.dll có một tài liệu tham khảo dịch vụ WCF đến một dịch vụ khác nhau, chúng tôi sẽ gọi CompanyService.Lỗi cấu hình điểm cuối WCF: Thuộc tính 'hợp đồng' không hợp lệ?

Bây giờ, khi tôi lần đầu tiên thử gọi số UserService tôi sẽ nhận được thông báo lỗi không được cấu hình điểm cuối. Sau khi đọc trên web tôi đã tìm thấy rằng tôi cần phải thêm các thông tin ràng buộc và thông tin khách hàng CompanyService vào số web.config của UserService dưới nút <system.serviceModel>.

Ở đây là:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IComapnyService" /> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint name="BasicHttpBinding_ICompanyService" 
      address="http://it-dev.company.local:81/Project/Copmpany/CompanyService.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_IComapnyService" 
      contract="CompanyService.ICompanyService" /> 
    </client> 

Tôi có vấn đề là contract="CompanyService.ICompanyService" chỉ cho tôi lỗi:

The 'contract' attribute is invalid - The value 'CompanyService.ICompanyService' is invalid according to its datatype 'clientContractType' - The Enumeration constraint failed.

Bây giờ, nếu tôi thêm các CompanyService tham khảo trực tiếp đến dự án WCF UserService, các lỗi biến mất (rõ ràng). Tuy nhiên, tôi không nên làm điều này. Tôi đã thử hoàn toàn đủ điều kiện không gian tên hợp đồng ICompanyService và điều đó cũng không hoạt động. Tôi đã xóa tập tin .suo và xây dựng lại dự án và nó cũng không hoạt động (được đề xuất ở đâu đó trên web). Ngoài ra, nếu tôi nhập contract=, tôi nhận danh sách thả xuống nhưng không tìm thấy CompanyService.ICompanyService (chỉ khi tôi tham khảo dịch vụ trực tiếp trong dự án UserService).

Tôi đã thử định cấu hình nó bằng cách sử dụng Tools > WCF Service Configuration Editor và điều đó không có tác dụng.

Tôi nên lưu ý rằng mọi thứ dường như hoạt động tốt, nhưng tôi không thích thực tế là intellisense đưa cho tôi đường gạch dưới màu xanh nhạt và thông báo lỗi đó. Tôi có cảm giác tôi cần một thứ gì đó khác trong số web.config để làm việc này kể từ khi tham chiếu UserService tham chiếu đến số DoWork.dll, do đó tham chiếu đến CompanyService mà hợp đồng mà tôi không thể thấy chính xác.

Bất kỳ đề xuất nào được đánh giá cao. Cảm ơn trước.

+0

Tôi đã xem xét điều này gần đây và thấy rằng thực sự bao gồm cả không gian tên đầy đủ đã góp phần vào vấn đề của tôi. Hữu ích để lưu ý cho bất cứ ai khác với vấn đề này. – Ian

Trả lời

2

Bạn nói đúng - bạn không cần phải làm điều này.

Kiến trúc có DLL (DoWork.dll) với "tham chiếu dịch vụ" (ComanyService) không hợp lệ. Trừ khi DLL đã mã hóa cứng điểm cuối máy khách (trong mã) để gọi cho CompanyService cho bạn, thì bất kỳ ai sử dụng DLL sẽ phải cố gắng tìm ra cách cấu hình điểm cuối ứng dụng khách cho dịch vụ mà họ không biết. Đó là những gì bạn đang chạy vào.

Lý do này hoạt động khi bạn thêm một tham chiếu dịch vụ trực tiếp từ UserService của bạn là khi bạn làm điều này, bạn sẽ nhận được một bản sao ServiceContract từ siêu dữ liệu CompanyService. Để chứng minh điều này, hãy tìm trong tệp Reference.cs được tạo, tìm kiếm CompanyService và bạn sẽ thấy nó có thuộc tính [ServiceContract], xác định nó như một dịch vụ WCF. Hơn nữa, bạn sẽ thấy các thuộc tính [OperationContract] cho các phương thức, cộng với bất kỳ [DataContracts] nào mà dịch vụ của tôi cũng trao đổi. Nói cách khác, tất cả các "loại" này đã được nhập vào dự án của bạn và khi bạn biên dịch, WCF giờ đây có thể tìm thấy các loại này khi khởi tạo điểm cuối ứng dụng khách.

Nếu CompanyService là một trong các dịch vụ của bạn, hãy xem xét giải nén định nghĩa ServiceContract (giao diện) thành một DLL riêng biệt. Sau đó, bạn có thể tham chiếu các loại đó dưới dạng "tham chiếu assembly" từ dịch vụ (CompanyService) và bất kỳ ứng dụng khách nào, chẳng hạn như UserService.Ít nhất theo cách đó bạn không phải thêm một tham chiếu dịch vụ. Tuy nhiên, bạn vẫn phải điền vào phần .... trong ứng dụng của bạn cho một dịch vụ mà bạn về mặt kỹ thuật có thể không biết chi tiết. Không phải là cách tiếp cận tốt nhất.

Cách tiếp cận tốt hơn là di chuyển phụ thuộc dịch vụ ra khỏi DoWork.dll. Bạn có thể làm điều này bằng cách di chuyển logic vào triển khai UserService.

Hoặc, nếu bạn cần giữ độc lập DoWork.dll, hãy cân nhắc việc gói DoWork với nó trên Dịch vụ WCF, điều này sẽ phụ thuộc vào CompanyService. Sau đó, từ UserService, thêm một tham chiếu dịch vụ vào dịch vụ DoWork mới. Điều này phù hợp hơn với người thuê SOA và sẽ cho phép các dịch vụ của bạn phát triển độc lập.

+0

Cảm ơn thông tin. Có lẽ kiến ​​trúc của tôi là xấu. CompanyService chỉ là một dịch vụ WCF bởi vì tôi cần nó hoạt động như một singleton với hành vi dịch vụ của InstanceContextMode.Single. Trong hệ thống của tôi bây giờ, một phương thức dịch vụ trong CompanyService sẽ KHÔNG BAO GIỜ được gọi từ bất cứ đâu ngoài DoWork.DLL. Vì vậy, câu hỏi tiếp theo của tôi là tôi nên cứng mã điểm cuối trong DoWork.DLL hoặc tôi nên làm đi với ComapnyService tất cả cùng nhau và bằng cách nào đó di chuyển logic của nó vào DoWork.dll (bằng cách nào đó duy trì hành vi singleton)? Cảm ơn. – BBauer42

+1

Không, đừng mã hóa điểm cuối. Tùy chọn cuối cùng tôi giới thiệu cho bạn có thể sẽ hoạt động tốt nhất cho kịch bản của bạn. Có nhiều cách (thông qua các thiết lập bảo mật) để đảm bảo rằng dịch vụ gói DoWork.DLL là dịch vụ duy nhất có thể gọi cho CompanyService. Vì vậy, một cái gì đó như thế này. UserService <--> NewWrapperService (dowork) <--> CompanyService –

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