umbraco MVC自定义路由在网址中使用点

时间:2016-06-07 13:29:30

标签: 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, 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>

取自https://average-joe.info/allow-dots-in-url-iis/ 但它不会起作用:(

我的自定义路线如下:

protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        //custom route
        RouteTable.Routes.MapUmbracoRoute(
        "images",
        "logo/{action}/{key}",
        new
        {
            controller = "Image",
            key = UrlParameter.Optional,



        },
      new ProductsRouteHandler(4884));
    }
}
public class ProductsRouteHandler : UmbracoVirtualNodeByIdRouteHandler
{

    public ProductsRouteHandler(int realNodeId) : base(realNodeId)
    {
    }

    protected override IPublishedContent FindContent(RequestContext requestContext, UmbracoContext umbracoContext, IPublishedContent baseContent)
    {
        return base.FindContent(requestContext, umbracoContext, baseContent);
    }
}

我正在使用umbraco vs.7.4.3

1 个答案:

答案 0 :(得分:0)

UmbracoModule ignores Urls with a file extension,因此永远不会为包含文件扩展名的请求创建UmbracoContext。

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

以下是如何解决它,以便我可以在调用VirtualNodeRouteHandler之前调用EnsureContext。

perl -p -e 's/(\s+\d+\.\d+\s+)(\d+.\d+)(.*)/$1.($2\/100).$3/e' new.txt

注意它不是MapUmbracoRoute,而是标准MVC Map Route,以及在返回UmbracoVirtualNodeRouteHandler实例之前调用EnsureContext的标准MVC IRouteHandler。

var route = routes.MapRoute("RouteName", "some/url/file.ext", new
{
    controller = "MyController",
    action = "Index"
}
route.RouteHandler = new UrlWithExtensionHandler();

不是理想的解决方案,而是一个有效的解决方法,直到陈旧的变量问题合并到核心 - 我已经提交了PR来修复它

其他一些人也有同样的问题http://issues.umbraco.org/issue/U4-9384

相关问题