c# - 来自 WSDL 的 .NET 网络服务客户端

标签 c# web-services

我有一个 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. 创建 MyService 对象的内存/CPU 密集程度如何?

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

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

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

最佳答案

针对您的具体问题:

  1. 在您的客户端代码中,您正在构建的是轻量级代理类的实例,这些代理类包装了 channel 基础结构,该 channel 基础结构将消息序列化到服务的端点或从服务的端点发出。因此,这些客户端代理类构建起来既便宜又快速,因为在您实际向服务发送内容之前,它们通常不会做很多事情。需要注意的一件事是,当您调用采用更复杂安全方案的服务时 - 与此类服务建立连接的成本可能很高,因此如果可以的话,缓存或重新使用此类连接是值得的。
  2. “任何解决方法”?没有! las,您正在使用的服务设计不佳 - 它们不仅需要用户名和密码作为服务方法调用的一部分提供,而且还需要您通过 HTTP 以明文形式传递它们。您可能希望他们至少提供一个 SSL 端点,以便用户名和密码在传输过程中得到保护。更好的是,他们可以实现 basic-auth 以允许您获取 HTTP 身份验证 cookie,您可以将其附加到针对他们服务的后续调用中。
  3. 是的,GC 最终会清理您的代理实例。更好的是,您可以将您的实例包装在 using 语句中以调用 Dispose 模式并确定性地清理。看我的Magic8Ball WCF Service以 Codeplex 为例。

其他观察结果:

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

希望这对您有所帮助。

关于c# - 来自 WSDL 的 .NET 网络服务客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5654160/

相关文章:

c# - 获取数组子集,无需像 C 中的指针那样进行复制

c# - 如何将字符串转换为 System.Uri?

java - 如何使用外部应用程序获取 Soap Web 服务的请求和响应详细信息?

c# - Active TabPage 与我的控件颜色相同

c# - PropertyGrid UITypeEditor 禁用单元格编辑

c# - 为 Web 服务创建磁盘缓存的最佳方法

javax.ws.rs.NotFoundException : Unable to extract parameter from http request

javascript - 有没有一种技术可以提供跨域浏览器到浏览器通信?

web-services - 并行运行 EMR 的步骤

java - 需要初始化对象时使用的设计模式?