【问题标题】:.NET webservice client from WSDL来自 WSDL 的 .NET Web 服务客户端
【发布时间】:2011-04-14 09:40:50
【问题描述】:

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

【问题讨论】:

  • 您所描述的情况似乎不正确。在查询字符串中调用具有值(用户名、密码……)的服务似乎适合基于 REST 的服务。您说您正在调用的服务正在提供 WSDL,因此它似乎是基于肥皂的服务。您不能同时拥有两种调用方案,因为soap 服务只能访问soap 信封中的任何内容而忽略查询字符串值。您能否澄清这是否实际上是基于肥皂的服务?谢谢!
  • @Sixto 这确实是一个基于 SOAP 的 Web 服务。我会检查你的建议,这是有道理的。感谢您的意见。

标签: c# web-services


【解决方案1】:

针对您的具体问题:

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

其他意见:

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

希望这会有所帮助。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
相关资源
最近更新 更多