ASMX 生成的测试表单对于测试操作非常方便。但是,没有明显的方法来包含 SOAP 标头。
如何在不编写客户端使用该服务的情况下测试您的标头?
如果您关心互操作,请不要使用 .net 客户端应用程序来测试 .net Web 服务。使用像 SOAPUI 这样的适当工具来测试您的 Web 服务。www.soapui.org
该工具是用 Java 编写的,但它是免费的,并且非常方便用于测试任何类型的 Web 服务。
如果我了解您要执行的操作,则可以使用 asmx 提供的 SOAP 执行 HTTP 请求。如果您在浏览器中打开 asmx,您将获得 Web 服务中可用的方法列表。单击您要测试的方法,您将获得一个可以使用的 SOAP 请求,只需填写您要测试的值即可。下面是可用于测试 SOAP 的代码。
// Set SOAP Message
string msg = "<?xml version='1.0' encoding='UTF-8'?><soap:Envelope>";
...
...
// Make http request
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://linktoyour/service.asmx");
req.Headers.Add("SOAPAction", "http://linktoyour/NameOfFuntion");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(msg);
req.ContentLength = bytes.Length;
System.IO.Stream st = req.GetRequestStream();
st.Write(bytes,0,bytes.Length);
st.Close();
// Read response
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
System.IO.Stream st1 = res.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(st1, System.Text.Encoding.UTF8);
string txt = sr.ReadToEnd();
// Display response
Response.Write(txt);
您询问
如何在不编写客户端使用该服务的情况下测试您的标头?
答案是您应该对客户端进行编程以使用该服务。
将编写代码以使用您的服务的开发人员将被迫编写一个客户端,该客户端使用您设计不良、难以使用的服务,并带有奇怪的标头。最好在 {badly-designed, hard-to-use, 奇怪} 之前找到它们。
这样,您可以将服务重新设计为{精心设计、易于使用、正常}。
顺便说一句,为您的 Web 服务编写单元测试是一个很好的方法。这样,您就拥有了小型、简单的客户。
不要直接访问标头,而是提供代码访问的抽象。例如,如果您有一个名为“Customer”的标头,您可以提供一个可以访问的上下文类,如下所示:
字符串客户 = MyContext.Current.Customer;
现在,您所要做的就是在您的测试类中交换一个不需要所有管道的模拟实现。
但是请注意,在 Web 服务器之外测试 ASMX 并不完全理想,因为它可能会遗漏诸如序列化之类的事情。如果您可以部署到测试服务器并测试部署的副本,那您会更好。如果您真的关心测试,WCF 是一个更好的选择,因为您可以在测试中轻松地自托管 WCF。