来自WSDL的.NET Web服务客户端

时间:2011-04-13 18:59:54

标签: 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. 内存/ CPU密集型如何创建MyService对象?

  2. 如果您建议兑现服务,它将保留到EndpointAddress;哪个实习生有一个带有用户名和密码的字符串。这不是一个好主意..任何工作?

  3. 如果我保留代码,服务对象将被垃圾收集..并且不会有用户名或密码的痕迹(只要GC运行)
  4. 这是一个示例代码,我有用户对象,它在SecureString中存储密码,每次我必须访问密码;我在一个实例私有方法中从SecureString获取字符串,快速使用它并让它被垃圾收集。我相信如果我使用类似上面的方法,它将是安全的或足够安全而不是坚持参考服务,你有什么建议!!

1 个答案:

答案 0 :(得分:1)

针对您的具体问题:

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

    1. 因为您的服务需要您的用户名和密码,所以每次打电话时,都需要仔细考虑如何获取和存储用户名和密码。
    2. 我建议您在app.config中指定绑定信息,而不是在代码中内联。再次,请参阅Magic8Ball WCF Service:如果您在代码中创建绑定并且端点发生更改,或者如果它们打开新的端点,协议,编码和/或绑定,则您必须重新编译并重新整理整个应用程序。如果您在配置中指定绑定,则可能只能运送更新的app.config。
    3. 希望这有帮助。