10

C#に組み込まれたカスタムHTTPサーバーがあり、RESTサービスの要求を受け入れ、XMLまたはJSONで応答します(クライアントのニーズに応じて)。RESTサービスは、実行時にデータベースベースの構成から定義され、入力パラメーターと出力タイプが大きく異なり、本番環境で美しく機能します。

ただし、適切なWSDLを使用して、同じサービスにSOAPアクセスを追加したいと思います。利用可能なサービスはハードコーディングされていないため、これは次のことを意味します。

  • データベースのメソッド定義から実行時に生成されたWSDLを公開する
  • 着信SOAPリクエストを解析し、それらをそれらの定義にマッピングし、リクエストを処理する前に、リクエストがメソッドシグネチャに準拠していることを確認します
  • 応答が処理されたら、結果を返すためにWDSLを満たすSOAP応答を作成します

Visual Studioを使用して設計時にWebサービス(およびWSDL)を生成し、WebMethods、ASP.NET MVCなどを使用してコンテンツを公開するMSドキュメント(およびGoogle)ドキュメント。メソッドがないため、これは私が探しているものではありません。設計時にバインディングを生成するための定義。

誰かがアイデア(たとえば、生のSOAP解析用のツールキット)や、動的に作成されたメソッドシグネチャからのWSDLの生成などについて考えていますか?そうでない場合、そのようなものを構築するためにどのように取り組むことができるかについて何か考えはありますか?可能であれば、車輪の再発明を避けたいと思っています。

PS:Visual Studioがあなたに代わってそれを行うので、明らかに.NET Frameworkには標準化されたものがあります-実行時に、より低いレベルでそれにアクセスする方法について何かアイデアはありますか?

4

3 に答える 3

6

wsdlを動的に作成するには、次を使用できます。ServiceDescriptionReflector

例:クラスの場合

public class TestWebService
{
    [WebMethod]
    public string Hello(string namex)
    {
        return "Hello " + namex;
    }
}

このコードを使用できます

StringWriter wr = new StringWriter();
var r = new System.Web.Services.Description.ServiceDescriptionReflector();
r.Reflect(typeof(TestWebService), "http://somewhere.com");
r.ServiceDescriptions[0].Write(wr);
var wsdl = wr.ToString();

しかし、あなたが言ったので

データベースのメソッド定義から実行時に生成されたWSDLを公開する

Type実行時に作成する必要があります

var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("MyAsm"), AssemblyBuilderAccess.Run);
var mod = asm.DefineDynamicModule("MyModule");

TypeBuilder typeBuilder = mod.DefineType("TestWebService");

MethodBuilder mb = typeBuilder.DefineMethod("Hello", MethodAttributes.Public, CallingConventions.Standard, typeof(string), new Type[] { typeof(string) });
var cab = new CustomAttributeBuilder( typeof(WebMethodAttribute).GetConstructor(new Type[]{}), new object[]{} );
mb.SetCustomAttribute(cab);
mb.DefineParameter(1, ParameterAttributes.In, "namex");
mb.GetILGenerator().Emit(OpCodes.Ret);

Type type = typeBuilder.CreateType();

typeこれで、wsdlの作成に使用できます

StringWriter wr = new StringWriter();
var r = new System.Web.Services.Description.ServiceDescriptionReflector();
r.Reflect(type, "http://somewhere.com");
r.ServiceDescriptions[0].Write(wr);
var wsdl = wr.ToString();

リクエストの読み取りとレスポンスの形成には、Linq2Xmlを使用できます。 Fiddlerは、クライアントとサーバー間で送信されるSOAP(xml)形式についてのアイデアを提供します。

于 2012-07-25T21:10:38.373 に答える
2

SOAPは、情報交換のための「単なる」XMLベースのプロトコルです。ゼロからのサポートを実装するのは面倒ですが、原則としてそれほど複雑ではないと思います。

公式のSOAP仕様はここにあります。

于 2012-07-18T20:26:00.693 に答える
2

本当に必要な場合を除いて、SOAPを解析しないでください。WCFに手間のかかる作業を任せ、定義からC#コードでサービスおよびデータコントラクトを生成し、実行時にコンパイルします。よく知られたインターフェースを介して「静的」コードにフックするサービス実装を生成します。

新しいサービスコントラクト/データコントラクトの正しいバインディングを使用してエンドポイントを動的に作成します。バインディングが動的に変更されない場合、これはapp.configで定義できます。それ以外の場合は、実行時にも設定します。

Mexエンドポイントを追加して、wsdlを公開します。

着信トラフィックを「調べる」には、MessageInspectorを使用します

ServiceHost-> Self Hosting WCFを使用して、HTTPサーバーでWCF/SOAPサービスをセルフホストします。

別のアプローチに関するいくつかのアイデア。

于 2012-07-23T09:56:25.183 に答える