【发布时间】:2012-07-24 03:27:46
【问题描述】:
我有一个有趣的问题,它让我超出了我的 C# 舒适区。通过使用 WsdlImporter 和 CodeDomProvider 类动态检查 Web 服务 WSDL,我可以生成 Web 服务的客户端代理代码并将其编译为程序集。这包括声明如下的服务客户端类:
public partial class SomeServiceClient : System.ServiceModel.ClientBase<ISomeService>, ISomeService {...}
请注意,客户端类的名称和 ISomeService 契约的名称是动态的——我事先并不知道它们。我可以使用以下方法动态实例化此类的对象:
string serviceClientName = "SomeServiceClient";// I derive this through some processing of the WSDL
object client = webServiceAssembly.CreateInstance(serviceClientName , false, System.Reflection.BindingFlags.CreateInstance, null, new object[] { serviceEndpoint.Binding, serviceEndpoint.Address }, System.Globalization.CultureInfo.CurrentCulture, null);
但是,如果我需要在此客户端类中设置 ClientCredentials,那么我无法确定如何执行此操作。我认为我可以将客户端对象强制转换为 System.ServiceModel.ClientBase 泛型类,然后引用 ClientCredentials 属性。但是,以下编译但在运行时失败:
System.Net.NetworkCredential networkCredential = new System.Net.NetworkCredential(username, password, domain);
((System.ServiceModel.ClientBase<IServiceChannel>)client).ClientCredentials.Windows.ClientCredential = networkCredential;
有没有办法动态指定演员表,或者有没有办法在没有这个演员表的情况下设置凭据?谢谢你的帮助!马丁
【问题讨论】:
-
您能分享一下您遇到的异常吗?
-
恐怕我现在不在我的开发机器上,但是从记忆中,异常是这样的: SomeServiceClient cannot be cast to System.ServiceModel.ClientBase
-
嗨 - 这是异常的确切形式:无法将“SomeServiceClient”类型的对象转换为“System.ServiceModel.ClientBase`1[System.ServiceModel.IClientChannel]”类型。
标签: c# generics dynamic casting