gpt4 book ai didi

c# - Azure Service Fabric 中 WCF 服务的 HTTP 终结点

转载 作者:太空宇宙 更新时间:2023-11-03 23:05:23 25 4
gpt4 key购买 nike

如何为 Service Fabric 中托管的 WCF 服务公开 HTTP 端点而不是 TCP 端点?我在WCF-based communication stack for Reliable Services中成功拿到了微软提供的样本,但它使用 TCP 端点。我修改了 CreateServiceReplicaListeners() 代码以尝试使用 BasicHttpBinding,但出现以下错误:

Unhealthy event: SourceId='System.RA', Property='ReplicaOpenStatus', HealthState='Warning', ConsiderWarningAsError=false.
Replica had multiple failures in API call: IStatelessServiceInstance.Open(); Error = System.InvalidOperationException (-2146233079)
The ChannelDispatcher at 'http://localhost:0/43a1f131-a650-46f7-8871-02cc9821e0d1/6428f811-6944-4097-bf4a-0538355a1cb5-131275909542555280/81291d44-3c65-4d9b-8e0c-17a731103b5f' with contract(s) '"ICalculator"' is unable to open its IChannelListener.
at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceFabric.Services.Communication.Wcf.Runtime.WcfCommunicationListener`1.b__0(IAsyncResult ar)
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.d__0.MoveNext()

有问题的代码:

/// <summary>
/// Optional override to create listeners (e.g., TCP, HTTP) for this service replica to handle client or user requests.
/// </summary>
/// <returns>A collection of listeners.</returns>
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
var binding = new BasicHttpBinding(BasicHttpSecurityMode.None)
{
SendTimeout = TimeSpan.MaxValue,
ReceiveTimeout = TimeSpan.MaxValue,
OpenTimeout = TimeSpan.FromSeconds(5),
CloseTimeout = TimeSpan.FromSeconds(5),
MaxReceivedMessageSize = 1024 * 1024,
};
binding.MaxBufferSize = (int)binding.MaxReceivedMessageSize;
binding.MaxBufferPoolSize = Environment.ProcessorCount * binding.MaxReceivedMessageSize;
return new[]
{
new ServiceInstanceListener((context) =>
new WcfCommunicationListener<ICalculator>(context, this, binding, "WcfServiceEndpoint"))
};
}

最佳答案

为绑定(bind)提供一个地址:

string host = context.NodeContext.IPAddressOrFQDN;
var endpointConfig = context.CodePackageActivationContext.GetEndpoint("CalculatorEndpoint");
int port = endpointConfig.Port;
string scheme = endpointConfig.Protocol.ToString();
string uri = string.Format(CultureInfo.InvariantCulture, "{0}://{1}:{2}/", scheme, host, port);
var listener = new WcfCommunicationListener<ICalculatorService>(
serviceContext: context,
wcfServiceObject: this,
listenerBinding: new BasicHttpBinding(BasicHttpSecurityMode.None),
address: new EndpointAddress(uri)
);

确保在服务 list 中定义端点:

<Resources>
<Endpoints>
<Endpoint Name="CalculatorEndpoint" Protocol="http" Type="Input" Port="80" />
</Endpoints>
</Resources>

注意 EndPoint 的名称与代码中使用的名称相匹配。

确保为端口创建负载平衡规则(在我的示例中为 80)

一个工作示例是 here .

关于c# - Azure Service Fabric 中 WCF 服务的 HTTP 终结点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41399963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com