3

服務織物樣品如單詞計數的Web應用程序監聽端口在這樣的子路徑部署在Azure服務織物Asp.Net核心應用:如何使用子路徑在集羣上共享相同的端口

http://localhost:8081/wordcount

這種配置的代碼是:(見GitHub上https://github.com/Azure-Samples/service-fabric-dotnet-getting-started/blob/master/Services/WordCount/WordCount.WebService/WordCountWebService.cs文件)

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() 
     { 
      return new[] 
      { 
       new ServiceInstanceListener(initParams => new OwinCommunicationListener("wordcount", new Startup(), initParams)) 
      }; 
     } 

有了這個配置,我們可以使用相同的端口在同一個集羣上部署的其他Web應用程序(8081)

http://localhost:8081/wordcount

http://localhost:8081/app1

http://localhost:8081/app2

等。

但Asp.Net Core項目模板是不同的,我不知道如何添加偵聽器配置的子路徑。

下面的代碼是我們所擁有的項目模板(Program.cs中類WebHostingService):

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() 
      { 
       return new[] { new ServiceInstanceListener(_ => this) }; 
      } 

Task<string> ICommunicationListener.OpenAsync(CancellationToken cancellationToken) 
      { 
       var endpoint = FabricRuntime.GetActivationContext().GetEndpoint(_endpointName); 

       string serverUrl = $"{endpoint.Protocol}://{FabricRuntime.GetNodeContext().IPAddressOrFQDN}:{endpoint.Port}"; 

       _webHost = new WebHostBuilder().UseKestrel() 
               .UseContentRoot(Directory.GetCurrentDirectory()) 
               .UseStartup<Startup>() 
               .UseUrls(serverUrl) 
               .Build(); 

       _webHost.Start(); 

       return Task.FromResult(serverUrl); 
      } 

語義是有點不同,但都在同一個點結束。 的問題是,即使我想補充的子路徑在的serverUrl結束但這並沒有工作和web應用程序總是響應根http://localhost:8081/

見我如何下面的代碼片段嘗試:

string serverUrl = $"{endpoint.Protocol}://{FabricRuntime.GetNodeContext().IPAddressOrFQDN}:{endpoint.Port}/app1"; 

如何使用asp.net核心實現與「經典」網絡應用程序相同的結果?

我們的目標是在Azure上發佈的80端口,讓用戶像一個更好的體驗:

http://mywebsite.com/app1

http://mywebsite.com/app2

謝謝你很多!

+0

https://docs.microsoft。com/en-us/azure/service-fabric/service-fabric-reliable-services-communication-aspnetcore#服務結構集成中間件 – LaPuyaLoca

+0

偉大的加法@LaPuyaLoca –

回答

1

紅隼不支持URL前綴或多個應用程序之間的端口共享。你必須使用WebListener代替:

using Microsoft.AspNetCore.Hosting ... _webHost = new WebHostBuilder().UseWebListener()

+0

您可以幫助一個示例嗎?沒有我嘗試過的組合工作...非常感謝你 –

1

我還沒有這樣做,但是這個GitHub存儲庫有用嗎?

https://github.com/weidazhao/Hosting

有關樣本

此示例演示:

1.How ASP.NET核心可以在無狀態/有狀態服務的通信偵聽器來使用。今天,我們啓用的場景是將ASP.NET Core Web應用程序作爲Service Fabric的無狀態服務託管。我們想要點亮人們也可以使用ASP.NET Core作爲無狀態服務和有狀態服務中的通信監聽器的場景,類似於OwinCommunicationListener。

2。如何構建一個API網關服務,以將請求轉發到其後的多個微服務器,並使用可重用的模塊化組件。 Service Fabric是構建微服務的絕佳平臺。網關中間件(Microsoft.ServiceFabric.AspNetCore.Gateway)試圖爲人們提供構建基塊,以便輕鬆實現Service Fabric上的微服務的API網關模式。有幾篇很好的文章闡述了API網關模式,例如http://microservices.io/patterns/apigateway.html,http://www.infoq.com/articles/microservices-intro等。有關微服務的更多信息,請查看https://azure.microsoft.com/en-us/blog/microservices-an-application-revolution-powered-by-the-cloud/,http://martinfowler.com/articles/microservices.html

+0

通過示例方法可以在同一個服務上運行多個服務 HTTP:使用他們的名字,如端口//本地主機:20000 /服務1 <--- SVC的應用1 的http://本地主機:20000 /服務2 <--- SVC的應用1 這是可能的,因爲在那裏網關服務將URI中的地址service1和service2映射到正確的服務。 但我找不到在同一端口上運行2個不同應用程序的方法。 這可能嗎? http:// localhost:20000/service1 <---應用程序1中的Svc http:// localhost:20000/service2 <---應用程序2中的Svc –

1

@Nick蘭德爾

與樣品的方法可以使用自己的姓名相同的端口上運行的若干服務:

http://localhost:20000/service1 < --- SVC的應用1

http://localhost:20000/service2 < ---應用程序中的Svc

這是可能的,因爲有一個網關服務,米將URI中的地址service1和service2映射到正確的服務。

但我找不到在同一端口上運行2個不同應用程序的方法。

可能嗎?

http://localhost:20000/service1 < --- SVC的應用1

http://localhost:20000/service2 < --- SVC在應用2

4

由於@Vaclav說,有必要通過UseWebListener改變UseKestrel。

但問題是WebListener綁定到地址是不同的。

看看這個線程的詳細信息https://github.com/aspnet/Hosting/issues/749

需要使用+而不是在本地主機的serverUrl或其他計算機名稱。

所以,改變德模板代碼:

  Task<string> ICommunicationListener.OpenAsync(CancellationToken cancellationToken) 
     { 
      var endpoint = FabricRuntime.GetActivationContext().GetEndpoint(_endpointName); 


      string serverUrl = $"{endpoint.Protocol}://{FabricRuntime.GetNodeContext().IPAddressOrFQDN}:{endpoint.Port}/service1"; 

      _webHost = new WebHostBuilder().UseKestrel() 
              .UseContentRoot(Directory.GetCurrentDirectory()) 
              .UseStartup<Startup>() 
              .UseUrls(serverUrl) 
              .Build(); 

      _webHost.Start(); 

      return Task.FromResult(serverUrl); 
     } 

  Task<string> ICommunicationListener.OpenAsync(CancellationToken cancellationToken) 
      { 
       var endpoint = FabricRuntime.GetActivationContext().GetEndpoint(_endpointName); 

       string serverUrl = $"{endpoint.Protocol}://+:{endpoint.Port}/service1"; 

       _webHost = new WebHostBuilder().UseWebListener() 
               .UseContentRoot(Directory.GetCurrentDirectory()) 
               .UseStartup<Startup>() 
               .UseUrls(serverUrl) 
               .Build(); 

       _webHost.Start(); 

       return Task.FromResult(serverUrl); 
      } 

而且它workd非常好。

相關問題