gui*_*ume 2 azure-service-fabric
是否可以在Service Fabric Cluster中将服务或参与者从一个应用程序调用到另一个应用程序?当我尝试(使用正确的Uri使用ActorProxy.Create)时,我得到了"没有为界面找到MethodDispatcher"
是的,这是可能的.只要您拥有对服务(或ActorService)的正确Uri,并且您可以使用定义服务或参与者的接口访问程序集,那么它与在同一应用程序中调用服务/ Actor不应该有太大的不同.您已启用服务的安全性,然后您还必须为交换设置证书.
如果我有一个简单的服务定义为:
public interface ICalloutService : IService
{
Task<string> SayHelloAsync();
}
internal sealed class CalloutService : StatelessService, ICalloutService
{
public CalloutService(StatelessServiceContext context)
: base(context) { }
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
yield return new ServiceInstanceListener(this.CreateServiceRemotingListener);
}
public Task<string> SayHelloAsync()
{
return Task.FromResult("hello");
}
}
Run Code Online (Sandbox Code Playgroud)
和一个简单的演员:
public interface ICalloutActor : IActor
{
Task<string> SayHelloAsync();
}
[StatePersistence(StatePersistence.None)]
internal class CalloutActor : Actor, ICalloutActor
{
public CalloutActor(ActorService actorService, ActorId actorId)
: base(actorService, actorId) {}
public Task<string> SayHelloAsync()
{
return Task.FromResult("hello");
}
}
Run Code Online (Sandbox Code Playgroud)
在这样的应用程序中运行:
然后,您可以从同一群集中的另一个应用程序调用它:
// Call the service
var calloutServiceUri = new Uri(@"fabric:/ServiceFabric.SO.Answer._41655575/CalloutService");
var calloutService = ServiceProxy.Create<ICalloutService>(calloutServiceUri);
var serviceHello = await calloutService.SayHelloAsync();
// Call the actor
var calloutActorServiceUri = new Uri(@"fabric:/ServiceFabric.SO.Answer._41655575/CalloutActorService");
var calloutActor = ActorProxy.Create<ICalloutActor>(new ActorId(DateTime.Now.Millisecond), calloutActorServiceUri);
var actorHello = await calloutActor.SayHelloAsync();
Run Code Online (Sandbox Code Playgroud)
如果单击该服务并查看名称,则可以在Service Fabric Explorer中找到正确的Uri.默认情况下,服务的Uri是:fabric:/{applicationName}/{serviceName}
.
唯一棘手的部分是如何从外部服务到您的呼叫服务获得接口?您可以简单地引用要调用的服务的内置.exe,或者您可以将包含该接口的程序集打包为NuGet包并放入私有源.
如果您不这样做而只是在Visual Studio解决方案之间共享代码,Service Fabric会认为这些是两个不同的接口,即使它们共享完全相同的签名.如果您为服务执行此操作,您会得到一个NotImplementedException
说法"接口ID'{xxxxxxxx}'未由对象'{service}'"实现,如果您为Actor执行此操作,则会得到一条KeyNotfoundException
说法"找不到用于接口ID的MethodDispatcher ' - {XXXXXXXXXX}'".
因此,要解决您的问题,请确保引用要在正在调用的外部应用程序中调用的应用程序中的同一程序集.
归档时间: |
|
查看次数: |
1182 次 |
最近记录: |