///
///命名空间选择器 增加参数///
public classNamespaceHttpControllerSelector : IHttpControllerSelector
{private const string NamespaceKey = "namespace";private const string ControllerKey = "controller";private const string defaultNamespaceKey = "defaultnamespace";private readonlyHttpConfiguration _configuration;private readonly Lazy>_controllers;private readonly HashSet_duplicates;publicNamespaceHttpControllerSelector(HttpConfiguration config)
{
_configuration=config;
_duplicates= new HashSet(StringComparer.OrdinalIgnoreCase);
_controllers= new Lazy>(InitializeControllerDictionary);
}private DictionaryInitializeControllerDictionary()
{var dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase);//Create a lookup table where key is "namespace.controller". The value of "namespace" is the last//segment of the full namespace. For example://MyApplication.Controllers.V1.ProductsController => "V1.Products"
IAssembliesResolver assembliesResolver =_configuration.Services.GetAssembliesResolver();
IHttpControllerTypeResolver controllersResolver=_configuration.Services.GetHttpControllerTypeResolver();
ICollection controllerTypes =controllersResolver.GetControllerTypes(assembliesResolver);foreach (Type t incontrollerTypes)
{var segments =t.Namespace.Split(Type.Delimiter);//For the dictionary key, strip "Controller" from the end of the type name.//This matches the behavior of DefaultHttpControllerSelector.
var controllerName = t.Name.Remove(t.Name.Length -DefaultHttpControllerSelector.ControllerSuffix.Length);var key = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", segments[segments.Length - 1], controllerName);//Check for duplicate keys.
if(dictionary.Keys.Contains(key))
{
_duplicates.Add(key);
}else{
dictionary[key]= newHttpControllerDescriptor(_configuration, t.Name, t);
}
}//Remove any duplicates from the dictionary, because these create ambiguous matches.//For example, "Foo.V1.ProductsController" and "Bar.V1.ProductsController" both map to "v1.products".
foreach (string s in_duplicates)
{
dictionary.Remove(s);
}returndictionary;
}//Get a value from the route data, if present.
private static T GetRouteVariable(IHttpRouteData routeData, stringname)
{object result = null;if (routeData.Values.TryGetValue(name, outresult))
{return(T)result;
}return default(T);
}publicHttpControllerDescriptor SelectController(HttpRequestMessage request)
{
IHttpRouteData routeData=request.GetRouteData();if (routeData == null)
{throw newHttpResponseException(HttpStatusCode.NotFound);
}//Get the namespace and controller variables from the route data.
string namespaceName = GetRouteVariable(routeData, NamespaceKey);if (namespaceName == null)
{if (routeData.Route.Defaults != null &&routeData.Route.Defaults.Keys.Contains(defaultNamespaceKey))
{
namespaceName=routeData.Route.Defaults[defaultNamespaceKey].ToString();
}else{throw newHttpResponseException(HttpStatusCode.NotFound);
}
}string controllerName = GetRouteVariable(routeData, ControllerKey);if (controllerName == null)
{throw newHttpResponseException(HttpStatusCode.NotFound);
}//Find a matching controller.
string key = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", namespaceName, controllerName);
HttpControllerDescriptor controllerDescriptor;if (_controllers.Value.TryGetValue(key, outcontrollerDescriptor))
{returncontrollerDescriptor;
}else if(_duplicates.Contains(key))
{throw newHttpResponseException(
request.CreateErrorResponse(HttpStatusCode.InternalServerError,"Multiple controllers were found that match this request."));
}else{throw newHttpResponseException(HttpStatusCode.NotFound);
}
}public IDictionaryGetControllerMapping()
{return_controllers.Value;
}
}