Веб-сервисы ASP.NET, использующие ссылочные параметры в веб-методе - PullRequest
0 голосов
/ 05 июля 2010

У меня проблема при попытке получить информацию через веб-метод.Я использую прокси для вызова веб-службы, в этом прокси у меня есть операция, которая возвращает данные с использованием параметров «out».

Сервер успешно выполняет операцию, возвращая параметры должным образом (я также проверил сообщение возврата мыла с помощью анализатора трафика и все в порядке), но когда я запрашиваю эти параметры для прокси, я толькополучить нулевые значения.

Вот некоторая информация о коде:

// Это вызов веб-службы с использованием прокси (t является прокси, а get_capabilities является веб-методом)

public trf_capabilities get_capabilities() {
            trf_capabilities trfcap = new trf_capabilities();                
            trfcap.protocol_list= t.get_capabilities(0, out trfcap.pause, out trfcap.maxfiles, out trfcap.maxsize, out trfcap.encrypt, out trfcap.authenticate, out trfcap.integritycheck, out  trfcap.hashtype, out  trfcap.multipath, out  trfcap.profile_list);            
            return trfcap;
        }

// Это определение webMethod

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("iTransfer-get_capabilities",/*RequestElementName="elementoVacio_",*/ RequestNamespace="", ResponseElementName="trf_capabilitiesPar", ResponseNamespace="", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        [return: System.Xml.Serialization.XmlElementAttribute("protocol_list", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public protocolType[] get_capabilities([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] int vacio, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool pause, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out uint maxfiles, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out uint maxsize, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool encrypt, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool authenticate, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool integritycheck, [System.Xml.Serialization.XmlElementAttribute("hash_type", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out hash_typeType[] hash_type, [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out bool multipath, [System.Xml.Serialization.XmlElementAttribute("profile_list", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] out profile_listType[] profile_list) {
            object[] results = this.Invoke("get_capabilities", new object[] {
                        vacio});
            pause = ((bool)(results[1]));
            maxfiles = ((uint)(results[2]));
            maxsize = ((uint)(results[3]));
            encrypt = ((bool)(results[4]));
            authenticate = ((bool)(results[5]));
            integritycheck = ((bool)(results[6]));
            hash_type = ((hash_typeType[])(results[7]));
            multipath = ((bool)(results[8]));
            profile_list = ((profile_listType[])(results[9]));
            return ((protocolType[])(results[0]));
        }

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

И, наконец, вот SOAP-сообщение, перехваченное анализатором трафика:

Content-Type: text/xml; charset=UTF-8
Server: SOAPStandaloneServer
Content-Length: 584
Connection: close

<E:Envelope xmlns:E="http://schemas.xmlsoap.org/soap/envelope/" xmlns:A="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.w3.org/2001/XMLSchema"><E:Body><ns1:get_capabilitiesResponse xmlns:ns1=""><ns1:pause>true</ns1:pause><ns1:maxfiles>5</ns1:maxfiles><ns1:maxsize>0</ns1:maxsize><ns1:encrypt>true</ns1:encrypt><ns1:authenticate>true</ns1:authenticate><ns1:integritycheck>true</ns1:integritycheck><ns1:multipath>true</ns1:multipath></ns1:get_capabilitiesResponse></E:Body></E:Envelope>

Есть идеи?

Ответы [ 2 ]

1 голос
/ 05 июля 2010

Я думаю, что вы на правильном пути с [украшением] и сериализацией ответов.массивы там кажутся немного хитрыми, у вас есть подпрограммы сериализации для элементов в них?

Опять же, наличие такого количества выходных параметров кажется подавляющим.Я, вероятно, создал бы структуру "ServiceResponse" и добавил бы все параметры в качестве свойств.

РЕДАКТИРОВАТЬ: Следующий шаг, если ответ выглядит нормально, но у прокси есть проблемы с десериализацией, я бы предложил (конечно) углубиться в прокси.Сгенерирован ли прокси или вы написали его вручную?Попробуйте пройти через это и посмотреть, что он пытается сделать с параметрами, которые ему даны.Часто я берусь с веб-сервисами, пока у меня не потекут глаза, только чтобы обнаружить, что спецификация десериализации устарела.

0 голосов
/ 05 июля 2010

Я нашел что-то интересное во всем этом. Я проверял заголовки двух типов веб-методов, которые у меня есть (тот, который написан на C ++, который я должен использовать, и тестовый, который я разработал на C #). Я понял, что для наших параметров .NET добавляет какую-то упаковку. Вот объяснение MSDN:

Часть XML ответа SOAP инкапсулирует параметры out для метода веб-службы, включая результат внутри элемента. Имя инкапсулирующего элемента по умолчанию - это имя метода веб-службы, к которому добавлен Response.

Вот ссылка

Кажется, вам нужно использовать эту обертку, чтобы заставить работать "справочные" параметры.

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