2008-10-19 26 views
5

Tôi có một dịch vụ web mà tôi đang gọi từ một ứng dụng biểu mẫu cửa sổ (cả .NET, cả trong cùng một giải pháp) và tôi muốn dịch vụ web của tôi trả về một đối tượng tùy chỉnh từ những nơi khác trong dự án - đó là một đối tượng chung mà cả hai đều chia sẻ một tham chiếu đến, vì nó nằm trong dự án thứ ba trong giải pháp của tôi. Khi tôi gọi webservice, nó trả về một đối tượng "Person", nhưng nó nằm trong vùng tên của webservice, và nó được tạo ra từ một lớp proxy mà bản thân webservice đã tạo ra. Như vậy, tôi không thể thao tác nó và trả nó lại cho chương trình của tôi, đang mong đợi một đối tượng "Person" dựa trên bản sao được chia sẻ của lớp, không phải là bản sao proxy từ không gian tên webservice và tôi gặp lỗi khi tôi thử để CType nó vào loại lớp chính xác.Lực lượng .NET webservice sử dụng lớp đối tượng cục bộ, không phải lớp proxy

Làm cách nào để buộc webservice sử dụng bản sao cục bộ của lớp, chứ không phải bản sao proxy? Câu hỏi của tôi có ý nghĩa gì trong ngữ cảnh này không? Nếu không, tôi sẽ làm rõ nó.

Lưu ý - Tôi đã sử dụng để chuyển tất cả các tham số ByRef và sử dụng các giá trị trả về đó để điền một bản sao của đối tượng mà tôi tạo khi trả lại. Đó không phải là cách tốt nhất để làm điều này!

+0

[Tôi đã hỏi câu hỏi này trước đây.] (Http://stackoverflow.com/questions/127395/net-soap-common-types) –

Trả lời

3

Nếu bạn đang sử dụng svcutil.exe để tạo proxy máy khách WCF, bạn có thể sử dụng/tham chiếu trên lệnh- để chỉ định assembly có chứa class chung. Svcutil nên sử dụng lại định nghĩa lớp đó thay vì tạo ra một định nghĩa mới trong không gian tên proxy dịch vụ.

Ngoài ra, điều này sẽ chỉ hoạt động nếu lớp phổ biến của bạn có thể tuần tự và được chuyển theo giá trị (nghĩa là nó được xem là hợp đồng dữ liệu chứ không phải là hợp đồng dịch vụ).

+0

Điều này khác với việc thêm tham chiếu thông qua chính dự án? Tôi đã có lớp chung của tôi được liệt kê trong phần "Tham khảo". Tôi cho rằng tôi sẽ thử điều này - tuyệt vời nếu nó hoạt động, và chỉ cho bạn! – SqlRyan

0

Tôi không chắc chắn nhưng khi bạn biên dịch một dịch vụ web .NET nó sẽ tạo một tệp DLL mà bạn có thể thử sử dụng cho địa phương. Nhưng khi tôi xây dựng các ứng dụng hướng dịch vụ, tôi tạo các lớp khác nhau trong giải pháp của tôi cho ví dụ: Lớp truy cập dữ liệu, Lớp logic, Lớp dịch vụ, Lớp giao diện người dùng, Lớp điều khiển và ví dụ trong Lớp điều khiển, tôi sẽ thực hiện phương pháp xác thực người dùng kết nối với lớp truy cập dữ liệu và lớp logic và sau đó tôi sẽ gọi phương thức đó trên lớp dịch vụ và tôi cũng có thể gọi nó trên lớp giao diện người dùng và nếu tôi gọi nó từ bên trong lớp giao diện người dùng được gọi là cục bộ, khi tôi muốn sử dụng nó từ lớp dịch vụ, tôi sẽ tạo phương thức web bằng cách sử dụng phương thức đó sẽ trả lại bool hoặc tên người dùng, v.v.

2

Nếu bạn đang sử dụng WCF là khá dễ dàng để sử dụng cùng một hợp đồng dữ liệu và giao diện dịch vụ giữa khách hàng và người tiêu dùng. Bạn có thể biên dịch trong lớp proxy đã tạo và sửa đổi nó để sử dụng đúng không gian tên hoặc sử dụng lớp ChannelFactory để tạo proxy động cho bạn.

Giải pháp đầu tiên rất dễ vỡ và sẽ khiến bạn sửa đổi lớp proxy mỗi khi giao diện dịch vụ thay đổi. Kỹ thuật thứ hai hoạt động khá tốt và chúng tôi đã sử dụng trong một dự án trước đây mà tôi đã thực hiện. Với một trong các phương pháp này, bạn cần đảm bảo rằng tất cả người gọi của bạn tiếp tục được cập nhật với phiên bản giao diện mới nhất.

Từ cách bạn mô tả sự cố, có vẻ như bạn muốn dịch vụ và ứng dụng khách chia sẻ cùng một phiên bản. Kể từ WCF serializes và deserializes các loại của bạn khi bạn gửi chúng đến và đi từ các dịch vụ bạn sẽ phải làm một cái gì đó thông minh hơn một chút. Đây có phải là ý của bạn không?

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