web-dev-qa-db-ja.com

コードの代わりに構成を介してWebサービスエンドポイントを定義する

完全に構成可能なC#/。NETでWebサービスエンドポイントを作成することに興味があります。単純にするために、GET /クエリ/取得の要件がないと仮定します。ここから始める方法に関するガイダンスが必要です。

目標は、新しいオブジェクト用に構成できるコアソリューションを構築、テスト、および展開することです。これにより、オブジェクトが追加、削除、変更されるたびにソリューション全体を変更、構築、および展開する必要がなくなります。この構成は、動作する環境を考慮して、バージョン管理をサポートする必要があります。

次のような構成ファイルがあるとします。

{
  "V1": {
    "Person": [
      {
        "Name": "FirstName",
        "Required": true,
        "Type": "string",
        "MaxLength": 25
      },
      {
        "Name": "Lastname",
        "Required": true,
        "Type": "string",
        "MaxLength": 25
      },
      {
        "Name": "Title",
        "Required": false,
        "Type": "string",
        "MaxLength": 50
      }
    ]
  },
  "V2": {
    "Person": [
      {
        "Name": "FirstName",
        "Required": true,
        "Type": "string",
        "MaxLength": 25
      },
      {
        "Name": "Lastname",
        "Required": true,
        "Type": "string",
        "MaxLength": 25
      },
      {
        "Name": "Title",
        "Required": false,
        "Type": "string",
        "MaxLength": 50
      },
      {
        "Name": "DateOfBirth",
        "Required": false,
        "Type": "DateTime"
      }
    ]
  }
}

この構成では、呼び出し元がオブジェクトを送信し、タイプルールに対してオブジェクトを検証するためのエンドポイントを公開するアプリケーションが必要です。また、WSDLを公開する必要があります。

明確にするために、キーと値の属性の配列を取得して検証できる単純な単一の汎用エンドポイントを記述したくない-コントラクトを生成したい。

要するに、POCOを作成する必要がない一方で、契約Webサービスを利用しようとしています。これにより、送信者は開発作業のためにエンドポイントをより簡単に模擬できます。

好奇心が強い人のために、着信データはメッセージングバスに送信され、他のサービスによって処理されます。したがって、エンドポイントはタイプ/長さ/などの評価を行う必要がありますが、オブジェクトに新しいフィールドがあるというだけの理由で、POCOとコントローラー、およびエンタープライズ展開のすべてのテストと頭痛の種を作成/更新したくありません。

2
Nicknow

これを行う従来の方法は、XSDファイルでタイプを定義し、XSDファイルを参照するWSDLファイルでサービスコントラクトを定義することです。オーダーメイドのJSON形式でほとんど同じことを行っていますが、作業をしたい場合は問題ありませんが、多くのツールがありません。

あなたがすぐに発見する1つの問題は、構成またはマークアップからインターフェースを定義することはかなり簡単ですが、handleサービス呼び出しへのコードがまだ必要であるため、それほど遠くはありません。タグと値のペアを操作したくないと言ったので、コードを厳密に型指定する必要があります。つまり、一般化されたソリューションは不可能です。

強く型付けされたサービスメッセージから一般的な形式のc#データ構造に変換するコードを動的に生成するものを構築できると思います。それはあなたが避けていたタグ/値の種類のソリューションのようにひどく聞こえます。したがって、問題を実際に解決するのではなく、移動するだけです。ただし、パブリックインターフェイスからプライベートコードに移動します。

1
John Wu

完全に理解したかどうかはわかりませんが、WCF 4ルーティングを使用して契約の一般的なサービスを正常に実装し、実行、記録、および再生SOAPメッセージを送信します。同じようにしてくださいが、これらのリンクを試してください(リンクは回答として投稿されていないはずですが、記事が大きすぎて要約できない)

Microsoftの現在のドキュメント

ミケーレ・ブスタマンテも記事を書いた。これらが私が使用したものかどうかわかりません-私はオリジナルを見つけることができないようですが、これらはそれをカバーしているようです:

パート1

パート2

別の例

その鍵はこれ

namespace WcfRouterService
{
    [ServiceContract]
    public interface IRouter
    {
        [OperationContract(Action = "*", ReplyAction = "*")]
        Message Action(Message msg);
    }



public Message Action(Message msg)
        {
            try
            {                    
                return ProcessMessage(msg);
            }
            catch (Exception e)
            {
                System.Diagnostics.Trace.WriteLine(e.ToString());
                throw;
            }
        }
}

それが役立つかどうかわからないので、JSONを使用しませんでした。

0
LoztInSpace