. net web服务客户端从WSDL

本文关键字:WSDL 客户端 服务 web net | 更新日期: 2023-09-27 17:49:58

我有一个WSDL,我从中生成了ClientBase的实现,即MyService


function void updateData(Data data){
   BasicHttpBinding binding = new BasicHttpBinding();
    // see there is naked username and password.           
   EndpointAddress address = new EndpointAddress("http://qa.farwaha.com/eai_enu/start.swe?SWEExtSource=WebService&SWEExtCmd=Execute&UserName=john&Password=johspassword");
   MyService service = new MyService(binding, address);
   try{
     service.update(data);
   }finally{
     service.close();
   }
}
不幸的是,要调用这个web服务,我必须传递用户名和密码,如代码所示。我的问题是关于最佳实践的。

考虑到它是一个Winform应用程序。

  1. 如何内存/CPU密集创建MyService对象?

  2. 如果您建议兑现服务,它将保留EndpointAddress;哪个实习生有一串用户名和密码。这不是一个好主意……还有别的办法吗?

  3. 如果我保持这样的代码,服务对象将被垃圾收集。并且不会有用户名或密码的踪迹(只要GC运行)

这是一个示例代码,我有一个用户对象,它在SecureString中存储密码,每次我必须访问密码;我在实例私有方法中从SecureString获得字符串,快速使用它并让它被垃圾收集。我相信如果我使用类似上述的方法,它将是安全的,或者足够安全,而不是坚持服务的参考,你有什么建议!!

. net web服务客户端从WSDL

针对您的具体问题:

  1. 在您的客户端代码中,您正在构建的是轻量级代理类的实例,这些实例包装了通道基础设施,这些通道基础设施将消息序列化到服务的端点。因此,这些客户端代理类构建起来既便宜又快速,因为在您实际向服务发送一些内容之前,它们通常不会做很多事情。需要注意的一件事是,当您调用采用更复杂安全方案的服务时-建立到此类服务的连接可能代价高昂,因此如果可以,值得缓存或重用此类连接。
  2. "工作区"吗?不!遗憾的是,您正在使用的服务设计得很差——它们不仅要求作为服务方法调用的一部分提供用户名和密码,而且还要求您通过HTTP以透明的方式传递它们。您可能希望要求他们至少提供SSL端点,以便在传输过程中保护用户名和密码。更好的是,他们可以实现基本认证,允许你获得一个HTTP认证cookie,你可以将其附加到对他们服务的后续调用中。
  3. 是的,GC最终会清理代理实例。更好的是,您可以将实例包装在using语句中,以确定地调用Dispose模式和清理。参见我的Magic8Ball WCF服务在Codeplex的例子。

其他观察结果:

  1. 因为你的服务需要你的用户名和密码,所以每次调用它时,你都需要非常仔细地考虑如何获取和存储用户名和密码。
  2. 我建议你在app.config中指定你的绑定信息,而不是在你的代码中内联。再一次,看看Magic8Ball WCF服务:如果你在代码中创建绑定,而端点发生了变化,或者如果他们打开了一个新的端点、协议、编码和/或绑定,你将不得不重新编译和重新编写整个应用程序。如果你在配置中指定绑定,你可能只需要发布一个更新的app.config。