2017-09-21 104 views
0

我正在与Owin一起开发Service Fabric项目,并且遇到了将其部署到云中的问题。我已经搜索了同样的问题,但我只找到了一个答案,告诉群集中的错误告诉代码出错了。我已经按照微软Owin教程介绍了如何编写失败的方法,但没有运气。 我可以直接从Visual Studio在Localhost上运行项目,但是当我将它部署到Azure中的Service Fabric集群时,问题就会出现。我有5个节点的群集正在运行,当我部署到它时,它会在2分钟后发出警告,5分钟后会发生错误。该应用程序的状态是“inbuild”。 Image of warningImage of error与Owin部署Service Fabric项目到Azure服务Fabric群集的问题

我有两个服务,并从我的群集的错误给出了这两种方法的错误(同样的方法在每个服务(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服务Fabric群集。祝你有美好的一天,并感谢您的帮助。

回答

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)) 
     //}; 
    } 
相关问题