簡體   English   中英

服務結構服務遠程處理

[英]Service Fabric Service Remoting

在過去的幾周里,我一直在從雲服務遷移到Service Fabric,並且使用兩個服務之間的Remoting遇到了一些絆腳石。

我一直在使用Service 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類中創建了asociated方法

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文檔並沒有提到需要這樣做。

更新:

以下是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>

聲明服務接口的程序集需要與客戶端共享,不能在客戶端重新創建相同的接口。 當Service Fabric建立通信時,它會構建一個接口映射,它的方法來自服務使用的實際匯編。

根據您的描述,您似乎在服務和客戶端項目中聲明了相同的界面? 如果是這樣,那么這就是修復。

SO:從集群中的其他應用程序調用服務 :唯一棘手的部分是如何從外部服務到您的呼叫服務獲得接口? 您可以簡單地引用要調用的服務的內置.exe,或者您可以將包含該接口的程序集打包為NuGet包並放入私有源。

如果您不這樣做而只是在Visual Studio解決方案之間共享代碼,Service Fabric會認為這些是兩個不同的接口,即使它們共享完全相同的簽名。 如果您為服務執行此操作,則會收到NotImplementedException,說“接口ID'{xxxxxxxx}'未由對象'{service}'”實現,如果您對Actor執行此操作,則會收到KeyNotfoundException,表示“找不到MethodDispatcher” interface id' - {xxxxxxxxxx}'“。

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

暫無
暫無

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

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