簡體   English   中英

如何在.NET中使用相同的代碼調用兩個或多個WCF服務?

[英]How call two or more WCF Services with same code in .NET?

我來自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);

題:

可以給他們打電話嗎? 在一種僅更改URL的方法中?


更新

可以在沒有任何類型引用的情況下調用它們嗎? 因為我都需要在兩者中使用一個通用方法,所以該方法接收相同的對象並檢索相同的對象。

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 ,只需將object更改為所有客戶端都遵循的更通用的接口或類。

編輯

根據您更新的問題,您將需要執行以下兩項操作之一

  1. 使用您需要調用的通用方法為通用服務實現接口或基類。 上面的代碼仍然可以使用,只需要強制轉換您的新普通類型。
  2. 使用反射來動態調用所需的常用方法。 這不會給您任何編譯時檢查或錯誤,並且只會在運行時發現任何問題。

我強烈建議#1,但是如果由於某些原因無法執行,則可以執行#2。 如果您需要做#2,則可以在兩者之間碰到一半,並實現一個包裝器類,該包裝器類試圖結合一些此功能:

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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM