测试Web服务是否缺少.NET中的必填字段

时间:2009-05-12 15:18:17

标签: c# .net web-services unit-testing

我目前的部分工作涉及使用外部Web服务,我已经为其生成了客户端代理代码(使用WSDL.exe工具)。

我需要测试Web服务是否正确处理缺少必填字段。例如,Surname和Forename是必需的 - 如果它们不在调用中,则应返回SOAP错误块。

您可能已经猜到,在使用自动生成的代理代码时,我无法从Web服务调用中排除任何必填字段,因为对模式进行了编译时检查。

我所做的是使用HttpWebRequest和HttpWebResponse向Web服务发送/接收手动格式化的SOAP信封。这可行,但由于服务返回500 HTTP状态代码,因此在客户端上引发异常,并且响应(包含我需要的SOAP错误块)为null。基本上我需要返回流来获取错误数据,以便我可以完成单元测试。我知道正在返回正确的数据,因为我可以在我的Fiddler跟踪中看到它,但我无法在我的代码中看到它。

这就是我正在为手动调用做的事情,更改名称以保护无辜者:

private INVALID_POST = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
    "<soap:Envelope ...rest of SOAP envelope contents...";

private void DoInvalidRequestTest()
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://myserviceurl.svc");
    request.Method = "POST";
    request.Headers.Add("SOAPAction",
        "\"https://myserviceurl.svc/CreateTestThing\"");
    request.ContentType = "text/xml; charset=utf-8";
    request.ContentLength = INVALID_POST.Length;
    request.KeepAlive = true;

    using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
    {
        writer.Write(invalidPost);
    }

    try
    {
        // The following line will raise an exception because of the 500 code returned
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        if (response.StatusCode == HttpStatusCode.OK)
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                string reply = reader.ReadToEnd();
            }
        }
    }
    catch (Exception ex)
    {
        ... My exception handling code ...
    }
}

请注意,我没有使用WCF,只使用WSE 3。

1 个答案:

答案 0 :(得分:1)

如何编写自己的SoapHttpClientProtocol并使用SoapExtensions?

    [WebServiceBinding()]
    public class WebService
    : System.Web.Services.Protocols.SoapHttpClientProtocol
    {
        [SoapTrace]
        public object[] MethodTest(string param1, string param2)
        {
            object[] result = this.Invoke("MethodTest", new object[] { param1, param2 });
            return (object[])result[0];
        }
    }