2012-10-12 35 views
7

tôi có các thiết lập saugửi dữ liệu đến một trang web từ một dịch vụ WCF

  • Một trang web jQuery (trang không chính xác duy nhất, nhưng không xa nó), mà sử dụng một
  • Một ASP.NET MVC trang web như một backend, kết nối (thông qua net.tcp hoặc net.pipe) để
  • một dịch vụ WCF tự lưu trữ quản lý và kết nối với
  • một lượng lớn các dịch vụ bên ngoài cao độ trễ.

Vì vậy, khi khách hàng nhấn nút, yêu cầu sẽ được gửi đến MVC, sẽ chuyển nó đến WCF, tổng hợp nó từ các dịch vụ bên ngoài và mọi thứ đều ổn và dandy.

Vấn đề tôi không thể che giấu xung quanh là giao tiếp theo cách khác, tức là khi một trong các dịch vụ bên ngoài ngoại tuyến, cách dễ nhất và thanh lịch nhất để thông báo cho khách hàng (trình duyệt) là gì?

Điều này có nghĩa là dịch vụ bằng cách nào đó sẽ thông báo cho trang web mvc bằng cách nào đó sẽ thông báo cho khách hàng rằng dịch vụ bên ngoài đang ngoại tuyến.

Ngoài ra: Dịch vụ bên ngoài sẽ có tính khả dụng cao, do đó, tình huống "ngoại tuyến" sẽ ít khi được sử dụng và theo đó tôi đang tìm giải pháp không thực hiện bỏ phiếu rộng rãi cho máy chủ.

+0

Làm thế nào để bạn xác định "ẩn"? Tạm thời không thể truy cập? Tắt để bảo trì bởi một quản trị viên tại dịch vụ bên ngoài? Đây có phải là nghiêm chỉnh để đối phó với cúp "kế hoạch" hoặc bạn đang tìm kiếm để gracefully xử lý bất kỳ không có khả năng liên lạc với các dịch vụ từ xa? –

+0

@RickLiddle "đi tối" có thể là một từ tốt hơn ở đây. Về cơ bản, khi dịch vụ bên ngoài (bên ngoài lệnh của tôi) không đáp ứng như nó cần. – SWeko

+0

Tôi khuyên bạn nên gợi ý SignalR do JcFx cung cấp [bên dưới] (http://stackoverflow.com/a/12863194/35241). –

Trả lời

4

Tôi đang làm việc trên một kiến ​​trúc tương tự và đang lập kế hoạch sử dụng SignalR để đẩy cập nhật từ WCF, (đôi khi trực tiếp, đôi khi qua Azure Service Bus), đến một ứng dụng jQuery. Tuy nhiên, tôi chưa thực hiện điều này, vì vậy có thể có một số vấn đề tôi chưa xem xét.

Từ tài liệu của họ:

Đẩy dữ liệu từ máy chủ cho khách hàng (không chỉ khách hàng duyệt) luôn luôn là một vấn đề khó khăn. SignalR làm cho nó chết dễ dàng và xử lý tất cả các nâng nặng cho bạn.

Scott Hansleman có một blog tốt về chủ đề ở đây: http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx

+0

Upvoted - giải pháp tuyệt vời cung cấp một câu trả lời khả thi cho vấn đề ở bàn tay VÀ bao gồm các nguồn tài nguyên tuyệt vời. Đây là, IMO, mô hình của những gì một câu trả lời trên StackOverflow nên được. –

1

Bạn có thể sử dụng fault exceptions để trả lại dữ liệu ngoại lệ cho khách hàng.

Tôi muốn có cờ IsSuccessful trên hợp đồng đã trả lại và chỉ ném ngoại lệ lỗi khi có lỗi nghiêm trọng.

Đây là ví dụ rất cơ bản về hợp đồng phản hồi có cờ IsSuccessful.

[DataContract] 
public class MyResponse 
{ 
    [DataMember] 
    public bool IsSuccessful { get { return Message == null || !Messages.Any(); } set { } } 
    [DataMember] 
    public List<string> Messages { get; set; } 
} 

Messages có thể là các loại phức tạp nếu bạn cần cung cấp thông tin chi tiết hơn. Các thuộc tính DataContractDataMember có thể là MessageContractMessageBodyMember nếu phù hợp với kiến ​​trúc của bạn tốt hơn.

+0

Json đơn giản không dễ dàng hơn nhiều? – lboshuizen

+0

Tôi có thể không nêu rõ câu hỏi, xin lỗi. Không có yêu cầu từ máy khách, máy chủ nên bắt đầu giao tiếp. – SWeko

0

Kịch bản điển hình với WCF và trình duyệt là mẫu yêu cầu/phản hồi. Trình duyệt đưa ra yêu cầu và dịch vụ phản hồi.

Bạn có thể yêu cầu trình duyệt định kỳ thăm dò ý kiến ​​dịch vụ đang tìm kiếm trạng thái.

+0

Dịch vụ bên ngoài sẽ có tính khả dụng cao, vì vậy kịch bản "ngoại tuyến" sẽ ít khi được sử dụng và theo đó tôi đang tìm một giải pháp không thực hiện việc bỏ phiếu rộng rãi của máy chủ. – SWeko

+0

Trong trường hợp đó, chỉ cần trả về lỗi khi dịch vụ bên ngoài ngoại tuyến và trình duyệt đưa ra yêu cầu yêu cầu. –

+0

Tôi đã làm điều đó, nhưng bây giờ tôi cần phải thông báo một cách chủ động :) – SWeko

1

Nghe có vẻ như tôi, bạn sẽ cần phải triển khai một số loại trong dịch vụ bỏ phiếu để ping các dịch vụ bên ngoài này cho tính khả dụng của chúng.

+0

Điều đó đã được thực hiện trên cấp dịch vụ WCF, và theo yêu cầu có sẵn cho khách hàng. Vấn đề là bây giờ tôi cần phải gửi nó cho khách hàng theo cách hướng sự kiện. – SWeko

+0

Khách hàng là gì? Đây có phải là dựa trên web không? – mojo722

+0

Có, tôi đã mô tả như vậy trong câu hỏi. – SWeko

0

Trong Discovery Namespace có chức năng cho phép dịch vụ WCF gửi thư khám phá. Nếu bạn có kế hoạch ngừng hoạt động, AnnouncementClient class có các phương thức để dịch vụ xuất bản thông báo về việc chuyển sang ngoại tuyến/trực tuyến.

Để đặt thông báo tùy chỉnh cho người dùng của bạn, bạn cần phải lắng nghe những thông báo Thông báo này. Lớp thực hiện điều này là AnnouncementService. Nó có các sự kiện để xử lý các thông báo OfflineOnline.

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