WebService中更新函数传入值,再调用其中函数时,函数的参数还是未改变

本文探讨了在使用WebService时遇到的一个问题:当函数返回类型为void且包含多个out参数时,在客户端调用的形式会发生变化。通过调整返回类型为bool解决了此问题,并解释了微软在Web引用时对void类型函数的转换逻辑。
背景:
今天写了一个webservice,又修改了一下函数的返回类型、out参数的数量(改为:public void SendData(DataSet ds, out string result,out string errMsg)),之后更新引用,再调用的使用时候发现 SendData显示为 public string SendData(DataSet ds, out string errMsg)形式,不管是添加webservice还是reference service都不行,解决方案也清理过,iis也重启过,都没解决问题。
结果:
最后把函数改成public bool SendData(DataSet ds, out string result,out string errMsg)就可以了,再调用的时候,就会正确提示。可见void与多个out有一定的“矛盾”啊
==》微软在web引用的时候做了一个转换,把void类型函数的out参数自动转换为非void函数,并把这个参数变成了函数的返回值。
比如:

  
  1. [WebMethod]
  2. publicvoidgetPwdNick(intuserid,outstringpwd,outstringnick)
  3. {
  4. }
他会在web引用后生成如下代码:

  

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/getPwdNick", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]

[return: System.Xml.Serialization.XmlElementAttribute("pwd")]

publicstringgetPwdNick(intuserid,outstringnick)

{

object[] results=this.Invoke("getPwdNick",newobject[] {userid});

nick=((string)(results[1]));

return((string)(results[0]));

}

这段代码在vs中点击显示所有文件,然后再web refences下面localhost-Reference.map-Reference.cs中。


<wbr><br></wbr>
在Windows系统下,IIS部署的WebService调用的C++ DLL中,可以使用以下几个函数来获取当前目录: ### `GetCurrentDirectory` 函数 `GetCurrentDirectory` 函数用于获取当前进程的当前工作目录。其函数原型如下: ```cpp DWORD GetCurrentDirectory( DWORD nBufferLength, LPTSTR lpBuffer ); ``` - `nBufferLength`:指定缓冲区 `lpBuffer` 的大小(以字符为单位)。 - `lpBuffer`:用于接收当前目录字符串的缓冲区。 示例代码: ```cpp #include <windows.h> #include <iostream> int main() { TCHAR buffer[MAX_PATH]; DWORD length = GetCurrentDirectory(MAX_PATH, buffer); if (length > 0) { std::wcout << L"当前目录: " << buffer << std::endl; } else { std::wcout << L"获取当前目录失败,错误代码: " << GetLastError() << std::endl; } return 0; } ``` ### `GetModuleFileName` 函数 `GetModuleFileName` 函数可以获取指定模块的完整路径名。如果传入 `NULL` 作为模块句柄,则返回当前进程可执行文件的完整路径。通过处理这个路径,可以得到当前目录。其函数原型如下: ```cpp DWORD GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ); ``` - `hModule`:模块句柄,传入 `NULL` 表示当前进程。 - `lpFilename`:用于接收模块完整路径名的缓冲区。 - `nSize`:指定缓冲区 `lpFilename` 的大小(以字符为单位)。 示例代码: ```cpp #include <windows.h> #include <iostream> #include <string> std::wstring GetCurrentDirectoryFromModule() { TCHAR buffer[MAX_PATH]; DWORD length = GetModuleFileName(NULL, buffer, MAX_PATH); if (length > 0) { std::wstring path(buffer); size_t pos = path.find_last_of(L"\\/"); if (pos != std::wstring::npos) { return path.substr(0, pos); } } return L""; } int main() { std::wstring currentDir = GetCurrentDirectoryFromModule(); if (!currentDir.empty()) { std::wcout << L"当前目录: " << currentDir << std::endl; } else { std::wcout << L"获取当前目录失败" << std::endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值