4

WCF クライアントを作成せずに WCF サービスをテストしようとしています。hereに示されているのと同様のコード/問題があります。

SOAP ペイロードを完全に制御したいので、独自の Web 要求/応答を発行し、独自の XML をパラメーターとして任意のメソッドに置き換えられるようにしたいと考えています。また、応答オブジェクトや障害例外オブジェクトなどを作成せずに、SOAP XML をそのまま返すことも必要です。

参考までに、実行ボタンをクリックして応答を取得した時点でSoapUIが行っていることを正確に行いたいと思います。SoapUI は WCF クライアントを作成せず、リクエストを作成してメソッドを呼び出すのではなく、WCF サービスへの完全な SOAP 呼び出しを発行して結果を表示すると想定しているだけです。

コメントの質問への回答として、WCF クライアントを作成したくない理由は、サービスへのすべての変更から隔離され、参照を再構築したり、独自のコードを変更したり、個別に作成したりする必要がないためです。このプロセスはビルドのたびに自動的に開始され、対話なしで開始されるためです。

そのため、何十万ものテスト用 XML パラメーターを何百ものメソッドに渡し、それらが何であるかを気にする必要はありません。私たちは ASMX Web サービスで何年もそれを行ってきましたが、1 つのメソッド (上記のリンクと非常によく似ています) がすべての Web サービス/メソッド/テスト パラメーターを処理していました。

WCF に切り替えると、特に無効な XML ノードをテストするときに内部サーバー エラーが発生します。必要なノードが見つからない、重複した名前の作成メソッドでエラーが発生するなど (エラー状態)。同じようにWCFでこれを行う簡単な方法があるのは理にかなっていると思います。

SoapUIが送り返しているものを正確に知りたいのですが、それがどのように行われているかを知る必要があります。

4

2 に答える 2

4

@John Saunders のコメントは正しいです。ASMX でできることは何でも、WCF でもできるはずです。実際、適切な SOAP 要求を行う限り、Web サービスが使用するフレームワーク/テクノロジの種類は問題ではありません。

WCFは、サービス指向アプリケーションの構築を支援する単なるフレームワークです。この種の他のフレームワークと同様に、サービスを SOAP Web サービスとして公開するために必要なすべての配管機能を処理しながら、提供する実際のサービスに集中することができます。

SoapUI は、Web サービスをテストできる Java ツールです。WSDL をフィードすると、要求サンプルが動的に作成され、(私が間違っていなければ) Http Clientを使用して Web サービスに送信されます。

WCF Web サービスがあれば、特別なことは何も起こりません。次のような基本的なクライアントでも実行できるのは、依然として SOAP 通信です。

public class Program
{
    public static void Main(string[] args)
    {
        // OK, this is not a WCF web service, but that should not matter :D
        string endpoint = "http://www.html2xml.nl/Services/Calculator/Version1/Calculator.asmx";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint);
        request.ContentType = "text/xml"; // or application/soap+xml for SOAP 1.2
        request.Method = "POST";
        request.KeepAlive = false;

        //In case you have a proxy to resolve the server name also add these lines
        var proxyServer = new WebProxy("XX.XX.XX.XX", 1234);
        proxyServer.Credentials = CredentialCache.DefaultCredentials; // or username + password
        request.Proxy = proxyServer;

        // you can read these from files
        string payload = @"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:tem=""http://tempuri.org/"">
                               <soapenv:Header/>
                               <soapenv:Body>
                                  <tem:Add>
                                     <tem:a>1</tem:a>
                                     <tem:b>2</tem:b>
                                  </tem:Add>
                               </soapenv:Body>
                            </soapenv:Envelope>";

        byte[] byteArray = Encoding.UTF8.GetBytes(payload);
        request.ContentLength = byteArray.Length;

        Stream requestStream = request.GetRequestStream();
        requestStream.Write(byteArray, 0, byteArray.Length);
        requestStream.Close();

        HttpWebResponse response = null;
        try
        {
             response = (HttpWebResponse)request.GetResponse();
        }
        catch (WebException ex)
        {
             response = (HttpWebResponse)ex.Response;
        }

        Console.WriteLine(string.Format("HTTP/{0} {1} {2}\n", response.ProtocolVersion, (int)response.StatusCode, response.StatusDescription));

        // you can write this to files
        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);
        Console.WriteLine(reader.ReadToEnd());

        // cleanp
        reader.Close();
        requestStream.Close();
        responseStream.Close();
        response.Close();
    }
}

SOAP 応答が返されます。この場合は次のようになります。

HTTP/1.1 200 OK

<?xml version="1.0" encoding="utf-8"?>
<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">
    <soap:Body>
        <AddResponse xmlns="http://tempuri.org/">
            <AddResult>3</AddResult>
        </AddResponse>
    </soap:Body>
</soap:Envelope>

それを生成したのが ASMX であったか、WCF であったかは関係ありません。HTTP リクエストに対するレスポンスです。

代わりに、次のような無効なメッセージを送信した場合:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:Add>
         <tem:a>x</tem:a>
         <tem:b>y</tem:b>
      </tem:Add>
   </soapenv:Body>
</soapenv:Envelope>

次のような障害が返されます。

HTTP/1.1 500 Internal Server Error

<?xml version="1.0" encoding="utf-8"?>
<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">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Client</faultcode>
            <faultstring> ... exception stacktrace here ... </faultstring>
            <detail />
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

SoapUI を使用してテストを自動化したり、 Junit と統合したりできます。JMeter のようものを使用することもできます。JMeter は、Web サービス (SoapUI など) 用に特別に設計されていませんが、SOAPをテストできます。もちろん、私が回答に追加した基本的なクライアントを使用することもできます。

于 2012-05-19T14:20:02.547 に答える
0

これに対する答えは、おそらく私以外のすべての人にとって明白でした...しかし、ここにあります:(500)内部サーバーエラーが発生し、それをどうするかわかりませんでした。WebExceptionエラーをキャッチする必要があることは、おそらく誰にとっても明らかです。WebExceptionには、障害状態や完全な応答などを取得するために使用できる応答があります。例外をキャッチしていましたが、WebException専用ではありませんでした。誰かを混乱させた場合は申し訳ありませんが、エラー状態が発生したときにのみ問題が発生しました。それ以外の場合は、すべてのコードサンプル(元のサンプルも含む)が機能していました。

これを別の質問として投稿できると思いますが、これは典型的な動作ですか?重複するレコード/アイテムを作成しようとするような単純なエラー、無効な名前などの場合でも、WebExceptionがスローされますか?経験不足のため、内部サーバーエラーがなく、サービスの外部でWebExceptionをキャッチする必要がなく、成功応答と同じ方法でエラー応答が返されることを期待していました(本当に「ウェブ」例外)。

すべての回答をありがとう。

于 2012-05-21T20:01:05.720 に答える