使用webmethod中的引用参数的ASP.NET Web服务

时间:2010-07-05 10:38:22

标签: asp.net web-services pass-by-reference webmethod

当我尝试通过web方法检索信息时,我遇到了问题。我正在使用代理来调用Web服务,在该代理中我有一个使用'out'参数返回数据的操作。

服务器成功执行操作,返回正确实例化的参数(我也使用流量分析器检查了soap返回消息并且没问题),但是当我向代理请求这些参数时,我只获取空值

以下是一些代码信息:

//这是使用代理调用Web服务(t是代理,get_capabilities是web方法)

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 个答案:

答案 0 :(得分:1)

我认为你在[装饰]和序列化答案的正确轨道上。那里的数组似乎有点棘手,你有它们中元素的序列化例程吗?

然后,拥有那么多的输出参数似乎有点压倒性。我可能已经创建了一个“ServiceResponse”结构并将所有参数添加为其中的属性。

编辑:下一步,如果响应似乎没问题,但是代理反序列化有问题,我建议(当然)深入研究代理。代理是生成的还是您手动编写的?尝试逐步完成它,看看它尝试对它给出的参数做了什么。我经常讨论Web服务,直到我的眼睛流血,才发现反序列化规范已经过时了。

答案 1 :(得分:0)

我发现了所有这些有趣的东西。我一直在检查我所拥有的两种类型的Web方法的标题(用C ++编写的我必须使用的和我在C#中开发的测试)。我意识到,对于out参数,.NET会添加一些包装。 这是msdn的解释:

SOAP响应的XML部分封装了Web服务方法的 out 参数,包括元素内的结果。默认情况下,封装元素的名称是附加了Response的Web服务方法的名称。

Here is the link

似乎你必须使用那个包装器才能让'out'参考参数工作。