2017-03-06 151 views
2

過去幾周我一直從Cloud Services遷移到Service Fabric,並且使用2個服務之間的Remoting運行了幾個絆腳石。服務結構服務遠程處理

我一直在使用的服務Remoting的官方文檔和示例代碼,特別是我試圖讓這裏列出的工作樣本:

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-communication-remoting

我有2個服務。一個名爲「RemoteService」,另一個名爲「CallerService」。兩者都來自默認的無狀態服務項目。

在這兩個「RemoteService」,我還增加了以下接口來形容他們之間的服務合同「CallerService」項目:

public interface IMyService : IService 
{ 
    Task<string> HelloNameAsync(string name); 
} 

「RemoteService」我已經在RemoteService類中創建相關方法

public Task<string> HelloNameAsync(string name) 
{ 
    return Task.FromResult("Hello " + name + "!"); 
} 

我也覆蓋CreateServiceInstanceListeners具有以下

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() 
{ 
    return new[] { new ServiceInstanceListener(context => this.CreateServiceRemotingListener(context)) }; 
} 

在我「CallerService」當我嘗試用下面的連接撥打電話到 「RemoteService」:

IMyService helloNameClient = ServiceProxy.Create<IMyService>(new Uri("fabric:/Application/RemoteService")); 
string message = await helloNameClient.HelloNameAsync("Luke"); 

我得到這個例外

InnerException = {"Interface id '1994370306' is not implemented by object 'RemoteService.RemoteService'"} 

我已經過了這個樣本,用細齒梳,我確信我擁有了我所有的東西應該是這樣。我已經閱讀了關於設置端點並將服務註冊到服務目錄的信息,但是從我瞭解的那些服務目錄來看,這些是針對外部服務的,Remoting文檔沒有提及這一點。

UPDATE:

這裏是RemoteService類是如何聲明:

internal sealed class RemoteService : StatelessService, IMyService 

更新2

這裏是什麼將Settings.xml看起來像這兩種服務。這些是項目開箱即可使用的默認設置。我沒有添加或刪除任何東西。我還想指出,我在本地服務結構上運行所有這些。

<?xml version="1.0" encoding="utf-8" ?> 
<Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric"> 
    <!-- Add your custom configuration sections and parameters here --> 
    <!-- 
    <Section Name="MyConfigSection"> 
    <Parameter Name="MyParameter" Value="Value1" /> 
    </Section> 
    --> 
</Settings> 
+0

我們能否看到您如何聲明RemoteService類?還爲這兩個服務Settings.xml。 – cassandrad

+0

是的,我剛添加了一個更新。 – CodeAbundance

+0

剛剛添加了Settings.xml文件。 – CodeAbundance

回答

4

服務接口在需要與客戶端共享的聲明的組件,則無法重新創建客戶端上的一個相同的接口。當Service Fabric建立通信時,它會建立一個接口映射,它是來自服務使用的實際組裝的方法。

根據您的描述,看起來您在服務和客戶端項目中聲明瞭相同的接口?如果是這樣,那麼這是修復。

SO: Calling services from other application in the cluster: 唯一棘手的部分是你如何從外部服務接口到你的呼叫服務?您可以簡單地引用您希望調用的服務的內置.exe文件,也可以將包含該接口的程序集打包爲NuGet包並放入私有源。

如果您不這樣做,而您只是在您的Visual Studio解決方案之間共享代碼,Service Fabric將認爲這是兩個不同的接口,即使它們共享完全相同的簽名。如果您爲某項服務執行此操作,則會得到一個NotImplementedException異常,並提示「接口ID {xxxxxxxx}'未由對象'{service}'實現,如果您爲Actor執行此操作,則會出現KeyNotfoundException,說」找不到MethodDispatcher for接口ID' - {xxxxxxxxxx}'「。

因此,要解決您的問題,請確保您引用與要調用的外部應用程序中要調用的應用程序中相同的程序集。

+0

謝謝,就是這樣!由於這兩個服務都在同一個解決方案中,我爲Interface創建了一個共享庫。 – CodeAbundance