C# 来自WSDL的.NET webservice客户端

C# 来自WSDL的.NET webservice客户端,c#,web-services,C#,Web Services,我有一个WSDL,从中我生成了MyService的实现 function void updateData(Data data){ BasicHttpBinding binding = new BasicHttpBinding(); // see there is naked username and password. EndpointAddress address = new EndpointAddress("http://qa.farwaha.co

我有一个WSDL,从中我生成了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应用程序

  • 创建MyService对象的内存/CPU密集程度如何

  • 如果您建议兑现服务,它将保留端点地址;哪个实习生有用户名和密码的字符串。这不是个好主意。。有什么解决办法吗

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

  • 这是一个示例代码,我有一个用户对象,它将密码存储在SecureString中,每次我都要访问密码;我在一个实例私有方法中从SecureString获取字符串,快速使用它并让它被垃圾收集。我相信,若我使用上述方法,它将是安全的或足够安全的,而不是坚持服务的参考,你们有什么建议对于您的具体问题:

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

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

  • 希望这能有所帮助。

    您描述的情况似乎有点不正确。使用查询字符串中的值(用户名、密码等)调用服务似乎适合基于REST的服务。您说您正在调用的服务正在提供WSDL,因此它似乎是一个基于soap的服务。不能同时使用这两种调用方案,因为soap服务只能访问soap信封中的任何内容,而忽略查询字符串值。你能澄清一下这是否真的是一个基于soap的服务吗?谢谢@这实际上是一个基于SOAP的web服务。我会核实你的建议,这是有道理的。感谢您的输入。您应该重新考虑在“使用”中包装您的客户端对象。这篇文章很好地解释了为什么你不应该: