我们刚刚建立了一个内部部署的MS Service Fabric集群。我有一些WebAPI,我想主持它。我正在寻找有关如何使用我们的标准4.5 WebAPI并在Service Fabric中托管它们的资源,而无需创建Service Fabric项目并进行迁移;这似乎太复杂了。
我查看了一些Service Fabric示例项目,似乎所有项目都与Service Fabric紧密结合。我的目标是让这些应用程序不知道Service Fabric。
非常感谢任何信息链接,谢谢!
答案 0 :(得分:2)
我们这样做了:
秘诀是:当你创建一个自托管的web api时,你通常会创建一个控制台应用程序,比如asp.net docs。使用服务结构,您可以使用类似于ConsoleApplication的ServiceFabricService替换控制台,但在这种情况下将是无状态服务。
在这种情况下,我们为HttpListenerService使用了无状态服务,如果需要StateFull服务,则需要重构Api以使用可靠的集合。
Vaclac的同事,为此创建了一个很好的教程: https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-services-communication-webapi/
答案 1 :(得分:0)
如果它是带有自托管Web服务器的独立Web应用程序(例如,Katana,而不是IIS),那么您只需将其作为Guest Executable运行。
如果它不是自托管的并且需要运行单独的Web服务器(如IIS),那么您可以查看在Container中运行它。
答案 2 :(得分:0)
我遇到了同样的问题,并通过在Startup()类中的HttpConfiguration对象上使用DependencyResolver.GetService()方法来解决它。创建一个新的Service Fabric Stateless / Statefull WebAPI项目。在Startup()类中,添加以下代码:
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)
{
// Configure Web API for self-host.
HttpConfiguration config = new HttpConfiguration();
// Allow custom routes in controller attributes.
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "{controller}/{action}/{id}",
defaults: new { controller = "API", action = "HealthCheck", id = RouteParameter.Optional }
);
//inject controllers here
config.DependencyResolver.GetService(typeof({{YourWebAPIRootNamespace}}.Controllers.APIController));
appBuilder.UseWebApi(config);
}
}
这允许您将现有API部署到Service Fabric中,而无需将整个代码库迁移到新项目。不要忘记使用web.config中的所有适用设置更新新项目中的app.config。
此处的完整博客帖子http://thenameisirrelevant.com/hosting-an-existing-webapi-in-service-fabric