我怎样才能创建域名wabapi路由? [英] How can I create a domain wabapi route?

查看:124
本文介绍了我怎样才能创建域名wabapi路由?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

出于某种原因,我想创建这样的webapi路由模板:

 HttpConfiguration.Routes.Add(   DomainDefaultApi new  DomainHttpRoute(  {controller} .12345.com  api / {id} new  System.Web.Http.Routing.HttpRouteValueDictionary( new  {id = RouteParameter.Optional}))); 



我创建DomainHttpRoute类:

  public   class  DomainHttpRoute:HttpRoute 
{
public string 域{ get ; set ; }

public DomainHttpRoute( string domain): this (domain, null null null null null ){}

public DomainHttpRoute( string domain, string routeTemplate): this (domain,routeTemplate, null null null null ){}

public DomainHttpRoute( string domain, string routeTemplate,HttpRouteValueDictionary默认值): this (domain,routeTemplate,defaults, null null null ){}

public DomainHttpRoute( string domain, string routeTemplate,HttpRouteValueDictionary defaults,HttpRouteValueDictionary constraints): this (domain,routeTemplate,defaults,constraints, null null ){}

public DomainHttpRoute( string domain, string routeTemplate,HttpRouteValueDictionary defaults,HttpRouteValueDictionary constraints,HttpRouteValueDictionary dataTokens): this (domain,routeTemplate,defaults,constraints,dataTokens, null ){}

public DomainHttpRoute( string domain, string routeTemplate,HttpRouteValueDictionary defaults,HttpRouteValueDictionary constraints,HttpRouteValueDictionary dataTokens,HttpMessageHandler handler)
base (routeTemplate,defaults,constraints,dataTokens, new DomainHttpMessageHandler())
{
Domain = domain;
}

public 覆盖 IHttpRouteData GetRouteData( string virtualPathRoot,HttpRequestMessage request)
{
_DomainRegex = _CreateRegex( this .Domain);
string requestDomain = request.Headers.Host;
if string .IsNullOrEmpty(requestDomain))
requestDomain = request.RequestUri 。主办;
else if (requestDomain.IndexOf( > 0
requestDomain = requestDomain.Substring( 0 ,requestDomain.IndexOf( ));
匹配domainMatch = _DomainRegex.Match(requestDomain);
IHttpRouteData data = null ;
if (domainMatch.Success)
{
data = base .GetRouteData(virtualPathRoot,request);
if (data!= null
{
for int i = 0 ; i < domainMatch.Groups.Count; i ++)
{
Group group = domainMatch。基团[I];
if group .Success)
{
string key = _DomainRegex.GroupNameFromNumber(i);
if (!string.IsNullOrEmpty(key)&&!char.IsNumber(key, 0 )&&!string.IsNullOrEmpty( group .Value))
data.Values [key] = 。价值;
}
}
}
}
返回数据;
}

public 覆盖 IHttpVirtualPathData GetVirtualPath(HttpRequestMessage请求,IDictionary< ;字符串,对象>值)
{
返回 base .GetVirtualPath(请求,_RemoveDomainTokens(values));
}

受保护 覆盖 bool ProcessConstraint(HttpRequestMessage请求,对象约束,字符串 parameterName,HttpRouteValueDictionary值, HttpRouteDirection routeDirection)
{
object obj2;
IHttpRouteConstraint constraint2 =约束 as IHttpRouteConstraint;
if (constraint2!= null
return constraint2.Match(request, this ,parameterName,values,routeDirection);
string str = constraint as string ;
if (str == null
throw new InvalidOperationException( ProcessConstraint);
values.TryGetValue(parameterName, out obj2);
string input = Convert.ToString(obj2,CultureInfo.InvariantCulture);
string pattern = ^( + str + )$;
return Regex.IsMatch(input,pattern,RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
}

private Regex _DomainRegex;
private Regex _PathRegex;

private Regex _CreateRegex( string source)
{
source = source.Replace( / @ \ /?);
source = source.Replace( @ \。?);
source = source.Replace( - @ \ - ?);
source = source.Replace( { @ (?<);
source = source.Replace( } @ >( \w *)));
return new 正则表达式( ^ + source + $);
}

private IDictionary< string,object> _RemoveDomainTokens(IDictionary< string,object> values)
{
Regex tokenRegex = new 正则表达式( @ ({\ w *})* - ?\。?\ /?({\ w *})* - ?\。?\\ \\/?({\万维网*})* - ???\ /({\w *})* - ?\ /({\w *})* - ??????\ /({ \万维网*})*-?\。 \?/({\w *})* - \ /({\w *})* - \ /)??????;
匹配tokenMatch = tokenRegex.Match(Domain);
for int i = 0 ; i < tokenMatch.Groups.Count; i ++)
{
Group group = tokenMatch.Groups [i];
if group .Success)
{
string key = group .Value.Replace( < span class =code-string> {
string .Empty).Replace( } string .Empty);
if (values.ContainsKey(key))
values.Remove(key);
}
}
返回值;
}

}



没有错误,但它无效,找不到controllerName。

谁可以帮助我?

解决方案

;
return Regex.IsMatch(input,pattern,RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
}

private Regex _DomainRegex;
private Regex _PathRegex;

private Regex _CreateRegex( string source)
{
source = source.Replace( / @ \ /?);
source = source.Replace( @ \。? );
source = source.Replace( - @ \ - ?);
source = source.Replace( { @ (?<);
source = source.Replace( } @ >( \w *)));
return new 正则表达式( ^ + source +


);
}

private IDictionary< string,object> _RemoveDomainTokens(IDictionary< string,object> values)
{
Regex tokenRegex = new 正则表达式( @ ({\ w *})* - ?\。?\ /?({\ w *})* - ?\。?\\ \\/?({\万维网*})* - ???\ /({\w *})* - ?\ /({\w *})* - ??????\ /({ \万维网*})*-?\。 \?/({\w *})* - \ /({\w *})* - \ /)??????;
匹配tokenMatch = tokenRegex.Match(Domain);
for int i = 0 ; i < tokenMatch.Groups.Count; i ++)
{
Group group = tokenMatch.Groups [i];
if group .Success)
{
string key = group .Value.Replace( < span class =code-string> {
string .Empty).Replace( } string .Empty);
if (values.ContainsKey(key))
values.Remove(key);
}
}
返回值;
}

}



没有错误,但它无效,找不到controllerName。

谁可以帮助我?


For some reason,I want to create webapi route template like this:

HttpConfiguration.Routes.Add("DomainDefaultApi", new DomainHttpRoute("{controller}.12345.com", "api/{id}", new System.Web.Http.Routing.HttpRouteValueDictionary(new { id = RouteParameter.Optional })));


I create the DomainHttpRoute class:

public class DomainHttpRoute : HttpRoute
{
    public string Domain { get; set; }

    public DomainHttpRoute(string domain) : this(domain, null, null, null, null, null) { }

    public DomainHttpRoute(string domain, string routeTemplate) : this(domain, routeTemplate, null, null, null, null) { }

    public DomainHttpRoute(string domain, string routeTemplate, HttpRouteValueDictionary defaults) : this(domain, routeTemplate, defaults, null, null, null) { }

    public DomainHttpRoute(string domain, string routeTemplate, HttpRouteValueDictionary defaults, HttpRouteValueDictionary constraints) : this(domain, routeTemplate, defaults, constraints, null, null) { }

    public DomainHttpRoute(string domain, string routeTemplate, HttpRouteValueDictionary defaults, HttpRouteValueDictionary constraints, HttpRouteValueDictionary dataTokens) : this(domain, routeTemplate, defaults, constraints, dataTokens, null) { }

    public DomainHttpRoute(string domain, string routeTemplate, HttpRouteValueDictionary defaults, HttpRouteValueDictionary constraints, HttpRouteValueDictionary dataTokens, HttpMessageHandler handler)
        : base(routeTemplate, defaults, constraints, dataTokens, new DomainHttpMessageHandler())
    {
        Domain = domain;
    }

    public override IHttpRouteData GetRouteData(string virtualPathRoot, HttpRequestMessage request)
    {
        _DomainRegex = _CreateRegex(this.Domain);
        string requestDomain = request.Headers.Host;
        if (string.IsNullOrEmpty(requestDomain))
            requestDomain = request.RequestUri.Host;
        else if (requestDomain.IndexOf(":") > 0)
            requestDomain = requestDomain.Substring(0, requestDomain.IndexOf(":"));
        Match domainMatch = _DomainRegex.Match(requestDomain);
        IHttpRouteData data = null;
        if (domainMatch.Success)
        {
            data = base.GetRouteData(virtualPathRoot, request);
            if (data != null)
            {
                for (int i = 0; i < domainMatch.Groups.Count; i++)
                {
                    Group group = domainMatch.Groups[i];
                    if (group.Success)
                    {
                        string key = _DomainRegex.GroupNameFromNumber(i);
                        if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0) && !string.IsNullOrEmpty(group.Value))
                            data.Values[key] = group.Value;
                    }
                }
            }
        }
        return data;
    }

    public override IHttpVirtualPathData GetVirtualPath(HttpRequestMessage request, IDictionary<string, object> values)
    {
        return base.GetVirtualPath(request, _RemoveDomainTokens(values));
    }

    protected override bool ProcessConstraint(HttpRequestMessage request, object constraint, string parameterName, HttpRouteValueDictionary values, HttpRouteDirection routeDirection)
    {
        object obj2;
        IHttpRouteConstraint constraint2 = constraint as IHttpRouteConstraint;
        if (constraint2 != null)
            return constraint2.Match(request, this, parameterName, values, routeDirection);
        string str = constraint as string;
        if (str == null)
            throw new InvalidOperationException("ProcessConstraint");
        values.TryGetValue(parameterName, out obj2);
        string input = Convert.ToString(obj2, CultureInfo.InvariantCulture);
        string pattern = "^(" + str + ")$";
        return Regex.IsMatch(input, pattern, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
    }

    private Regex _DomainRegex;
    private Regex _PathRegex;

    private Regex _CreateRegex(string source)
    {
        source = source.Replace("/", @"\/?");
        source = source.Replace(".", @"\.?");
        source = source.Replace("-", @"\-?");
        source = source.Replace("{", @"(?<");
        source = source.Replace("}", @">(\w*))");
        return new Regex("^" + source + "$");
    }

    private IDictionary<string, object> _RemoveDomainTokens(IDictionary<string, object> values)
    {
        Regex tokenRegex = new Regex(@"({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?");
        Match tokenMatch = tokenRegex.Match(Domain);
        for (int i = 0; i < tokenMatch.Groups.Count; i++)
        {
            Group group = tokenMatch.Groups[i];
            if (group.Success)
            {
                string key = group.Value.Replace("{", string.Empty).Replace("}", string.Empty);
                if (values.ContainsKey(key))
                    values.Remove(key);
            }
        }
        return values;
    }

}


there is no error,but it cannot works,find no controllerName.
Who can help me?

解决方案

"; return Regex.IsMatch(input, pattern, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); } private Regex _DomainRegex; private Regex _PathRegex; private Regex _CreateRegex(string source) { source = source.Replace("/", @"\/?"); source = source.Replace(".", @"\.?"); source = source.Replace("-", @"\-?"); source = source.Replace("{", @"(?<"); source = source.Replace("}", @">(\w*))"); return new Regex("^" + source + "


"); } private IDictionary<string, object> _RemoveDomainTokens(IDictionary<string, object> values) { Regex tokenRegex = new Regex(@"({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?({\w*})*-?\.?\/?"); Match tokenMatch = tokenRegex.Match(Domain); for (int i = 0; i < tokenMatch.Groups.Count; i++) { Group group = tokenMatch.Groups[i]; if (group.Success) { string key = group.Value.Replace("{", string.Empty).Replace("}", string.Empty); if (values.ContainsKey(key)) values.Remove(key); } } return values; } }


there is no error,but it cannot works,find no controllerName.
Who can help me?


这篇关于我怎样才能创建域名wabapi路由?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆