System.Web.Services.Protocols.SoapException: серверу не удалось обработать запрос. ---> System.ArgumentNullException - PullRequest
3 голосов
/ 19 февраля 2009

Я получаю сообщение об ошибке:

System.Web.Services.Protocols.SoapException: серверу не удалось обработать запрос. ---> System.ArgumentNullException

Когда я пытаюсь позвонить на мой веб-сервис, используя следующий код:

{
//Create an echoSync request - set the services.
ServiceNameType sourceService = new ServiceNameType {Service = "echoSync", OnBehalfOf = "Source"};
ServiceNameType destService = new ServiceNameType {Service = "echoSync", OnBehalfOf = "Destination"};

//Create the request.
SDD2RequestType request = new SDD2RequestType
                  {
                      AppId = "echoSync",
                      SourceService = sourceService,
                      DestService = destService,
                      RequestId = "1",
                      RequestBody = "Ping"
                  };

//Create the originator.
originator originator = new originator {id = "123456789"};

//Create the transport.
SDD2Transport transport = new SDD2Transport {originatorValue = originator};

//Send the request.
SDD2ResponseType response = null;
response = transport.SDD2TransportOp(request);

//Write out the response.
System.Console.WriteLine(response.ResponseBody.ToString());
}

Мой метод веб-сервиса довольно прост и выглядит так:

    [System.Web.Services.Protocols.SoapHeaderAttribute("originatorValue", Direction = System.Web.Services.Protocols.SoapHeaderDirection.InOut)]
    [System.Web.Services.WebMethodAttribute()]
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://memberdirect.net/SDD2/Transport", RequestElementName = "SDD2Transport", RequestNamespace = "http://cucbc.com/sdd2/transport/", ResponseElementName = "SDD2TransportResponse", ResponseNamespace = "http://cucbc.com/sdd2/transport/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Default)]
    [return: System.Xml.Serialization.XmlElementAttribute("SDD2Response", Namespace = "http://cucbc.com/sdd2/")]
    public override SDD2ResponseType SDD2TransportOp(SDD2RequestType SDD2Request)
    {
        if (SDD2Request == null) throw new ArgumentNullException("SDD2Request");
        var response = new SDD2ResponseType();

        switch (SDD2Request.AppId)
        {
            case "echoSync":
                response.AppId = SDD2Request.AppId;
                response.ProcessingStatus = ProcessingStatusType.Complete;
                response.RequestId = SDD2Request.RequestId;
                response.ResponseBody = "Pong";
                break;
            default:
                throw new System.NotImplementedException();
                break;
        }

        return response;
    }

Когда я звоню, я знаю, что запрос не равен NULL, но когда он поступает в веб-сервис, он всегда принимается как нулевой. Я сгенерировал веб-сервис из WSDL с помощью утилиты wsdl.exe и явно не понимаю всех деталей SOAP, которые мне следует. Кто-нибудь еще сталкивался с этой проблемой?

Ответы [ 4 ]

1 голос
/ 26 ноября 2009

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

Для записи это вызвано тем, что RequestElementName отличается от имени метода. Могут быть и другие влияющие факторы, но когда я либо удалил атрибут RequestElementName из определения метода, либо сделал его таким же, как имя метода, проблема с нулевым аргументом исчезла.

Например, ваш код имеет RequestElementName = "SDD2Transport" и имя метода SDD2TransportOp.

Теперь я не знаю, почему это должно быть проблемой, особенно потому, что у вас также есть: ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Default, not Wrapped, что означает, что ElementName не будет использоваться в любом случае.

Интересно, является ли это ошибкой в ​​классе клиентского протокола .NET SOAP, потому что происходит то, что хотя правильный метод вызывается в веб-службе (поскольку он идентифицирован в заголовке действия SOAP), аргументы не получают Десериализованный.

В моем случае мне приходилось редактировать сгенерированный класс C # каждый раз, когда я его заново создавал, чтобы удалить атрибуты RequestElementName. Обратите внимание, что я не имел никакого контроля над исходным WSDL, так как он был предоставлен третьей стороной.

1 голос
/ 19 февраля 2009

Я понятия не имею, что вызывает это, так что это не ответ на ваш вопрос, а лишь предложение о том, как глубже изучить проблему

Попробуйте использовать сниффер, чтобы посмотреть фактические данные, передаваемые между машинами, и выяснить, на чьей стороне проблема. Я однажды успешно использовал Wireshark .

0 голосов
/ 19 февраля 2009

«параметр получен как ноль» почти всегда означает, что существует разница между квалифицированными именами, ожидаемыми сервером, и теми, которые отправляет клиент. Полное имя XML состоит из пространства имен и локального имени. Обычно это означает, что пространство имен неверно на стороне клиента, хотя я видел одно сообщение о разнице с именем.

В любом случае вы нашли решение проблемы №1 - «Обновить веб-ссылку».

0 голосов
/ 19 февраля 2009

У меня не было возможности использовать Wireshark, как предложил Конфигуратор, но мне удалось решить эту проблему, обновив веб-ссылку в обозревателе решений.

Я немного огорчен тем, что нашел такое простое решение после того, как боролся с ним более часа, но я надеюсь, что этот пост кому-то поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...