2009-05-22 30 views
14

Tôi hoàn toàn mới đối với WCF. Tôi đã khá chắc chắn nó sẽ hoạt động giống như các dịch vụ web thông thường - và tôi cũng khá chắc chắn rằng tôi đã làm điều đó sai quá, nhưng bây giờ tôi muốn chắc chắn rằng tôi đang làm điều đó đúng.Sử dụng WCF trong một Ứng dụng ASP.Net và Thực tiễn Tốt nhất

Ứng dụng ASP.Net của chúng tôi kết nối với dịch vụ WCF trên internet. Tôi đã bảo mật cơ bản được impletemented và sử dụng SSL. Nó hoạt động nhưng chậm hơn so với khi chúng tôi có các dịch vụ web thông thường. Dữ liệu được trả về cơ bản giống như với dịch vụ web thông thường.

Khi tôi đang sử dụng dịch vụ web thông thường, bất cứ khi nào tôi cần để nhận dữ liệu, tôi sẽ tạo đối tượng dịch vụ mới và gọi hàm cho dữ liệu tôi cần. Điều này dường như làm việc ok, nhưng như tôi sẽ tưởng tượng, không phải là cách tốt nhất để làm điều đó đặc biệt là nếu có hàng ngàn người dùng kết nối cùng một lúc. Vì vậy, khi tôi chuyển đổi sang WCF, tôi quyết định giữ một khách hàng mở và chỉ sử dụng cho mọi người kết nối với trang web. Tôi đặt nó vào bộ nhớ cache và khi bộ nhớ cache sẽ đổ đối tượng, tôi đã có một hàm gọi lại để xử lý nó.

Bây giờ tôi thậm chí không nghĩ về nó cho đến sau khi tôi thay đổi tất cả điều này mà nó có thể đặt ra một vấn đề cho nhiều người kết nối. Nếu người A yêu cầu dữ liệu, người B phải chờ đợi để hoàn thành trước khi dữ liệu của họ được tìm nạp thông qua dịch vụ.

Vì vậy, tôi đã thay đổi nó thành phiên dựa. Tôi hoặc thực hiện điều này sai hoặc nó chỉ backfired vì nó đã không làm việc tốt cả. Khách hàng sẽ hết thời gian, gây ra lỗi hoặc chỉ đơn giản là không hoạt động. Tôi đã thay đổi nó trở lại để được lưu trữ cho bây giờ và nó có vẻ là làm việc tốt (trừ chậm).

"Phương pháp hay nhất" cho trường hợp này là gì? Tôi có phải tạo ứng dụng khách khi đang cần thiết, tạo một phiên dựa trên (và tìm ra những gì tôi đã làm sai) hoặc giữ nguyên nó và sử dụng phương thức lưu trong bộ nhớ cache của một ứng dụng khách không?

+0

+1. Câu hỏi hay. – AnthonyWJones

Trả lời

6

Loại sự cố này thường được giải quyết bằng cách duy trì một hồ bơi. Thay vì chỉ có một đối tượng dịch vụ trong một cực và một cho mỗi người dùng ở thái cực khác, hồ bơi sẽ tổ chức một bộ sưu tập các đối tượng dịch vụ cần thiết để hỗ trợ nhu cầu hiện tại cho các dịch vụ của họ. Do đó các hồ bơi nên phát triển chỉ đến một điểm của nhu cầu tối đa.

Bạn phải đảm bảo rằng các đối tượng bị loại ra khỏi hồ bơi trước khi hết thời gian chờ khác từ bên trong đối tượng dịch vụ và cũng đảm bảo chúng bị loại bỏ nếu có bất kỳ loại ngoại lệ nào. Bằng cách này, bạn không có nhiều yêu cầu của khách hàng đang chờ truy cập vào một đối tượng duy nhất hoặc bạn không có đối tượng nhàn rỗi trong một dịch vụ và có khả năng sẽ chết vì tuổi già trước khi chúng có thể được sử dụng lại một lần nữa. Tuy nhiên, bạn có thể sử dụng lại.

+1

Không bao giờ nghĩ đến việc tạo một nhóm khách hàng. Điều này có thể là tốt nhất của cả hai thế giới. Không tạo ra một tấn vật thể trên bay và cũng không làm chậm khi có nhiều hoạt động. Ý tưởng tuyệt vời! – TheCodeMonk

+0

Tôi thích kỹ thuật được đề cập, bất kỳ cách nào bạn có thể chỉ ra một số việc thực hiện điều này để tôi có thể chơi xung quanh? –

+0

Như đáng sợ vì điều này sẽ phát ra âm thanh, tôi đã có trang điểm thực hiện tốt điều này. Tôi sẽ thử nghiệm nó và nếu nó hoạt động như tôi mong đợi, tôi sẽ viết một bài đăng blog về điều này và ghi lại những gì tôi đã làm. – TheCodeMonk

1

Tôi thường tạo một khách hàng khi đang di chuyển như bạn đã đề cập, nhưng đảm bảo bạn vứt bỏ điều này sau khi yêu cầu hoàn tất. Tôi đã làm điều này w/ra nhiều của một vấn đề nhưng phải trung thực tôi không có 1000 + người dùng nhấn cùng một dịch vụ chính xác cùng một lúc.

Bạn có thể tìm thấy chi tiết triển khai chính xác trong this bài đăng trên blog nếu bạn quan tâm.

Chỉ cần làm rõ điều bạn đã đề cập trong câu hỏi - khi bạn nói "dịch vụ web thông thường", bạn có đang nói về ASMX hay không?

+0

Yea, ASMX. Việc xử lý là điều tôi lo lắng nhất. Tôi nghĩ rằng tôi cần phải làm một số refactoring để làm sạch toàn bộ điều này lên. – TheCodeMonk

4

Thực tiễn chung tốt nhất cho các dịch vụ WCF sẽ là có mỗi cuộc gọi, mô hình đơn lẻ bất cứ khi nào có thể. Điều này mang lại cho bạn thông lượng tốt nhất, hành vi tốt nhất và đơn giản nhất trong cá thể dịch vụ. Vì vậy, bất cứ khi nào có thể, và trừ khi bạn có một lý do thực sự hấp dẫn, hãy sử dụng mô hình này.

Dường như trong trường hợp của bạn, việc tạo cá thể dịch vụ là một hoạt động khá tốn kém. Có lẽ bạn cần phải làm sạch nó bằng cách nào đó - làm cho cá thể dịch vụ thực tế rất gọn gàng và nhẹ để nó có thể được tạo và xử lý trong nháy mắt (hoặc ít hơn), và sau đó có một số quy trình công nhân nền (hoặc có thể là một hồ bơi) của những người, như đề xuất của Anthony) mà sau đó bạn có thể gọi từ các trường hợp dịch vụ thực tế của bạn.

Marc

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