2017-04-05 53 views
1

我正在探索Azure的Service Fabric Microservices功能並喜歡它。我在那裏託管了一些簡單的WCF服務,我可以使用WcfClientCommunicationFactory類從.NET Framework客戶端調用這些服務。一切運作良好。來自.net核心的呼叫服務結構

現在我想從.NET Core控制檯應用程序調用我的微服務。這些關鍵字的搜索結果傾向於使用.NET Core來實現實際的服務,但我想爲客戶端使用.NET Core。

.NET Core應用程序可以與服務結構微服務交談嗎?如果是這樣,什麼是.NET核心相當於WcfClientCommunicationFactory

+0

強權此https://blogs.msdn.microsoft.com/webdev/2016/06/26/wcf-connected-service-for-net-core-1- 0-0-and-asp-net-core-1-0-0-is-now-available /有什麼幫助嗎?最簡單的方法是使用無狀態的apis來調用集羣中的wcf服務。客戶端可以使用休息連接。 –

回答

1

工廠的正確名稱是WcfCommunicationClientFactory,位於Microsoft.ServiceFabric.Services.Communication.Wcf.Client命名空間從Microsoft.ServiceFabric.Services.Wcf NuGet package。但現在它與.Net Core不兼容,因爲整個WCF方法和服務結構都不是。

服務織物微服務是到底是REST的服務,讓您有三種方法來承載它(from MSDN):

  • 沒有具體協議:如果你沒有一個特定的通信框架的選擇,但你想快速啓動和運行,那麼理想的選擇是服務remoting,它允許對可靠服務和可靠參與者進行強類型的遠程過程調用。這是開始進行服務交流的最簡單,最快捷的方式。服務遠程處理處理服務地址的解析,連接,重試和錯誤處理。這適用於C#和Java應用程序。
  • HTTP:對於語言無關的通信,HTTP提供了行業標準選擇的工具,在許多不同的語言HTTP服務器,通過服務織物的所有支持。服務可以使用任何可用的HTTP堆棧,包括用於C#應用程序的ASP.NET Web API。用C#編寫的客戶端可以利用ICommunicationClientServicePartitionClient類,而對於Java,請使用CommunicationClient和FabricServicePartitionClient類,用於service resolution, HTTP connections, and retry loops
  • WCF:如果您現有的代碼使用WCF作爲您的通信框架,那麼您可以在服務器端使用WcfCommunicationListener,爲客戶端使用WcfCommunicationClient和ServicePartitionClient類。但是,這僅適用於基於Windows的羣集上的C#應用​​程序。欲瞭解更多詳情,請參閱關於WCF-based implementation of the communication stack的文章。

注意:你需要ASP.NET Core tools for Visual Studio 2017。 Visual Studio 2015的.NET Core工具不再被更新。

注意事項#2:雖然ASP.NET Core應用程序可以在.NET Core或完整的.NET Framework上運行,但Service Fabric服務當前只能在完整的.NET Framework上運行。這意味着當你構建ASP.NET核心服務面料的服務,您還必須針對.NET Framework全。所以,沒有任何NuGet packages from Service Fabric有針對性地完整的.NET框架。

ASP。NET核心應用程序可以被託管作爲服務織物客人可執行無代碼更改,但推薦的方式來做到這一點是託管ASP.NET Core in a Reliable ServiceKestrelNuGet package)或WebListenerNuGet package):

enter image description here

後您發佈在服務織物服務器,則可以使用HTTP協議從任何地方連接到它 - Web FrontendAngular SPAXamarinC#HttpClient簡單,所以客戶端並不需要有針對性地完整的.NET框架,但是服務器。

一些示例代碼:

static HttpClient client = new HttpClient(); 

client.BaseAddress = new Uri(MICRO_SERVICE_URI); 
client.DefaultRequestHeaders.Accept.Clear(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

HttpResponseMessage response = await client.GetAsync(path); 
if (response.IsSuccessStatusCode) 
{ 
    // deserialize the result from JSON 
    var result = await response.Content.ReadAsAsync<DtoClass>(); 
}