Тестирование веб-службы на предмет отсутствия обязательных полей в .NET - PullRequest
1 голос
/ 12 мая 2009

Часть моей текущей работы связана с использованием внешнего веб-сервиса, для которого я сгенерировал код прокси-клиента (с помощью инструмента WSDL.exe).

Мне нужно проверить, правильно ли веб-сервис обрабатывает отсутствие обязательных полей. Например, Фамилия и Имя являются обязательными - если они отсутствуют в вызове, то должен быть возвращен блок ошибки SOAP.

Как вы уже догадались, я не могу исключить какие-либо обязательные поля из моего вызова веб-службы при использовании автоматически сгенерированного прокси-кода из-за проверки во время компиляции со схемой.

Вместо этого я использовал HttpWebRequest и HttpWebResponse для отправки / получения отформатированного вручную конверта SOAP в веб-службу. Это работает, но поскольку служба возвращает код состояния HTTP 500, на клиенте возникает исключение, и ответ (содержащий тот блок SOAP, который мне нужен) равен нулю. По сути, мне нужен обратный поток, чтобы получить данные об ошибках, чтобы я мог завершить свой модульный тест. Я знаю, что возвращаются правильные данные, потому что я вижу их в своей трассировке 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 Ответ

1 голос
/ 12 мая 2009

Как насчет написания собственного 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];
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...