7

私は次の設定をしています

  • jQuery Webサイト(正確には単一のページではありませんが、それほど遠くはありません)、
  • バックエンドとしてのASP.NETMVCWebサイト。これは、(net.tcpまたはnet.pipeを介して)に接続します。
  • 管理および接続する自己ホスト型WCFサービス
  • 多数の高遅延の外部サービス。

したがって、クライアントがボタンを押すと、リクエストがMVCに送信され、MVCはそれをWCFにルーティングし、WCFはそれを外部サービスから集約し、すべてが正常でダンディです。

私が頭を悩ませているように思えない問題は、他の方法でのコミュニケーションです。つまり、外部サービスの1つがオフラインになったときに、クライアント(ブラウザー)に通知する最も簡単でエレガントな方法は何ですか?

これは、サービスがMVCサイトに何らかの形で通知し、MVCサイトが外部サービスがオフラインであることをクライアントに通知する必要があることを意味します。

さらに、外部サービスの可用性が高いため、「オフラインになる」シナリオはほとんど使用されません。したがって、サーバーの大規模なポーリングを行わないソリューションを探しています。

4

5 に答える 5

4

私は同様のアーキテクチャに取り組んでおり、SignalRを使用して更新をWCFから(場合によっては直接、場合によってはAzure Service Bus経由で)単一ページのjQuery駆動型アプリにプッシュすることを計画しています。ただし、これはまだ実装していないので、考慮していない問題がある可能性があります。

彼らのドキュメントから:

サーバーからクライアント(ブラウザクライアントだけでなく)にデータをプッシュすることは、常に困難な問題でした。SignalRはそれを非常に簡単にし、あなたのためにすべての重労働を処理します。

Scott Hanslemanは、このトピックに関する優れたブログをここに持っています:http: //www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx

于 2012-10-12T16:17:50.557 に答える
1

障害例外を使用して、例外データをクライアントに返すことができます。

IsSuccessful返された契約にフラグを付け、重大なエラーが発生した場合にのみ障害例外をスローすることを好みます。

IsSuccessfulこれは、フラグ付きの応答コントラクトの非常に基本的な例です。

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

Messagesより詳細な情報を提供する必要がある場合は、複雑なタイプにすることができます。DataContractそしてDataMember属性はそうすることができMessageContractMessageBodyMemberそれがあなたのアーキテクチャにより適しているかどうか。

于 2012-10-12T15:05:16.917 に答える
1

これらの外部サービスの可用性をpingするには、ポーリングサービスに何らかのタイプを実装する必要があるように思われます。

于 2012-10-12T15:11:00.730 に答える
0

WCFとブラウザーを使用する一般的なシナリオは、要求/応答パターンです。ブラウザがリクエストを行い、サービスが応答します。

ブラウザに定期的にサービスをポーリングさせてステータスを探すことができます。

于 2012-10-12T15:07:50.987 に答える
0

検出名前空間には、WCFサービスが検出メッセージを送信できるようにする機能があります。計画的な停止がある場合、AnnouncementClientクラスには、サービスがオフライン/オンラインになることに関するメッセージを公開するためのメソッドがあります。

ユーザーにカスタムメッセージを設定するには、これらのアナウンスメッセージを聞く必要があります。これを実装するクラスは、AnnouncementServiceです。オフラインメッセージとオンラインメッセージを処理するためのイベントがあります。

于 2012-10-12T15:14:48.780 に答える