2011-01-24 23 views
8

Tôi đang cố gắng viết một số mã trong C# sẽ gọi một dịch vụ WCF khi đang di chuyển bằng cách nhập WSDL, kiểm tra nó và sau đó thực hiện các cuộc gọi đến nó một cách tự động.Gọi một dịch vụ WCF mà không cần tạo một Assembly

Dịch vụ tôi gọi có thể thay đổi theo thời gian - vì vậy nếu tôi muốn khách hàng biết về các phương thức mới và thông số đầu vào mới và tham số đầu ra cho cuộc gọi mà không cần xây dựng lại máy khách.

Một giải pháp khả thi cho việc này là nhập và biên dịch tham chiếu dịch vụ khi đang di chuyển.

được nêu ở đây: Creating an assembly on the fly from a WSDL

Tôi muốn tránh việc tạo ra một lắp ráp và sau đó phản ánh qua nó nếu có thể.

Tôi đã xem mã của proxy động trong liên kết và họ sử dụng lớp khung làm việc để nhập. Lớp này là WsdlImporter. Vì vậy, tôi đã nghĩ tuyệt vời - tôi có thể sử dụng nó và kiểm tra lược đồ WSDL và xác định những gì các cuộc gọi có mặt và những gì đầu vào và đầu ra có sẵn.

Vấn đề là thiếu thông tin loại trong các đối tượng MessagePartDescription mà các đối tượng WsdlImporter tạo. Dường như đây là thiếu because it cannot find the types yet - see the response to the question from Brian.

Vì vậy, bất kỳ lời khuyên nào về cách tôi nên tiến hành? Tôi hoàn toàn đi sai đường ở đây à?

+0

Bạn có thể cho một ví dụ thực tế về cách thức này sẽ hữu ích? Có giao diện người dùng nào được trình bày cho người dùng của ứng dụng khách của bạn cho phép họ chọn các phương thức để gọi, có lẽ một số loại lịch biểu hay gì đó không? Ngoài ra, có gì sai với việc tạo ra một hội đồng trên bay? Nghe có vẻ khá đơn giản. Bạn đang hình dung một cái gì đó đơn giản hơn là phản ánh? Tôi gặp khó khăn khi chụp ảnh. – JohnOpincar

+1

Điều này sẽ được sử dụng để gọi một dịch vụ WF. Luồng công việc có thể thay đổi - các bước có thể được thêm vào/gỡ bỏ, v.v. – Neil

+0

@JohnOpincar - Phản đối của tôi không phản ánh - đó là việc biên dịch trên máy bay. Dường như nó là một cách tiếp cận có thể gây ra vấn đề bảo mật tại một số điểm, và * có thể * mong manh. Cũng có vẻ lạ với tôi khi tất cả thông tin nằm trong WSDL và cho rằng cuối cùng tất cả các cuộc gọi sẽ được sắp xếp thông qua một cái gì đó trông rất giống một API năng động, xây dựng một lớp động với sự phản chiếu trên một lớp tĩnh được tạo động mà sau đó ánh xạ tới một lớp động là hơi nhiều. Tạo lắp ráp trên bay là kế hoạch dự phòng của tôi. – Neil

Trả lời

5

Điều này có lẽ không phải là câu trả lời nhưng tôi sẽ đăng câu trả lời đó làm một để mô tả đầy đủ ý kiến ​​của tôi.

Proxy động:
IMO đây là ví dụ về sử dụng sai công nghệ. Đó là hành vi cơ bản của WSDL - nếu nó thay đổi bạn phải thay đổi máy khách hoặc bạn phải tạo ra phiên bản WSDL tốt và tạo ra máy khách mới.

Bạn vẫn phải bằng cách nào đó nói rằng khách hàng của bạn nhận WSDL - điều đó có nghĩa là bạn sẽ phân tích cú pháp WSDL trước mỗi cuộc gọi? Có vẻ như không phải là một ý tưởng hay.

Thông tin về các loại thực sự không phải là một phần của WSDL vì bởi WSDL mặc định được tạo ra có thể tương thích. Các loại CLR không hoạt động cần thiết cho khả năng tương tác. Khi bạn tạo proxy dịch vụ bằng cách thêm tham chiếu dịch vụ hoặc Svcutil, nó sẽ tạo mã cho các kiểu được định nghĩa trong WSDL. Mã đó sau đó cần được biên dịch.

Bạn có thể thử sử dụng NetDataContractSerializer thay vì mặc định DataContractSerializer. NetDataContractSerializer thêm thông tin kiểu CLR vào WSDL nhưng tôi vẫn hy vọng rằng các kiểu mới phải được biết đến với các máy khách của bạn - nó có nghĩa là triển khai lắp ráp mới với các kiểu và sử dụng nó bởi các máy khách. Điều này gần như âm thanh giống như cách tiếp cận tương tự khi đơn giản triển khai lắp ráp với proxy máy khách tĩnh mới.

động WF client
Tôi cũng không thấy quá nhiều việc sử dụng của kiến ​​trúc này - bạn vẫn cần phải thay đổi khách hàng để phản ánh bước WF mới, không bạn?

Thay đổi WF
Chúng ta đang nói về nền tảng Windows Workflow? Tôi khó có thể tưởng tượng kịch bản mà bạn tạo WF, phơi bày nó như một dịch vụ và sau đó thay đổi nó. Khi bạn trưng ra WF như dịch vụ, bạn có thể định nghĩa WF đang chạy dài. WFs dài chạy sử dụng sự kiên trì dựa trên serialization (ít nhất là trong WF 3.5 nhưng tôi tin rằng nó là giống nhau trong WF 4).Khi bạn thay đổi định nghĩa WF, tất cả các WF vẫn tồn tại có thể bị hủy hoại bởi vì chúng sẽ không bao giờ deserialize. Tình huống này thường được giải quyết bằng cách triển khai song song phiên bản mới và cũ, trong đó phiên bản cũ chỉ được sử dụng để hoàn tất WF không hoàn chỉnh. Một lần nữa nó có nghĩa là khách hàng mới.

+0

Cảm ơn nhận xét của bạn, như bạn nói nó không giải quyết được vấn đề của tôi nhưng tôi sẽ +1 nó bởi vì nó được cho là kích động - Tôi đồng ý với đánh giá của bạn về WSDL vì nó liên quan đến các loại. Tuy nhiên, nếu WsdlImporter sẽ cho tôi biết những gì các loại WSDL tôi có thể đến nơi tôi muốn đi. Tôi không cần loại CLR. Xem nhận xét tiếp theo của tôi về Khách hàng động. – Neil

+1

Chúng ta đang nói về các lớp WF dài đang chạy. Không có lý do gì để thêm một bước vào quy trình làm việc của tôi nên yêu cầu xây dựng lại máy khách không thực hiện bước đó. Ngoài ra, nếu bạn muốn xây dựng xương sống để quản lý tương tác khách hàng của mình với quy trình làm việc và có tất cả khách hàng tuân theo giao diện chuẩn, bạn cần phải kênh tất cả các cuộc gọi thông qua API hẹp hơn API mà dịch vụ WF sẽ tạo. – Neil

+0

@Neil: Trong trường hợp này, tôi có thể sẽ đi theo hướng khác. Tôi sẽ duy trì tất cả sự phức tạp này ở phía máy chủ. Nó có nghĩa là lưu trữ WF trong quá trình của bạn và hiển thị dịch vụ web với giao diện nổi tiếng được chuẩn bị cho các thay đổi WF. Đó là ý tưởng cấp cao nhưng nó sẽ là có thể và nó sẽ dễ dàng hơn "khách hàng dịch vụ web động". –

1

Nếu bạn nhìn vào vấn đề từ một góc độ khác. Bạn có cần phải tạo lại proxy mỗi lần hoặc bạn có cần một hợp đồng tiếp tục hoạt động khi mọi thứ thay đổi không?

WCF có một cơ chế để IExtensibleDataContracts này xem: http://msdn.microsoft.com/en-us/library/ms731083%28v=VS.100%29.aspx

Thực hành tốt nhất cho phiên bản của hợp đồng có thể được tìm thấy here

+0

+1 Cảm ơn bạn đã trả lời - nó có thể hữu ích cho người khác.Thật không may, chúng tôi đã kiểm soát hạn chế đối với dịch vụ WCF mà WF tạo ra, vì vậy chúng tôi không thể thực sự đi theo tuyến đường đó. – Neil

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