2016-06-07 66 views
1

我在使用URL umbraco MVC自定義路由中的點時遇到了問題。 /logo/images/image.jpg?width=100給出了以下錯誤:umbraco在URL中使用點的MVC自定義路由

[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

+0

您的示例URL適用於.jpg文件擴展名,Umbraco包含對ImageProcessor的依賴性,它可以動態調整圖像大小並適合您的需求? – Anth12

+0

是的,我已經在imagecontroller中使用ImageProcessor來調整圖片大小。這些圖片位於網絡服務器之外,我希望調整大小的方式與ImageResize.NET類似。 該代碼將工作,除了路由不會允許在最後使用點。 –

回答

0

UmbracoModule ignores Urls with a file extension,所以UmbracoContext永遠不會爲一個請求創建包含文件擴展名。

您可以使用UmbracoContext.EnsureContext創建上下文,但是如果您在處理程序的FindContent方法中執行此操作,則會遇到此異常。這是由UmbracoVirtualNodeRouteHandler的line 18上的一個陳舊變量持有對UmbracoContext的引用而引發的,並且不會拾取新創建的上下文。

下面是如何解決它,所以我可以在調用VirtualNodeRouteHandler之前調用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; 
    } 
} 

不是一個理想的解決方案,但一個有效的解決方法,直到陳舊變量問題被合併到核心 - 我已經提交一個PR來修復它

還有幾個國家也有同樣的問題也http://issues.umbraco.org/issue/U4-9384