自托管(OWIN)Web API中的区域

时间:2016-08-09 09:58:57

标签: asp.net asp.net-web-api owin

我正在设置一个新的Web应用程序。我们有服务执行连续的后台操作(CQRS预测),这就是我们在Windows服务中托管它们的原因。我们也希望使用这些服务来托管相应的Web API(否则我们无法提供内存中的预测)。

此外,我们希望SignalR支持在更新投影时通知客户。我们有一个单独的ASP.NET MVC应用程序,因为我们使用Razor视图进行模板化。

我们希望将Web API分成几个区域 - 类似于它在ASP.NET(MVC)应用程序中的可行方式 - 每个有界上下文都有一个区域。例如http://localhost:8080/Orders/api/{Controller}/{id}http://localhost:8080/Foo/api/{Controller}/{id}

稍后我们还希望将控制器,投影,模型等放在不同的组件中。同样,每个上下文一个

是否可以在自托管Web API项目中定义区域?是否可以将它们路由到特定组件的控制器?

1 个答案:

答案 0 :(得分:1)

感谢https://blogs.msdn.microsoft.com/webdev/2013/03/07/asp-net-web-api-using-namespaces-to-version-web-apis/中的文章,我已经解决了这个问题。

我必须实现自己的IHttpControllerSelector并替换Startup.cs中的默认值,如下所示:

/// <summary>
/// OWIN startup class
/// </summary>
public class Startup
{
    /// <summary>
    /// Owin configuration
    /// </summary>
    /// <param name="app">App builder</param>
    public void Configuration(IAppBuilder app)
    {
        // We might have to resolve the referenced assemblies here or else we won't find them. This is a quick and dirty way to make sure that the assembly containing the controller has been loaded

        var x = typeof(CarRental.Reservations.Application.Read.Web.FooController);

        // Configure Web API for self-host. 
        var config = new HttpConfiguration();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{boundedcontext}/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // Enable routing via bounded context
        config.Services.Replace(typeof(IHttpControllerSelector), new BoundedContextControllerSelector(config)); 

        app.UseWebApi(config);

        // Configure SignalR
        app.UseCors(CorsOptions.AllowAll);
        app.MapSignalR();
    }
}

BoundedContextControllerSelectorIHttpControllerSelector的实现,非常接近示例中的代码:https://aspnet.codeplex.com/SourceControl/changeset/view/dd207952fa86#Samples/WebApi/NamespaceControllerSelector/NamespaceHttpControllerSelector.cs

我使用命名空间来确定有界上下文,现在每个上下文都清楚地分离了web api端点:)