2017-09-21 12 views
0

Owin과 함께 서비스 패브릭 프로젝트를 진행하고 있으며 클라우드에 배포하는 데 문제가 있습니다. 나는 같은 문제를 가진 다른 사람들을 찾았지만 클러스터의 오류가 어디서 코드가 잘못되었는지 알려주는 답을 발견했다. 필자는 실패한 메서드를 작성하는 방법에 대한 Microsoft Owin 자습서를 따랐지만 운이 없었습니다. Visual Studio에서 Localhost 디렉터리로 프로젝트를 실행할 수는 있지만 Azure의 서비스 패브릭 클러스터에 배포하면 문제가 발생합니다. 5 노드 클러스터가 실행 중이고 배포 할 때 2 분 후 경고가 시작되고 5 분 후에 오류가 발생합니다. 응용 프로그램의 상태는 "inbuild"입니다. Image of warningImage of error.Owin에서 Azure 서비스 패브릭 클러스터로 서비스 패브릭 프로젝트를 배포 할 때의 문제

나는 두 가지 서비스가 있고, 내 클러스터에서 오류가 (각 서비스 (OpenAsync)에 같은 방법으로) 이러한 두 가지 방법에 오류가 있습니다 : 클러스터에서 오류가 오류가 알려줍니다

 public Task<string> OpenAsync(CancellationToken cancellationToken) 
    { 
     var serviceEndpoint = 
      _parameters 
      .CodePackageActivationContext 
      .GetEndpoint("ServiceEndpoint"); 

     var port = serviceEndpoint.Port; 
     var root = 
      String.IsNullOrWhiteSpace(_appRoot) 
      ? String.Empty 
      : _appRoot.TrimEnd('/') + '/'; 


     _listeningAddress = String.Format(
      CultureInfo.InvariantCulture, 
      "http://+:{0}/{1}", 
      port, 
      root 
     ); 
     _serverHandle = WebApp.Start(
      _listeningAddress, 
      appBuilder => _startup.Configuration(appBuilder) 
     ); 

     var publishAddress = _listeningAddress.Replace(
      "+", 
      FabricRuntime.GetNodeContext().IPAddressOrFQDN 
     ); 

     ServiceEventSource.Current.Message("Listening on {0}", publishAddress); 
     return Task.FromResult(publishAddress); 
    } 

  _serverHandle = WebApp.Start(
      _listeningAddress, 
      appBuilder => _startup.Configuration(appBuilder) 
     ); 

(다른 서비스로부터) 다른 방법 :

 public Task<string> OpenAsync(CancellationToken cancellationToken) 
    { 
     var serviceEndpoint = 
      _parameters 
      .CodePackageActivationContext 
      .GetEndpoint("ServiceEndpoint"); 

     var port = serviceEndpoint.Port; 
     var root = 
      String.IsNullOrWhiteSpace(_appRoot) 
      ? String.Empty 
      : _appRoot.TrimEnd('/') + '/'; 

     _listeningAddress = String.Format(
      CultureInfo.InvariantCulture, 
      "http://+:{0}/{1}", 
      port, 
      root 
     ); 

     try 
     { 
      _serverHandle = WebApp.Start(
       _listeningAddress, 
       appBuilder => _startup.Configuration(appBuilder) 
      ); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
      throw e; 
     } 


     var publishAddress = _listeningAddress.Replace(
      "+", 
      FabricRuntime.GetNodeContext().IPAddressOrFQDN 
     ); 

     ServiceEventSource.Current.Message("Listening on {0}", publishAddress); 
     return Task.FromResult(publishAddress); 
    } 

이 섹션

  try 
     { 
      _serverHandle = WebApp.Start(
       _listeningAddress, 
       appBuilder => _startup.Configuration(appBuilder) 
      ); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
      throw e; 
     } 

내 시작 프로그램 클래스 :

 public void Configuration(IAppBuilder appBuilder) 
    { 
     var corsAttr = new EnableCorsAttribute(origins: "*", headers: "*", methods: "*"); 

     var config = new HttpConfiguration(); 
     config.WithWindsorSetup(); 
     config.WithJsonSetup(); 
     config.MapHttpAttributeRoutes(); //Enable Attribute-routing 
     config.WithSwaggerSetup(); 
     config.EnsureInitialized(); 
     config.EnableCors(corsAttr); 
     appBuilder.UseWebApi(config); 


    } 

와 나는 새로운 OwenCommunicationListener 만들 여기서

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

을 나는 것 매우 클러스터에서 오류가 오류가이 섹션에 알려줍니다 Azure Service Fabric Cluster에 오류없이 배포 할 수 있기를 바랍니다. 좋은 하루 되세요. 도와 줘서 고마워요.

답변

0

Owin 수신기의 라우팅 및 http 구성을 구성하는 사용자 지정 클래스를 작성해야합니다.

/// <summary> 
    /// This is the startup class that configure the routing and http configuration for Owin listener. 
    /// </summary> 
    public static class Startup 
     { 
     // This code configures Web API. The Startup class is specified as a type 
     // parameter in the WebApp.Start method. 
     public static void ConfigureApp (IAppBuilder appBuilder) 
      { 

      appBuilder.UseCors(CorsOptions.AllowAll); 
      // Configure Web API for self-host. 
      HttpConfiguration config = new HttpConfiguration(); 
      config.MapHttpAttributeRoutes(); 

      var json = config.Formatters.JsonFormatter; 
      json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; 
      config.Formatters.Remove(config.Formatters.XmlFormatter); 

      appBuilder.UseWebApi(config); 
      } 
     } 

패스는 OwinCommunication 리스너의 인스턴스를 생성하는 인스턴스에 액션이 클래스 : 는 여기에 내가 그것으로 시도, 라우팅을 구성하는 데 사용하고있는 클래스입니다. 여기 내 코드는

endpoints.Select(endpoint => new ServiceInstanceListener(
       serviceContext => new OwinCommunicationListener(Startup.ConfigureApp, serviceContext, 
        null, endpoint), endpoint)); 

이 접근법은 나를 위해 작동합니다. 그것으로 잘 시험해보십시오.

+0

답변 해 주셔서 감사합니다. 이미 내 자신의 사용자 정의 Startup 클래스를 작성하여 OwinCommunicationListener의 새 인스턴스를 만드는 위치에서 사용합니다. 원래 게시물에 코드를 추가했습니다. – ptr

0

문제가 해결되었습니다. 이 코드를 편집했습니다 :

 protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() 
    { 
     return Context.CodePackageActivationContext.GetEndpoints() 
      .Where(endpoint => endpoint.Protocol.Equals(EndpointProtocol.Http) || endpoint.Protocol.Equals(EndpointProtocol.Https)) 
      .Select(endpoint => new ServiceInstanceListener(serviceContext => new OwinCommunicationListener("", new Startup.Startup(), serviceContext))); 

     //return new[] { 
     // new ServiceInstanceListener(initParams => new OwinCommunicationListener("", new Startup.Startup(), initParams)) 
     //}; 
    }