@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をテストできます。もちろん、私が回答に追加した基本的なクライアントを使用することもできます。