umbraco MVC自定义路由使用url中的点

umbraco MVC自定义路由使用url中的点,umbraco,umbraco7,custom-routes,Umbraco,Umbraco7,Custom Routes,我在url umbraco MVC自定义路由中使用点时遇到问题。 /logo/images/image.jpg?width=100会出现以下错误: [NullReferenceException: Object reference not set to an instance of an object.] Umbraco.Web.Mvc.UmbracoVirtualNodeByIdRouteHandler.FindContent(RequestContext requestContext,

我在url umbraco MVC自定义路由中使用点时遇到问题。 /logo/images/image.jpg?width=100会出现以下错误:

[NullReferenceException: Object reference not set to an instance of an object.]
   Umbraco.Web.Mvc.UmbracoVirtualNodeByIdRouteHandler.FindContent(RequestContext requestContext, UmbracoContext umbracoContext) +18
   Umbraco.Web.Mvc.UmbracoVirtualNodeRouteHandler.GetHttpHandler(RequestContext requestContext) +48
   System.Web.Routing.UrlRoutingModule.PostResolveRequestCache(HttpContextBase context) +11987058
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +141
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +91
/logo/images/image.jpg/?width=100

行得通,但这对我来说不是个好办法。 我试着在webconfig中添加这个

<location path="logo">
        <!-- This only applies it to the relevant path and keeps the protection in place for elsewhere -->
        <system.web>
            <httpHandlers>
                <add path="/images/*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" />
            </httpHandlers>
        </system.web>
        <!-- Required for IIS 7.0+ -->
        <system.webServer>
            <modules runAllManagedModulesForAllRequests="true" />
            <validation validateIntegratedModeConfiguration="false" />
            <handlers>
                <add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" />
            </handlers>
        </system.webServer>
    </location>
我正在使用umbraco vs.7.4.3

的umbraco模块,因此永远不会为包含文件扩展名的请求创建umbraco上下文

您可以使用UmbracoContext.EnsureContext创建上下文,但如果在处理程序的FindContent方法中执行此操作,则会遇到此异常。这是由umbracoVirtualNodeHandler上的一个过时变量引起的,该变量持有对空UmbracoContext的引用,并且不会拾取新创建的上下文

下面是如何解决这个问题的,这样我就可以在调用VirtualNodeHandler之前调用EnsureContext

var route = routes.MapRoute("RouteName", "some/url/file.ext", new
{
    controller = "MyController",
    action = "Index"
}
route.RouteHandler = new UrlWithExtensionHandler();
请注意,它不是MapUmbracoRoute,而是标准的MVC映射路由和标准的MVC IRouteHandler,它在返回UmbracoVirtualNodeRouteHandler实例之前调用EnsureContext

public class UrlWithExtensionHandler : IRouteHandler
{
    #region Implementation of IRouteHandler

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        // init umbraco context
        var httpContext = new HttpContextWrapper(HttpContext.Current);

        UmbracoContext.EnsureContext(
            httpContext,
            ApplicationContext.Current,
            new WebSecurity(httpContext, ApplicationContext.Current),
            UmbracoConfig.For.UmbracoSettings(),
            UrlProviderResolver.Current.Providers,
            false);

        var handler = new UrlWithExtensionVirtualNodeRouteHandler();
        return handler.GetHttpHandler(requestContext);
    }

    #endregion
}

public class UrlWithExtensionVirtualNodeRouteHandler : UmbracoVirtualNodeRouteHandler
{
    protected override IPublishedContent FindContent(RequestContext requestContext,
            UmbracoContext umbracoContext)
    {
        return someIPublishedContent;
    }
}
这不是一个理想的解决方案,而是一个有效的解决方案,直到过时的变量问题被合并到core中——我已经提交了一份PR来修复它

其他一些人在UmbracoModule中也遇到了同样的问题,因此永远不会为包含文件扩展名的请求创建UmbracoContext

您可以使用UmbracoContext.EnsureContext创建上下文,但如果在处理程序的FindContent方法中执行此操作,则会遇到此异常。这是由umbracoVirtualNodeHandler上的一个过时变量引起的,该变量持有对空UmbracoContext的引用,并且不会拾取新创建的上下文

下面是如何解决这个问题的,这样我就可以在调用VirtualNodeHandler之前调用EnsureContext

var route = routes.MapRoute("RouteName", "some/url/file.ext", new
{
    controller = "MyController",
    action = "Index"
}
route.RouteHandler = new UrlWithExtensionHandler();
请注意,它不是MapUmbracoRoute,而是标准的MVC映射路由和标准的MVC IRouteHandler,它在返回UmbracoVirtualNodeRouteHandler实例之前调用EnsureContext

public class UrlWithExtensionHandler : IRouteHandler
{
    #region Implementation of IRouteHandler

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        // init umbraco context
        var httpContext = new HttpContextWrapper(HttpContext.Current);

        UmbracoContext.EnsureContext(
            httpContext,
            ApplicationContext.Current,
            new WebSecurity(httpContext, ApplicationContext.Current),
            UmbracoConfig.For.UmbracoSettings(),
            UrlProviderResolver.Current.Providers,
            false);

        var handler = new UrlWithExtensionVirtualNodeRouteHandler();
        return handler.GetHttpHandler(requestContext);
    }

    #endregion
}

public class UrlWithExtensionVirtualNodeRouteHandler : UmbracoVirtualNodeRouteHandler
{
    protected override IPublishedContent FindContent(RequestContext requestContext,
            UmbracoContext umbracoContext)
    {
        return someIPublishedContent;
    }
}
这不是一个理想的解决方案,而是一个有效的解决方案,直到过时的变量问题被合并到core中——我已经提交了一份PR来修复它


其他一些人也有同样的问题

您的示例URL是一个.jpg文件扩展名,Umbraco包含一个对ImageProcessor的依赖项,它将处理动态调整大小的图像,我的URL是否适合您的要求?是的,我已经在imagecontroller中使用ImageProcessor来调整图片大小。图片位于Web服务器外部,我希望调整大小的工作方式与ImageResize.NET类似。除了路由不允许在结尾使用点外,该代码将正常工作。您的示例URL用于.jpg文件扩展名,Umbraco包含一个对ImageProcessor的依赖项,该依赖项将处理动态调整大小的图像,我的代码是否适合您的要求?是的,我已经在imagecontroller中使用ImageProcessor调整图片大小。图片位于Web服务器外部,我希望调整大小的工作方式与ImageResize.NET类似。该代码将工作,除了路由不允许在最后使用点。