定义一函数 (此2个函数多是封装在Web里服务器的方法)
    [WebMethod]
    public string function_ref(ref string str, ref int n)
    {
        str = "111";
        n = 10;
        return "222";
    }在客户端(非服务器机)程序里 建立一个Webservice连接,调用 function_ref(),如下:
string str="null";
int n=-1;
Webservice.function_ref(ref str,ref n);
//输出结果 str="111";   n = 10;  
  
   这个结果让我有些不解,我是这么想的,Webservice的代码不是在服务器端运行的吗?  客户机传一个地址,服务器按照这个地址进行处理,这些操作是对服务器指定内存的地址的值进行操作,而客户机的 那个地址所指向的值应该不变的吧????

解决方案 »

  1.   


    这都是经过C#封装后的东西了,你引用服务后,会生产一个代理类,这个类把服务器传回来的XML数据解析封装后给你的。具体的我也没有仔细了解了。
      

  2.   

    恩,这个问题问的好,虽然你调用的是一个服务器的web service(web服务),但实际上你说了“在客户端(非服务器机)程序里 建立一个Webservice连接”,就这这就话,你应该体会一下。相比你是通过VS.NET添加了一个Webservice吧,那么实际上VS.NET去连接服务器后,他将作为一个中间层,会将这个Webservice在本机生成一个代理类,你发送的请求,VS.NET其实是发送到你本机的代理类了~~因此,不会出现你那个问题。
      

  3.   

    LZ你试试运行你的webservice在浏览器里调用就知道了
      

  4.   

    这个我知道啊,服务器接受的数据(str的地址和n的地址),
    str = "111"; 
    这句执行在服务器是这样的吧,给str的地址(这个地址不是相对服务器端的吗?) 赋值--“111”,至于他返回一个XML文件,这个文件数据返回应该就是函数返回值的内容吧, 客户端 str的地址的值应该还是没变的啊????
      

  5.   

    webservice在浏览器 只能调用 基础的数据类型, 地址类型不行。
      

  6.   

    理解不准确。你说的“服务器接受的数据”实际不是你参数的数据啊,是vs.net为了将webservice与代理类版本一致(版本维护)而进行的通信数据,你的参数数据还是发送给本机代理类了。
      

  7.   

    代理类??  这个概念一直没接触···,我一直以为代码什么的多是在服务器端运行,客户端只管发送参数,然后接受返回的XML。
      

  8.   

    如果都跑服务器上运行,那岂不是你在webserver设计一个弹出框,服务器就调用因此就弹出一个喽
      

  9.   

    在visual studio.net中,右键单击“解决方案资源管理器”中的“引用”,选择“添加web引用”,就能打开“添加web引用”对话框, 在此对话框中,输入创建好的wsdl文件所在的地址,visual studio.net从指定的位置获取wsdl并验证他。单击“添加引用”按钮,就能将此wsdl描述的web服务的引用添加到当前的工程中。 通过以上操作,visual studio.net在后台自动分析wsdl,并创建了代表web服务的代理对象,并高速缓存了wsdl的本地副本。如果wsdl内容发生变化,需要手工“更新web引用”。 
      

  10.   

    lerit
     基本解决了我的疑问,不过有加了我一个疑问了··就是代理 这个东东
      谢谢lerit!!!
      

  11.   

    本人能力也有限,我之前写过一篇SOA论文涉及过代理类,这是我的原话,你参考吧:客户端不是直接引用上面生成的Web服务的。其调用方法可以总结为“引用-创建-调用”。在Visual Studio中从客户端项目中选择“添加Web引用”,并将向导指向包含Web服务的.asmx文件。可以通过“本地计算机上的Web服务”或通过“浏览本地网络上的UDDI服务器”来查找需要的服务,找到服务后,选择需要的Web服务,并点击“添加引用”。通过以上操作,Visual Studio.NET在后台自动分析服务的WSDL,并创建了代表Web服务的代理类,并高速缓存了WSDL的本地副本,而客户端可以使用该类来调用Web服务。之所以不直接调用Web服务而是在之间增加了代理类,主要是代理类代理了本应该手工完成的请求和调用方式。如果没有代理类,则程序员还必须与SOAP、WSDL和UDDI打交道。之后,在需要使用服务的业务层代码中,直接调用这个代理类即可,和使用本地的类是一样的。
    上面的话也就是说,没有代理类你照样可以访问webserver,但是这之间的数据传送必须你自己序列化,还要用soap协议,代理类就都替你做了,简化而已
      

  12.   

    楼主,你可以这样理解,ref只是给本地机器看的,传到WebService的东西和你没加ref的时候传的东西是一样的