2016-12-30 76 views
1

如何獲取HTTP服務結構中託管的WCF服務的公開端點而不是TCP端點?我已成功獲得由微軟提供的樣本WCF-based communication stack for Reliable Services,但它使用TCP端點。我已經修改了CreateServiceReplicaListeners()代碼嘗試使用BasicHttpBinding,但出現以下錯誤:Azure服務結構中的WCF服務的HTTP端點

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")) 
    }; 
} 

回答

3

提供一個地址綁定:

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) 
); 

確保在服務清單中定義端點:

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

注意EndPoint的名稱與代碼中使用的名稱相匹配。

確保您創建端口的負載平衡規則(80在我的例子)

工作示例是here

+0

不得不使用您提供的示例中的更多內容,但該示例完美無缺 - 謝謝! –