Chỉ cần tự hỏi trong trường hợp nào bạn muốn tạo proxy từ dịch vụ WCF khi bạn chỉ có thể gọi các cuộc gọi bằng ChannelFactory?
Bằng cách này, bạn sẽ không phải tạo proxy và lo lắng về việc tạo lại proxy khi máy chủ được cập nhật?
Cảm ơn
Chỉ cần tự hỏi trong trường hợp nào bạn muốn tạo proxy từ dịch vụ WCF khi bạn chỉ có thể gọi các cuộc gọi bằng ChannelFactory?
Bằng cách này, bạn sẽ không phải tạo proxy và lo lắng về việc tạo lại proxy khi máy chủ được cập nhật?
Cảm ơn
Câu trả lời:
Có 3 cách cơ bản để tạo ứng dụng WCF:
Hãy để Visual Studio tạo proxy của bạn. Tự động này tạo mã kết nối với dịch vụ bằng cách đọc WSDL. Nếu dịch vụ thay đổi vì bất kỳ lý do gì, bạn phải tạo lại nó. Ưu điểm lớn của điều này là dễ thiết lập - VS có một trình hướng dẫn và tất cả đều tự động. Điểm bất lợi là bạn đang dựa vào VS để làm mọi công việc khó khăn cho bạn, và vì vậy bạn mất kiểm soát.
Sử dụng ChannelFactory
với một giao diện đã biết. Điều này phụ thuộc vào việc bạn có các giao diện cục bộ mô tả dịch vụ (hợp đồng dịch vụ). Ưu điểm lớn là có thể quản lý thay đổi dễ dàng hơn nhiều - bạn vẫn phải biên dịch lại và sửa các thay đổi, nhưng bây giờ bạn không tạo lại mã, bạn đang tham khảo các giao diện mới. Thông thường, điều này được sử dụng khi bạn kiểm soát cả máy chủ và máy khách vì cả hai đều có thể dễ bị chế nhạo hơn nhiều để kiểm tra đơn vị. Tuy nhiên, các giao diện có thể được viết cho bất kỳ dịch vụ nào, ngay cả những dịch vụ REST - hãy xem API Twitter này .
Viết proxy của riêng bạn - điều này khá dễ thực hiện, đặc biệt là đối với các dịch vụ REST, sử dụng dấu HttpClient
hoặc WebClient
. Điều này cung cấp cho bạn khả năng kiểm soát hạt tốt nhất, nhưng với chi phí là rất nhiều API dịch vụ nằm trong chuỗi. Ví dụ: var content = new HttpClient().Get("http://yoursite.com/resource/id").Content;
- nếu các chi tiết của API thay đổi, bạn sẽ không gặp lỗi cho đến thời gian chạy.
Cá nhân tôi chưa bao giờ thích tùy chọn 1 - dựa vào mã được tạo tự động là lộn xộn và mất kiểm soát quá nhiều. Thêm vào đó, nó thường tạo ra các vấn đề về tuần tự hóa - tôi kết thúc với hai lớp giống hệt nhau (một trong mã máy chủ, một được tạo tự động) có thể được đánh dấu nhưng rất khó.
Tùy chọn 2 nên hoàn hảo, nhưng các Kênh hơi quá hạn chế - ví dụ: chúng hoàn toàn mất nội dung do lỗi HTTP . Điều đó nói rằng việc có các giao diện mô tả dịch vụ sẽ dễ dàng hơn nhiều để viết mã và bảo trì.
Tôi sử dụng ChannelFactory cùng với phương thức MetadataResolver.Resolve. Cấu hình máy khách là một vấn đề phiền toái, vì vậy tôi lấy ServiceEndpoint của mình từ máy chủ.
Khi bạn sử dụng ChannelFactory (Của T), T là hợp đồng gốc mà bạn có thể nhận được từ một tham chiếu trong dự án của bạn hoặc một phiên bản hợp đồng được tạo. Trong một số dự án, tôi đã tạo mã từ Tham chiếu dịch vụ vì tôi không thể thêm tham chiếu vào dll hợp đồng. Bạn thậm chí có thể tạo một hợp đồng không đồng bộ với tham chiếu dịch vụ và sử dụng giao diện hợp đồng đó với ChannelFactory.
Điểm chính của việc sử dụng ChannelFactory đối với tôi là loại bỏ thông tin cấu hình máy khách WCF. Trong đoạn mã mẫu bên dưới, bạn có thể thấy cách đạt được một máy khách WCF mà không cần cấu hình.
Dim fixedAddress = "net.tcp://server/service.svc/mex"
Dim availableBindings = MetadataResolver.Resolve(GetType(ContractAssembly.IContractName), New EndpointAddress(fixedAddress))
factoryService = New ChannelFactory(Of ContractAssembly.IContractName)(availableBindings(0))
accesService = factoryService.CreateChannel()
Trong dự án cuối cùng của tôi, các Liên kết sẵn có được chọn để sử dụng net.tcp hoặc net.pipe nếu có. Bằng cách đó, tôi có thể sử dụng ràng buộc tốt nhất có sẵn cho nhu cầu của mình. Tôi chỉ dựa vào thực tế là một điểm cuối siêu dữ liệu tồn tại trên máy chủ.
Tôi hi vọng cái này giúp được
BTW, điều này được thực hiện bằng cách sử dụng .NET 3.5. Tuy nhiên, nó cũng hoạt động với 4.0.
The main point of using ChannelFactory to get rid of the WCF client config
Để sử dụng, ChannelFactory<T>
bạn phải sẵn sàng chia sẻ các hợp đồng hợp đồng giữa dịch vụ và khách hàng. Nếu điều này là ổn với bạn thì ChannelFactory<T>
có thể giúp bạn tiết kiệm thời gian.
Proxy sẽ xây dựng các chức năng không đồng bộ khá hay.
Câu trả lời của tôi là một dạng tóm tắt các câu trả lời của Keith và Andrew Hare .
Nếu bạn không điều khiển máy chủ, nhưng chỉ có WSDL / URL, hãy tạo proxy bằng Visual Studio hoặc svcutil. (Lưu ý rằng Visual Studio đôi khi không thành công, khi svcutil hoạt động tốt hơn).
Khi bạn kiểm soát cả máy chủ và máy khách, hãy chia sẻ giao diện / hợp đồng và gọi ChannelFactory
.
Nó không chỉ là vấn đề thời gian tiết kiệm. Sử dụng proxy được tạo WSDL rất nguy hiểm vì nếu bạn quên cập nhật tham chiếu dịch vụ, bạn có thể để giải pháp ở trạng thái không nhất quán. Mọi thứ được biên dịch nhưng hợp đồng dịch vụ bị phá vỡ. Tôi thực sự khuyên bạn nên sử dụng ChannelFactory bất cứ khi nào có thể, bạn sẽ làm cho cuộc sống của mình dễ dàng hơn nhiều.
Một giải pháp thay thế khả thi có thể là viết một kịch bản dựng sẵn gọi tiện ích SVCUtil để tạo proxy mỗi khi bạn xây dựng dự án của mình, nhưng dù sao thì ChannelFactory cũng gọn gàng và thanh lịch hơn nhiều.