0

私の職場では、時間と出席の​​設定をアップグレードしているところです。現在、従業員がチェックインとチェックアウトに使用する物理端末があります。これらの端末は、Webサービス呼び出しを介してサードパーティのT&Aシステムと通信します。

T&A Webサービスについて:

  • IIS6でホスト
  • 通信はHTTPを介したWCFとの通信です
  • 公開されているメソッドの1つだけに関心があります( Beep()と呼びましょう)

私は何をする必要がありますか:

  • 元のT&Aシステムはそのままにしておきます
  • Beep()の呼び出しに反応するカスタムサービスを作成します

したがって、基本的に、 Beep()のすべての呼び出しに便乗する必要がありますが、最善のアプローチが何であるかはわかりません。

すでに考慮されていること:

  1. T&Aサービスとまったく同じコントラクトを実装するカスタムWebサービスを作成し、すべての端末をそのカスタムサービスに転送します。その後、カスタムサービスから元のT&Aサービスを呼び出したり、必要な他のロジックを適用したりできるという考えです。
    • これは私には過度に侵襲的であり、不必要に危険であるように思われます。元のシステムはできるだけ変更しないでおきます。
  2. 元のT&Aサービスへの呼び出しをインターセプトするカスタムHTTPハンドラーを作成します。
    • 実際にはすでにこのようなことを社内で行っていますが、実装では元のHttpRequestを取得し、コンテンツを抽出してカスタムサービスを呼び出し、最後に元のリクエストに基づいて新しいHttpRequestを作成し、元のWebサービスがBeep( )が作られています。
    • このアプローチについて私が気に入らないのは、元のHttpRequestが失われることです。はい、2番目の、おそらく同一のリクエストが作成されますが、これが安全であることを保証するためのHttpRequestsについては十分にわかりません。

私はオプション2を好みますが、それでも完璧ではありません。理想的には、元のHttpRequestを破棄する必要はありません。これが可能かどうか誰かが知っていますか?

そうでない場合、誰かがこれを行う別の方法を提案できますか?IISは、2つの宛先に要求をフォークするように構成できますか?

ありがとう

更新#1

私は解決策を見つけました(ここに文書化されています)が、私はまだ他のオプションを開いています。

更新#2

私はflupの解決策(そして正当化)が好きです。彼は賞金を受け取ります:)ありがとうflup!

4

4 に答える 4

1

カスタム操作の呼び出し元であるIOperationInvoker.

WCF は元の HTTP 要求をいつものように逆シリアル化しますがBeep()、既存の Web サービス クラスを呼び出す代わりに、呼び出し側を呼び出します。インボーカーは特別なことをBeep()行い、元のサービスを呼び出します。

を実装するよりも利点はIHTTPModule、すべての HTTP が変更されずに元の Web サービスの構成によって引き続き処理されることです。メソッドで、より高いレベルの抽象化、つまり Web サービスのインターフェイスで分岐しますBeep()

既存のサービス クラスを変更せずにカスタム オペレーション インボーカーをセットアップすることの核心(これは難しくなります):

  • そのメソッドでサービスのメソッドにカスタムIOperationBehaviorを設定するカスタムを実装します。IOperationInvokerBeep()ApplyDispatchBehavior
  • IEndpointBehaviorメソッドにカスタムを設定するカスタムを実装しIOperationBehaviorますApplyDispatchBehavior
  • これら 2 つの動作を とともにIOperationInvokerクラス ライブラリに配置し、既存のサービスに追加します。
  • 次に、 を使用するようにサービスを構成しますIEndpointBehavior

カスタム IOperationInvoker を設定するタイミングと場所を参照してください。インボーカー ビットについてはhttp://blogs.msdn.com/b/carlosfigueira/archive/2011/05/17/wcf-extensibility-ioperationinvoker.aspxを参照してください。

カスタム エンドポイントを構成する方法については、「標準の webHttpEndpoint を使用したカスタム エンドポイントの動作」を参照してください。

于 2013-03-21T21:00:57.593 に答える
0

カスタムを使用して解決策を見つけましたIHttpModule。以下のサンプルを参照してください。

using System;
using System.Text;
using System.Web;

namespace ForkHandles
{
    public class ForkHandler : IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.BeginRequest += new EventHandler(application_BeginRequest);
        }

        void application_BeginRequest(object sender, EventArgs e)
        {
            var request = ((HttpApplication)sender).Request;

            var bytes = new byte[request.InputStream.Length];
            request.InputStream.Read(bytes, 0, bytes.Length);
            request.InputStream.Position = 0;

            var requestContent = Encoding.ASCII.GetString(bytes);

            //  vvv
            // Apply my custom logic here, using the requestContent as input.
            //  ^^^
        }

        public void Dispose()
        {
        }
    }
}

これにより、Web サービス リクエストの内容を検査し、それに応じて対応することができます。

これは、展開されたサードパーティの Web サービスの構成を変更する必要があるため、侵襲性の低い他のソリューションを受け入れます。

于 2013-03-18T14:05:13.957 に答える
0

実際には、システムを ESB パターンに統合したいようです。現在、ESB の問題に対する MS のソリューションは Biztalk です。この場合、Biztalk は熱核弾頭ナット クラッカーです。Biztalk は必要ありません。

軽量の代替品については、こちらの結果をご覧ください

于 2013-03-18T07:47:29.060 に答える