2016-08-05 4 views
0

を提供するREST APIの呼び出しを行います新しいWeb APIエンドポイント。は、私は、Webメソッドを傍受するために、この要件はで処理する必要のあるビジネスケースを識別するための要求を読んで、既存のレガシーの.asmx Webサービスで呼び出す必要がありHttpModuleをを使用してSOAP Webサービスの呼び出しをインターセプトし、応答

ASMXサービスと対話するクライアントは、おそらくサービス参照を追加しており、直接の呼び出しを行うための新しいのREST APIを認識してWebメソッドの呼び出しではなくを行い、いくつかのレガシーシステムです。したがって、変更を認識しておらず、いつものようにSOAP応答を消費する必要があります。

これまでのところ私は、カスタムHttpModuleをクラスを追加要求をインターセプトし、入力ストリームを読み、それからの応答を取得するためのAPI呼び出しを行うことができました。しかし、どのようにSOAP応答をクライアントに送り返し、ターゲットのWebメソッドに移動しないように要求を終了するのですか?ここで

は私のカスタムHttpModuleをクラスである: "認識できないメッセージバージョン" 私はエラーを取得する

public class CustomHttpModule : IHttpModule 
{ 
    public void Dispose() 
    { 
     throw new NotImplementedException(); 
    } 

    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += (new EventHandler(this.Application_BeginRequest)); 
    } 

    private void Application_BeginRequest(Object source, EventArgs e) 
    { 
     // Create HttpApplication and HttpContext objects to access 
     // request and response properties. 
     HttpApplication application = (HttpApplication)source; 
     HttpContext context = application.Context; 

     // Initialize soap request XML 
     XmlDocument xmlSoapRequest = new XmlDocument(); 

     // Move to begining of input stream and read 
     context.Request.InputStream.Position = 0; 

     StreamReader readStream = new StreamReader(context.Request.InputStream, Encoding.UTF8); 
     // Load into XML document 
     if (readStream.BaseStream != null && readStream.BaseStream.Length > 0) 
     { 
      //string streamString = readStream.ReadToEnd(); 
      xmlSoapRequest.Load(readStream); 
     } 

     context.Request.InputStream.Position = 0; 

    // Check if the request is for the web method to be intercepted 
     if (xmlSoapRequest.GetElementsByTagName("SomeWebMethodName").Count > 0) 
     { 

       string response = ""; 
       using (WebClient wc = new WebClient()) 
       { 
        string URI = "http://localhost:19875/api/home"; 

        wc.Headers[HttpRequestHeader.Accept] = "application/xml"; 
        wc.Headers[HttpRequestHeader.ContentType] = "application/xml"; 
        response = wc.UploadString(URI, xmlSoapRequest.InnerText);             
       } 

       context.Response.ContentType = "text/xml"; 
       context.Response.Write(response); 
       context.Response.End(); 

     } 
    } 
} 

今クライアントに。 は、私がどのように私はそれを作成することができ、応答がSOAP応答する必要があります推測していますか?また、全体の質問にはより良いアプローチがありますか? ありがとうございます。

答えて

0

私はこの作業を持っています。基本的に私は次のようにSOAPレスポンスボディ構造の出力を埋め込む必要がありましたので、

   var soapResponse = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\"?>") 
            .Append("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">") 
            .Append("<soap:Body>") 
            .Append("<WebMethodResponse xmlns=\"http://tempuri.org/\">") 
            .Append(String.Format("<WebMethodResult>{0}</WebMethodResult>",HttpUtility.HtmlEncode(webApiResponse))) 
            .Append("</WebMethodResponse>") 
            .Append("</soap:Body>") 
            .Append("</soap:Envelope>"); 

       context.Response.ContentType = "text/xml"; 
       context.Response.Write(soapResponse); 
       context.Response.End(); 

手動で上記のようなSOAPレスポンスを作成するには、私は、レスポンスのXML要求がWebメソッドによって提供されたときのようなものであるかを知る必要がありました直接。このために、我々は、送信メッセージの流れをインターセプトするSOAP拡張機能をプラグインし、 http://www.codeproject.com/Articles/445007/Intercept-a-raw-SOAP-message

に示すようにそれを読むことができます
関連する問題