繁体   English   中英

WSDL的.NET Web服务客户端

[英].NET webservice client from WSDL

我有一个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获取字符串,快速使用它并让它被垃圾回收。 我相信,如果我使用上述方法,那将是安全或足够安全的,而不是坚持引用服务,您对此有何建议!

对您的具体问题:

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

其他观察:

  1. 由于您的服务需要用户名和密码,因此每次调用时,都需要仔细考虑如何获取和存储用户名和密码。
  2. 我敦促您在app.config中指定绑定信息,而不是在代码中内联。 再次,请参见Magic8Ball WCF服务 :如果您在代码中创建绑定并且端点发生更改,或者如果它们打开了新的端点,协议,编码和/或绑定,则必须重新编译并重新分配整个应用程序。 如果您在config中指定绑定,则可能仅能运送更新的app.config。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM