WebService中多个WebMethod使用了SoapHeader,非托管VC客户端自动生成的代理类中包含多个SoapHeader的实例

huhe 2006-07-26 11:48:48
为了实现用户身份验证,在WebService中多个WebMethod使用了SoapHeader,托管代码客户端自动生成的代理类很正常,但非托管VC客户端自动生成的代理类中却包含多个SoapHeader的实例,导致客户端调用WebMethod时,不知道该用哪个SoapHeader。
请高手答疑解惑!

开发环境:Visual Studio 2003
WebService服务器端语言:C#
非托管客户端语言:VC++ 7.1

WebService部分代码:
public class Credential : SoapHeader { // 身份证书
public string User; // 用户名
public string Password; // 密码
}
public class AALWebService : System.Web.Services.WebService {
public Credential credential;

[WebMethod]
[SoapHeader("credential", Direction=SoapHeaderDirection.In)]
public string Hello(){
if(credential.User == "tom" && credential.Password == "12345")
return "Hello, Tom";
else
return "No Credential Error";
}
……

部分非托管VC++代理类代码:
template <typename TClient = CSoapSocketClientT<> >
class CAALWebServiceT :
public TClient,
public CSoapRootHandler
{
public:

//
// SOAP headers
//

Credential Credential21;
Credential Credential18;
Credential Credential50;
Credential Credential20;
……

...全文
681 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
apengyang 2006-08-04
  • 打赏
  • 举报
回复
VC没搞过,不太懂...
huhe 2006-08-03
  • 打赏
  • 举报
回复
看来要研究研究Microsoft SOAP Toolkit 3.0和wse了
huhe 2006-08-02
  • 打赏
  • 举报
回复
我等
jinbingg 2006-08-02
  • 打赏
  • 举报
回复
如果是为了加密用 wse 了。
huhe 2006-08-01
  • 打赏
  • 举报
回复
自己顶
huhe 2006-07-31
  • 打赏
  • 举报
回复
翘首等待……
mmens 2006-07-28
  • 打赏
  • 举报
回复
明白了.

不好意思。我这里也没有VC,也不能试试。

感觉不应该这样。好像VC对WebService的支持不太好。
微软针对Web Service的应用,发布了一个工具叫"Microsoft SOAP Toolkit 3.0"。通过它提供的COM组件,可以方便的调用Web Service。

你查查这方面的资料看看。
huhe 2006-07-27
  • 打赏
  • 举报
回复
To: mmens(快乐中前行!)
是同一个类型。
用WebMethod的时候,怎么将我定义的变量传递给它呢?WebMethod的参数中没有Credentia类的变量啊?
.net的代理类中定义了一个Credential数据成员,在调用任意WebMethod前后操作这个Credential数据成员即可设置或获取SoapHeader。非托管VC++代理类中,自动为每一个WebMethod都定义了一个Credential数据成员,形如:
Credential Credential21;
Credential Credential18;
Credential Credential50;
Credential Credential20;
……
数据成员名称后部的流水数字号在每次重新成生代理类的时候,还可能会变动,以致调用某个WebMethod的时候,不知道该设置哪个Credential数据成员。
mmens 2006-07-27
  • 打赏
  • 举报
回复
呵呵...这次很清楚了.
这说明在VC中生成的代理调用机制不一样。可能用惯了.net的代理类了。和我以前在Java中生成的代理类一样,调用机制也比较奇怪。

你看一下生成的代理类的"Credential数据成员"的类型和WebMethod中的类型是否一样?

如果都是同一个类型那就好办了。你只需要定义类变量,然后在调用WebMethod的时候将你定义的变量传递给它就可以了。
如果不能直接传递,试试加上显示类型转换。
huhe 2006-07-27
  • 打赏
  • 举报
回复
To: mmens(快乐中前行!)
可能说我没有描述清楚 :(
我只有一个WebService,名叫AALWebService,这个WebService只定义了一个SoapHeader,即
public Credential credential; (类 Credential 继承自 SoapHeader)
AALWebService中定义了多个WebMethod,每个WebMethod都使用了这个SoapHeader。在托管代码自动生成的代理类中,只有一个Credential的数据成员,但在非托管VC++自动生成的代理类中,却为每个WebMethod都自动生成了一个Credential的数据成员。
不知道这回我说明白了没。
mmens 2006-07-27
  • 打赏
  • 举报
回复
哦,明白你的意思了.

是这样子的,你在基类定义了soaphead后,那么如果有2个WebService都继承自基类。
那么它们自己都会有自己的soaphead。

例如:
service1.soaphead.
service2.soaphead.

你在客户端调用的时候,应该是调用每个WebService自己的soaphead.

你说的“但非托管VC客户端自动生成的代理类中却包含多个SoapHeader的实例,导致客户端调用WebMethod时,不知道该用哪个SoapHeader”。
这个问题应该不是问题的。建议你将你的WebService分别用单独的类文件写出来。这样的话,客户端调用哪个WebService,就调用serviceX.soaphead。这样就不会混乱了。

jinbingg 2006-07-27
  • 打赏
  • 举报
回复
我只是提个思路。不一定对。
jinbingg 2006-07-27
  • 打赏
  • 举报
回复
把消息的命名控件加上呢。这样就唯一了
huhe 2006-07-27
  • 打赏
  • 举报
回复
To: mmens(快乐中前行!)
问题就是非托管VC++的WebService代理类里有多个SoapHeader变量,不知道该用哪个!
mmens 2006-07-27
  • 打赏
  • 举报
回复
我觉得好像陷入了一个误区。

你不给WebMethod传递Soaphead会怎样?能否正确执行?

我想应该是可以的。因为你定义的soaphead是Web Service类的变量。而那些方法只会接受这个参数。生成多个定义后,有可能是WebMethod自己使用的内部变量。

你试着只给Service的soaphead传递你定义的变量,然后直接调用WebMethod,而不用去管如何传递soaphead给WebMethod。WebService应该会自动将soaphead传递给WebMethod的。
阿牛138588 2006-07-26
  • 打赏
  • 举报
回复
不清楚,帮楼主顶
huhe 2006-07-26
  • 打赏
  • 举报
回复
to: mmens(快乐中前行!)
我在 AALWebService 的类定义前面加了一行:

public class Service2 : Service1{ }

非托管VC客户端自动生成的代理类只是把 AALWebService 改为 Service2,Soap head 仍然有多个,问题没有解决。
请麻烦再帮我看看!
mmens 2006-07-26
  • 打赏
  • 举报
回复
为了实现用户身份验证,在WebService中多个WebMethod使用了SoapHeader,托管代码客户端自动生成的代理类很正常,但非托管VC客户端自动生成的代理类中却包含多个SoapHeader的实例,导致客户端调用WebMethod时,不知道该用哪个SoapHeader。

------------------------

建议修改你的Web Service的结构:

在所有的Web Service中设置基服务,定义Soap头。其他Web Service只要继承自基服务,那么你的代理就不会出现多个Soap head了。

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧