我正在尝试利用 Consul .NET API 通过 TTL 注册和触发健康检查。首先,我使用以下代码注册我的服务:
var address = node.Address;
var id = ServiceId(address);
var registration = new AgentServiceRegistration
{
ID = id,
Name = node.ClusterName,
Address = node.Address.Host,
Port = node.Address.Port.Value,
Check = new AgentServiceCheck
{
TTL = settings.AliveInterval, // 10sec
DeregisterCriticalServiceAfter = settings.AliveTimeout, // 60sec
}
};
// first, try to deregister service, if it has been registered previously
await consul.Agent.ServiceDeregister(registration.ID);
await consul.Agent.ServiceRegister(registration);
Run Code Online (Sandbox Code Playgroud)
紧接着,我试图通过以下方式触发 TTL:
await consul.Agent.PassTTL("service:" + ServiceId(addr), string.Empty);
Run Code Online (Sandbox Code Playgroud)
但是,我最终得到的是 PassTTL 期间抛出的异常:Consul.ConsulRequestException: Unexpected response, status …
就像标题一样。我有一个现有的 C# 库,我必须使用 F# 互操作访问它。其中一种方法将非通用System.Action委托作为参数。如何将 F# 函数(即unit->unit)转换为该委托?
尝试使用直接转换时,出现以下错误:
Multiple types exist called 'Action', taking different numbers of generic parameters.
Provide a type instantiation to disambiguate the type resolution, e.g. 'Action<_,_,_,_,_,_,_,_,_>'.
Run Code Online (Sandbox Code Playgroud) 现在我正在尝试 F# 计算表达式。总体思路是返回控制机制来驱动从计算表达式构建递归函数调用的每一步之后执行的操作。整个例子可以在这里看到。
使用以下示例:
let rec loop () =
actor {
let! msg = m.Receive ()
match msg with
| "stop" -> return 0 // expected result: Return (0)
| "unhandled" -> unhandled // expected result: Unhandled
| x ->
mailbox.Sender() <! x
return! loop () // expected result: (Become(fun m -> loop ()))
}
loop ()
Run Code Online (Sandbox Code Playgroud)
不幸的是,这以编译时错误结束unhandled:在此计算中,自定义操作可能无法与“use”、“try/with”、“try/finally”、“if/then/else”或“match”运算符结合使用表达。
是否可以以任何方式在匹配语句中使用自定义运算符?
我正在尝试创建F#等效的标记联合。我需要在应用程序代码的热路径中使用它,在此情况下,有区别的联合会导致过多的堆分配。
这是示例:
[<Struct; StructLayout(LayoutKind.Explicit)>]
type Result =
[<DefaultValue; FieldOffset 0>]
val mutable IsAsync : bool
[<DefaultValue; FieldOffset 1>]
val mutable Async : Async<obj>
[<DefaultValue; FieldOffset 1>]
val mutable Sync : obj
Run Code Online (Sandbox Code Playgroud)
但是,当我想为其提供某种创建方法时,问题就开始了。
例子1
static member Async(a:Async<obj>) = Result(IsAsync = true; Async=a)
static member Sync(s:obj) = Result(IsAsync = false; Sync=s)
Run Code Online (Sandbox Code Playgroud)
引发成员或对象构造函数'Result'接受0个参数,但此处指定为1。必需的签名为'Result()'编译错误。
例子2
new(a:Async<obj>) = { IsAsync = true; Async = a; }
new(s:obj) = { IsAsync = false; Sync=s }
Run Code Online (Sandbox Code Playgroud)
引发无关字段被赋予值编译错误。
我正在 Azure Service Fabric 中创建无状态服务。但是,一旦服务启动(或在自定义通信侦听器启动时),我需要获取该服务的所有其他实例/分区的地址。
我这样做是通过创建 newFabricClient并调用fabricClient.QueryManager.GetPartitionListAsync(serviceUri). 但是我收到FabricServiceNotFoundException消息服务不存在。当第一个服务实例开始运行时。
我在文档中找不到它,所以我的问题是:当该服务的新实例开始运行时,如何获取在 Azure Service Fabric 中运行的特定服务的所有活动实例的侦听端点地址列表?