繁体   English   中英

简化WCF4 RESTful服务路由的配置

[英]Simplifying configuration of WCF4 RESTful service routes

“ WCF REST模板40(CS)”项目模板中的默认Global.asax.cs文件以及我在网上看到的每个教程都包含以下方法的一种变体:

private void RegisterRoutes()
{
    // Edit the base address of Service1 by replacing the "Service1" string below
    RouteTable.Routes.Add(new ServiceRoute("Service1", new WebServiceHostFactory(), typeof(Service1)));
}

WebApplication本身应该能够发现哪些服务可用并根据约定或元数据应用路由时,以这种方式管理服务路由似乎很麻烦。

问题

  1. 除了默认值以外,还有没有一种内置的方法来定义服务路由(可以在web.config中配置,也可以编译到服务本身)?
  2. 使用此模板的其他人是否始终遵循提供的模型,还是其他人提出了更好的方法?

拟议的解决方案

迁移了我对答案的建议解决方案

我想我必须假设沉默就是接受。 这是我的解决方案(最初来自我的问题):

假设没有更好的内置或其他可用的方法(因为我什么也没找到),我尝试执行此操作涉及定义一个属性:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class ServiceRouteAttribute : Attribute
{
    public string RoutePrefix { get; set; }
    public Type ServiceFactoryType { get; set; }

    public ServiceHostFactoryBase ServiceFactory
    {
        get
        {
            if (ServiceFactoryType == null || !ServiceFactoryType.IsRelated(typeof(ServiceHostFactoryBase)))
                return null;

            return Activator.CreateInstance(ServiceFactoryType) as ServiceHostFactoryBase;
        }
    }

    public ServiceRouteAttribute() : this(string.empty) { }
    public ServiceRouteAttribute(string routePrefix) : this(routePrefix, typeof(WebServiceHostFactory)) { }
    public ServiceRouteAttribute(string routePrefix, Type serviceFactoryType)
    {
        RoutePrefix = routePrefix;
        ServiceFactoryType = serviceFactoryType;
    }
}

用于装饰应公开的每个服务协定,并将默认的RegisterRoutes更改为:

private void RegisterRoutes()
{
    // `TypeHelper.GetTypes().FilterTypes<T>` will find all of the types in the
    // current AppDomain that:
    // - Implement T if T is an interface
    // - Are decorated with T if T is an attribute
    // - Are children of T if T is anything else
    foreach (var type in TypeHelper.GetTypes()
                                   .FilterTypes<ServiceRouteAttribute>())
    {
        // routeAttrs should never be null or empty because only types decorated
        // with `ServiceRouteAttribute` should ever get here.
        // `GetAttribute<T>` is my extension method for `MemberInfo` which returns all
        // decorations of `type` that are T or children of T
        var routeAttrs = type.GetAttributes<ServiceRouteAttribute>();

        foreach (var routeAttr in routeAttrs)
        {
            // Some dupe and error checking

            var routePrefix = routeAttr.RoutePrefix;
            if (string.IsNullOrEmpty(routePrefix))
                routePrefix = type.Name;

            RouteTable.Routes.Add(new ServiceRoute(routePrefix, 
                                                   routeAttr.ServiceFactory,
                                                   type));
        }
    }
}

这似乎可行,并且不太麻烦,因为它只发生在Application_Start ,但是我是第一次使用WCF4构建RESTful Web服务,所以我不知道它可能引起什么问题。

如果有人想出一种更优雅的解决方法,我很乐意考虑其他选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM