我怎样才能创建域名wabapi路由? [英] How can I create a domain wabapi route?
本文介绍了我怎样才能创建域名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屋!
查看全文