2017-09-21 3 views
0

Je travaille sur un projet Service Fabric avec Owin et je n'arrive pas à le déployer dans le cloud. J'ai cherché d'autres personnes avec le même problème, mais j'ai seulement trouvé une réponse disant que l'erreur dans le cluster indique où dans le code il va mal. J'ai suivi le tutoriel de Microsofts Owin sur la façon d'écrire la méthode qui échoue, mais sans chance. Je peux exécuter le projet sur Localhost directement à partir de Visual Studio, mais le problème se produit lorsque je le déploie sur un cluster Service Fabric dans Azure. J'ai un cluster de 5 nœuds en cours d'exécution, et quand je le déploie, il commence à donner des avertissements après 2 minutes, et des erreurs après 5 minutes. le statut de l'application est "inbuild". Image of warning et Image of error.Problèmes liés au déploiement du projet Service Fabric avec Owin à Azure Service Fabric Cluster

J'ai deux services, et l'erreur de mon groupe donne l'erreur dans ces deux méthodes (la même méthode dans chaque service (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); 
    } 

l'erreur du cluster indique l'erreur est dans cette section:

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

l'autre méthode (à partir de l'autre service):

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

l'erreur du cluster indique l'erreur est dans cette section:

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

Mes StartUp Classes:

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


    } 

et où je crée une nouvelle OwenCommunicationListener:

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

Je serais très souhaitez pouvoir le déployer sur Azure Service Fabric Cluster sans aucune erreur. Passez une bonne journée et merci d'aider.

Répondre

0

Vous devez écrire votre propre classe personnalisée pour configurer le routage et la configuration http pour l'écouteur Owin. Voici la classe que j'utilise pour configurer le routage, essayez avec elle:

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

passe cette classe comme une action à l'instance où vous créez instance de OwinCommunication Listener. Voici mon code

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

Cette approche fonctionne pour moi. Essayez avec cela, nous espérons que cela fonctionnera pour vous aussi

+0

Merci pour la réponse. J'ai déjà écrit ma propre classe de démarrage personnalisée, et l'utilise lorsque je crée une nouvelle instance de OwinCommunicationListener. J'ai ajouté le code dans mon message d'origine – ptr

0

problème est résolu. J'ai modifié ce code:

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