mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Fixing WebApi integration for RTM
--HG-- branch : 1.x extra : transplant_source : %93%0A%C5%5Cd%BA%02%04%C8V%90%ACV%FDa%ED2Q%25%98
This commit is contained in:
@@ -6,4 +6,10 @@ namespace Orchard.Mvc.Routes {
|
|||||||
public int Priority { get; set; }
|
public int Priority { get; set; }
|
||||||
public RouteBase Route { get; set; }
|
public RouteBase Route { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class HttpRouteDescriptor : RouteDescriptor {
|
||||||
|
public string RouteTemplate { get; set; }
|
||||||
|
public object Defaults { get; set; }
|
||||||
|
public object Constraints { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Web.Http;
|
||||||
using System.Web.Routing;
|
using System.Web.Routing;
|
||||||
using Orchard.Environment;
|
using Orchard.Environment;
|
||||||
using Orchard.Environment.Configuration;
|
using Orchard.Environment.Configuration;
|
||||||
@@ -30,8 +31,19 @@ namespace Orchard.Mvc.Routes {
|
|||||||
// this is not called often, but is intended to surface problems before
|
// this is not called often, but is intended to surface problems before
|
||||||
// the actual collection is modified
|
// the actual collection is modified
|
||||||
var preloading = new RouteCollection();
|
var preloading = new RouteCollection();
|
||||||
foreach (var route in routesArray)
|
foreach (var routeDescriptor in routesArray) {
|
||||||
preloading.Add(route.Name, route.Route);
|
|
||||||
|
// extract the WebApi route implementation
|
||||||
|
var httpRouteDescriptor = routeDescriptor as HttpRouteDescriptor;
|
||||||
|
if (httpRouteDescriptor != null) {
|
||||||
|
var httpRouteCollection = new RouteCollection();
|
||||||
|
httpRouteCollection.MapHttpRoute(httpRouteDescriptor.Name, httpRouteDescriptor.RouteTemplate, httpRouteDescriptor.Defaults);
|
||||||
|
routeDescriptor.Route = httpRouteCollection.First();
|
||||||
|
}
|
||||||
|
|
||||||
|
preloading.Add(routeDescriptor.Name, routeDescriptor.Route);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
using (_routeCollection.GetWriteLock()) {
|
using (_routeCollection.GetWriteLock()) {
|
||||||
// existing routes are removed while the collection is briefly inaccessable
|
// existing routes are removed while the collection is briefly inaccessable
|
||||||
@@ -46,7 +58,7 @@ namespace Orchard.Mvc.Routes {
|
|||||||
|
|
||||||
// new routes are added
|
// new routes are added
|
||||||
foreach (var routeDescriptor in routesArray) {
|
foreach (var routeDescriptor in routesArray) {
|
||||||
var shellRoute = new ShellRoute(routeDescriptor.Route, _shellSettings, _workContextAccessor, _runningShellTable);
|
var shellRoute = new ShellRoute(routeDescriptor.Route, _shellSettings, _workContextAccessor, _runningShellTable){IsHttpRoute = routeDescriptor is HttpRouteDescriptor};
|
||||||
_routeCollection.Add(routeDescriptor.Name, shellRoute);
|
_routeCollection.Add(routeDescriptor.Name, shellRoute);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
|
using System.Web.Http.WebHost;
|
||||||
using System.Web.Http.WebHost.Routing;
|
using System.Web.Http.WebHost.Routing;
|
||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
using System.Web.Routing;
|
using System.Web.Routing;
|
||||||
@@ -31,6 +32,7 @@ namespace Orchard.Mvc.Routes {
|
|||||||
|
|
||||||
public string ShellSettingsName { get { return _shellSettings.Name; } }
|
public string ShellSettingsName { get { return _shellSettings.Name; } }
|
||||||
public string Area { get; private set; }
|
public string Area { get; private set; }
|
||||||
|
public bool IsHttpRoute { get; set; }
|
||||||
|
|
||||||
public override RouteData GetRouteData(HttpContextBase httpContext) {
|
public override RouteData GetRouteData(HttpContextBase httpContext) {
|
||||||
// locate appropriate shell settings for request
|
// locate appropriate shell settings for request
|
||||||
@@ -52,7 +54,7 @@ namespace Orchard.Mvc.Routes {
|
|||||||
routeData.RouteHandler = new RouteHandler(_workContextAccessor, routeData.RouteHandler);
|
routeData.RouteHandler = new RouteHandler(_workContextAccessor, routeData.RouteHandler);
|
||||||
routeData.DataTokens["IWorkContextAccessor"] = _workContextAccessor;
|
routeData.DataTokens["IWorkContextAccessor"] = _workContextAccessor;
|
||||||
|
|
||||||
if (_route is HttpWebRoute) {
|
if (IsHttpRoute) {
|
||||||
routeData.Values["IWorkContextAccessor"] = _workContextAccessor; // for WebApi
|
routeData.Values["IWorkContextAccessor"] = _workContextAccessor; // for WebApi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,6 +95,7 @@ namespace Orchard.Mvc.Routes {
|
|||||||
|
|
||||||
public IHttpHandler GetHttpHandler(RequestContext requestContext) {
|
public IHttpHandler GetHttpHandler(RequestContext requestContext) {
|
||||||
var httpHandler = _routeHandler.GetHttpHandler(requestContext);
|
var httpHandler = _routeHandler.GetHttpHandler(requestContext);
|
||||||
|
|
||||||
if (httpHandler is IHttpAsyncHandler) {
|
if (httpHandler is IHttpAsyncHandler) {
|
||||||
return new HttpAsyncHandler(_workContextAccessor, (IHttpAsyncHandler)httpHandler);
|
return new HttpAsyncHandler(_workContextAccessor, (IHttpAsyncHandler)httpHandler);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ namespace Orchard.WebApi.Extensions {
|
|||||||
|
|
||||||
public static string GetAreaName(this IHttpRouteData routeData) {
|
public static string GetAreaName(this IHttpRouteData routeData) {
|
||||||
object area;
|
object area;
|
||||||
if (routeData.Route.DataTokens.TryGetValue("area", out area)) {
|
if (routeData.Route.Defaults.TryGetValue("area", out area)) {
|
||||||
return area as string;
|
return area as string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web.Http.WebHost;
|
using System.Web.Http;
|
||||||
using System.Web.Http.WebHost.Routing;
|
|
||||||
using System.Web.Mvc;
|
|
||||||
using System.Web.Routing;
|
|
||||||
using Orchard.Environment.ShellBuilders.Models;
|
using Orchard.Environment.ShellBuilders.Models;
|
||||||
using Orchard.Mvc.Routes;
|
using Orchard.Mvc.Routes;
|
||||||
|
|
||||||
@@ -24,20 +21,10 @@ namespace Orchard.WebApi.Routes {
|
|||||||
var areaName = item.Key;
|
var areaName = item.Key;
|
||||||
var displayPath = item.Distinct().Single();
|
var displayPath = item.Distinct().Single();
|
||||||
|
|
||||||
yield return new RouteDescriptor {
|
yield return new HttpRouteDescriptor {
|
||||||
Priority = -10,
|
Priority = -10,
|
||||||
Route = new HttpWebRoute(
|
RouteTemplate = "api/" + displayPath + "/{controller}/{id}",
|
||||||
"api/" + displayPath + "/{controller}/{id}",
|
Defaults = new {area = areaName, controller = "api", id = RouteParameter.Optional}
|
||||||
new RouteValueDictionary {
|
|
||||||
{"area", areaName},
|
|
||||||
{"controller", "api"},
|
|
||||||
{"id", ""}
|
|
||||||
},
|
|
||||||
new RouteValueDictionary(),
|
|
||||||
new RouteValueDictionary {
|
|
||||||
{"area", areaName}
|
|
||||||
},
|
|
||||||
HttpControllerRouteHandler.Instance)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user