2016-11-30 16 views
1

私の意図が何であるかをまず説明してから、私の質問に行きましょう。オブジェクトタイプからSOAPリクエストを作成するにはどうすればよいですか?

実行時にSOAPリクエストが多少不明なSOAPサービスと通信するシステムを構築しようとしています。最終的には、未知のオブジェクトからSOAPリクエストを生成する必要があります。適切な属性とプロパティを持つオブジェクトを最初から動的に作成し、それを私のサービスの "request"メソッドに渡してSOAPサービスに送信します。ここで私が作業していたコードと私が受け取っているエラーがあります。

SOAPクライアント:

/// <summary> 
/// GOSService proxy class 
/// </summary> 
[DebuggerStepThroughAttribute()] 
[DesignerCategoryAttribute("code")] 
[WebServiceBindingAttribute(Name = "ServiceSoapBinding", Namespace = "service.domain.com", ConformsTo = WsiProfiles.None)] 
[SoapRpcService(RoutingStyle = SoapServiceRoutingStyle.RequestElement)] 
public partial class TestService : SoapHttpClientProtocol 
{ 
    /// <summary> 
    /// Initializes a new instance of the TestService class. 
    /// </summary> 
    public TestService() 
    { 
     this.Url = "https://restsv01.domain.com/ServiceTest/services/TestService"; 
     ServicePointManager.Expect100Continue = true; 
     ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 
     ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback); 
    } 

    /// <summary> 
    /// Verifies the remote Secure Sockets Layer (SSL) certificate used for authentication. 
    /// </summary> 
    /// <param name="sender">An object that contains state information for this validation.</param> 
    /// <param name="certificate">The certificate used to authenticate the remote party.</param> 
    /// <param name="chain">The chain of certificate authorities associated with the remote certificate.</param> 
    /// <param name="sslPolicyErrors">One or more errors associated with the remote certificate.</param> 
    /// <returns>A Boolean value that determines whether the specified certificate is accepted for authentication.</returns> 
    private bool OnRemoteCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { 
     return true; 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="order"></param> 
    /// <returns></returns> 
    [SoapRpcMethodAttribute("", RequestNamespace = "service.domain.com", ResponseNamespace = "service.domain.com")] 
    [SampleSoap.LoggerSoapExtensionAttribute] 
    [return: SoapElementAttribute("requestReturn")] 
    public object request(object parm) 
    { 
     object[] results = this.Invoke("request", new object[] { parm }); 
     return ((object)(results[0])); 
    }} 

テストモデル: (彼らは動的に生成され、任意の事前定義されたモデルがされませんが、テスト目的のために、私がテストするには、このモデルを使用しています。 )

[SerializableAttribute()] 
    [DebuggerStepThroughAttribute()] 
    [DesignerCategoryAttribute("code")] 
    [SoapTypeAttribute(Namespace = "http://entity.domain.com")] 
    public class ParentNode 
    { 
     private string nameField = "1"; 
     [SoapElementAttribute(IsNullable = true)] 
     public string Name 
     { 
      get { return this.nameField; } 
      set { this.nameField = value; } 
     } 
    } 

テスト通話コード:

 Services.Soap.Models.ParentNode parent = new Services.Soap.Models.ParentNode(); 
     parent.Name = "John Doe"; 
     Services.Soap.TestService service = new Services.Soap.TestService(); 
     object resp = service.request(parent); 

私はこのコードを実行し、 n個のエラーがこの行で発生します。

object[] results = this.Invoke("request", new object[] { parm }); 

これはエラーです:

The type Services.Soap.Models+ParentNode was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

私は強いタイプにサービス「リクエスト」メソッドのパラメータを変更した場合、要求は罰金構築し、 SOAPサービスに渡されます。

public object request(ParentNode parm) 

私は、リクエストメソッドにパラメータとして型を渡すと、渡しするオブジェクトの「動的」インスタンスを作成するなど、この作業を取得するために、おそらく50の事を試してみました。

public object request(object parm, Type t) 
    { 
     dynamic converted = Convert.ChangeType(parm, t); 

     object[] results = this.Invoke("request", new object[] { converted }); 
     return ((object)(results[0])); 
    } 

「変換済み」は依然としてオブジェクト型とみなされたため、これは機能しませんでした。

"GetWriterForMessage"メソッドでソープエンベロープをインターセプトして自分のエンベロープを作成できるようにしましたが、それを利用できませんでした。

私の質問は、オブジェクトのパラメータ型を使ってSOAPリクエストを正常に構築するにはどうすればいいですか?私のアーキテクチャを正しく動作させるために取るべき別のアプローチがありますか?

+0

コメントを回答に移動するだけです。下記参照。 – Namphibian

答えて

0

あなたが実装しているシステムについてのあなたの説明は、私には明らかではありません。 「動的」リクエストをSOAPサーバーに送信すると記載されていますか?または、「動的」操作でサービスを作成していますか?それらの細部は私のために少し泥だが、私はいくつかの考えを書きました。

SOAPでこれを行うには、要するに自分自身で苦痛の世界を開いています。 WSDLを持たないため、RESTが適しているかもしれませんが、WADL、RAML、およびこれら新興の標準を使用している場合、あなたの人件費は変化する可能性があります。私はあなたに技術的な質問に答えようとするつもりはありませんが、なぜこれがメンテナンス地獄への片道チケットなのかを見てみましょう。

この実装では、SOAの概念(特に標準化されたサービス契約)が実際には分かりません。不明なコンテンツを含む動的なWSDLを実装するだけで、アーキテクチャはSOAとみなされません。これはまた、WSDLを持っている点全体に矛盾しています。WSDLはXMLのインタフェース定義です。したがって、動的サービスは動的インターフェースを必要とし、動的インターフェースはそれをインターフェースではないものとして認定する。したがって、オブジェクト型をパラメータとして使用すると、WSDLとインタフェースは一致しません。

他のシステムがSOAPサービスを使用する場合、公開されたWSDLに基づいて処理します。 WSDLが変更された場合、プログラムは定義として破棄されるか、WSDLが生成したデータ型と一致しません。 HTTPで動作し、要求を取得して応答を送信し、WSDLを持たないサービスはSOAPサービスではなく、HTTPポートを使用するXMLベースのサービスです。彼らは根本的に異なっています。サービスプロバイダ、つまりSOAPサービスにデータを要求している人はWSDLを持っていませんか?そうでない場合は、あなたが探しているドロイドではありません:)

インターフェイスは、アプリケーションがサービスを照会するために使用できる契約書です。本質的には、構造化データオブジェクトと非構造化データオブジェクトの対話です(実行時には少なくとも)。

このタイプのパターンを使用するには、パブリッシュ・サブスクライブ・アーキテクチャーを、使用する軽量のMQTTのようなものか、トピックを含むJMSのようなものにする必要があります。

あなたが言及しているWebサービスを使用している場合は、.Netアプリケーションがデータ型と関連するC#クラスを生成するために使用できるWSDLになります。クラスには、送信されるデータとサービスで公開される操作の両方が含まれます。

公式のSOAPの世界では、動的なサービスのようなものはありません。これは、サーバーとクライアントが操作中にこの形式のXMLを介して通信することに同意するという全体のパラダイムを破るためです。

+0

あなたのコメントとここで提供した情報を感謝します。私は、SOAPサーバーとクライアントの間の動的関係は契約に準拠している必要があり、実装する必要があることを理解しています。実装しようとしている設計を遵守していません。終わりには、管理者がさまざまなサードパーティエンティティと通信するために必要な契約プロパティを「セットアップ」するためのフロントエンドインターフェイスを提供することが私の目的です。私は、フロントエンド・インターフェースを介してサービス契約を管理する機能を探しています。そのため、開発者が契約を変更してコンパイルする時間を必要としません。 – Samurai2083

+0

当社の顧客は、第三者サービスと通信するために当社が提供するポータルを必要としています。私たちのポータルに記入されたフォームはSOAP経由でこれらのサードパーティのサービスに送られます。この考えは、我々のポータルが他のサービスの誰かまたは何かに関係なく、管理サイドが契約ルールを正しく確立するサービスプロファイルを適切に構築すると信じています。その後、フォームが提出されると、バックエンドはフォームデータで満たされた必要なモデルを使用して契約を作成し、サービスに提出します。そういうわけで、「物体」が必要です。何も厳密にタイプされていません。 – Samurai2083

+0

ESBサーバーが必要です。動的な思考を忘れてしまった。 ESBとエンタープライズ統合パターンを研究してください。この問題は解決されており、達成しようとしていることを行うオープンソースと商用製品があります。私のインフルエンザが治まると、詳細で私の答えを編集します。私は子供を愛し、憎む... – Namphibian

関連する問題