我正在帮助某人使用Visual Studio Tools For Applications将Infopath应用程序连接到使用WCF编写的服务,该服务需要在SOAP标头中发送用户名和密码(clientCredentialType =“UserName”)。该服务使用basicHttpBinding。
Infopath 2010依赖于Visual Studio Tools For Applications 2005,所以我不得不添加“Web引用”而不是“服务引用”。我以前从来没有这样做过,而且在弄清楚如何做到这一点时变得非常棘手。
在服务参考中我只想说:
service.Credentials.UserName.UserName = "username";
service.Credentials.UserName.Password = "password";
但是当使用Web引用消费时,Credentials属性的行为会有所不同,我无法让它自动在SOAP标头中传递用户名和密码。
我尝试了一些包括这些在内的事情,没有运气:
MyService service = new MyService();
CredentialCache cache = new CredentialCache();
// I've tried "Basic" and string.Empty as well in the place of "UserName"
cache.Add(new Uri(service.Url), "UserName", new NetworkCredential("username", "password"));
service.Credentials = cache;
service.PreAuthenticate = true;
service.MyMethod();
和
MyService service = new MyService();
service.Credentials = new NetworkCredential("username", "password");
service.MyMethod();
但是根本没有运气。记录服务上的整个消息,用户名和密码根本不包含在SOAP标头中,我收到以下错误:“验证消息的安全性时发生错误。”
答案 0 :(得分:1)
答案实际上只是你无法从.Net 2.0自动完成。
答案 1 :(得分:0)
WCF取代ASMX的原因有很多。对安全标准的支持就是其中之一。
如果您正在使用VSTA,那么我认为您可以使用COM对象。您可以使用.NET 3.5(只是.NET 2.0 SP2加上一些额外的库)创建一个COM对象。此COM对象可以使用WCF服务引用来使用该服务,但只会公开COM。任何可以使用COM对象的代码都可以使用你的“代理对象”。