如何在.NET中使用相同的代码调用两个或更多WCF服务?

时间:2014-11-06 17:31:56

标签: c# wcf

我来自Web Api所以也许这个问题会有点奇怪。 我在Visual Studio 2012中工作

情景:

我现在有两个WCF services(但将来会更多)接受相同的对象(假设datacontract A具有相同的数据库)

我正以这种方式打电话给他们:

string url1 = "myURL1";
BasicHttpBinding binding1 = new BasicHttpBinding();
EndpointAddress address1 = new EndpointAddress(url1);
ServiceClient1 serviceClient1 = new ServiceClient1(binding1, address1);

string url2 = "myURL2";
BasicHttpBinding binding2 = new BasicHttpBinding();
EndpointAddress address2 = new EndpointAddress(url2);
ServiceClient2 serviceClient2 = new ServiceClient2(binding2, address2);

问题:

可以打电话给他们吗?在一个唯一的方法,以便只是改变网址?


更新

是否可以在没有任何类型参考的情况下调用它们?因为我需要在两者中使用通用方法,并且该方法接收相同的对象并检索相同的对象。

1 个答案:

答案 0 :(得分:1)

T CreateServiceClient<T>(string url)
{
    var binding = new BasicHttpBinding();
    var endpointAddress = new EndpointAddress(url);
    return (T) Activator.CreateInstance(typeof(T), new object[] {binding, endpointAddress});
}

应该可以这样使用它:

var client1 = new CreateServiceClient<ServiceClient1>("http://...");
var client2 = new CreateServiceClient<ServiceClient2>("http://...");

您可以查看泛型并尝试将T限制为更具体,因为这不会为您提供任何类型安全。

如果您的动态意味着只有Type,则可以执行此操作:

object CreateServiceClient(Type serviceClientType, string url)
{
    var binding = new BasicHttpBinding();
    var endpointAddress = new EndpointAddress(url);
    return Activator.CreateInstance(serviceClientType, new object[] {binding, endpointAddress});
}

如果已定义了object,只需将public class MyServiceWrapper { Type _serviceType; public MyServiceWrapper(Type serviceType) { _serviceType = serviceType; } public object CreateInstance() { ... code from above ... } public YourObject InvokeServiceMethod() { var instance = CreateInstance(); var methodInfo = _serviceType.GetMethod("MethodName"); return (YourObject) methodInfo.Invoke(instance, anyArguments); } } 更改为所有客户端遵守的更通用的界面或类。

修改

根据您更新的问题,您需要执行以下两项操作之一

  1. 使用您需要调用的常用方法为公共服务实现接口或基类。上面的代码仍然有效,只需要转换你的新常用类型。
  2. 使用反射动态调用您需要的常用方法。这不会给你任何编译时检查或错误,只有在运行时才会发现任何问题。
  3. 我强烈推荐#1,但如果出于某种原因无法做到,你可以做#2。如果你需要做#2,你可以在两者之间遇到并实现一个试图结合这些功能的包装类:

    {{1}}