源:https://gist.github.com/sniffdk/7600822System.ArgumentNullException:值不能爲空 - 上一把umbraco HttpContext的保存和發佈
下面的代碼是由活動的HTTP請求之外運行,所以我需要模擬的HTTP上下文。
我已經嘲笑了HTTP上下文,像這樣:
public class GetUmbracoServiceMockedHttpContext : IGetUmbracoService
{
private UmbracoHelper umbracoHelper;
public T GetService<T>()
where T : IService
{
UmbracoContext context = UmbracoContext.Current;
if (context == null)
{
var dummyHttpContext = new HttpContextWrapper(new HttpContext(new SimpleWorkerRequest("blah.aspx", "", new StringWriter())));
context = UmbracoContext.EnsureContext(
dummyHttpContext,
ApplicationContext.Current,
new WebSecurity(dummyHttpContext, ApplicationContext.Current),
UmbracoConfig.For.UmbracoSettings(),
UrlProviderResolver.Current.Providers,
false);
}
var serviceTypeProperty = context.Application.Services
.GetType()
.GetProperties()
.SingleOrDefault(x => x.PropertyType == typeof(T));
if (serviceTypeProperty == null)
{
return default(T);
}
return (T)serviceTypeProperty
.GetValue(context.Application.Services);
}
}
我注入這IGetUmbracoService service
到控制器,並呼籲:
service.GetService<IContentService>().SaveAndPublishWithStatus(item);
...出現以下錯誤。
System.ArgumentNullException:值不能爲空。參數名: 的HttpContext在System.Web.HttpContextWrapper..ctor(HttpContext的 的HttpContext)在 Umbraco.Web.SingletonHttpContextAccessor.get_Value()在 Umbraco.Web.RequestLifespanMessagesFactory.Get()在 Umbraco.Core.Services.ContentService .SaveAndPublishDo(IContent 內容,的Int32用戶id,布爾raiseEvents)在 Umbraco.Core.Services.ContentService.Umbraco.Core.Services.IContentServiceOperations.SaveAndPublish(IContent 內容,的Int32用戶id,布爾raiseEvents)在 Umbraco.Core.Services .ContentService.SaveAndPublishWithStatus(IContent content,Int32 userId,Boolean raiseEvents)
如何在不使用frowned upon HttpContext.Current = ...
的情況下模擬http上下文?
我承擔相關的問題來自:
RequestLifespanMessagesFactory.cs
而這又是調用了這樣一個實現:
SingletonHttpContextAccessor.cs
任何特別的事情你認爲可能與問題有關?我無法在這裏找到任何與我的問題相關的東西......雖然我確實注意到他們確實使用了保存命令。 – Jimmyt1988
整個項目是一個很好的解決方案來運行不帶HttpContext的Umbraco API--所以如果你看看擴展了「普通」UmbracoApplicationBase的ConsoleApplicationBase這樣的類,你將會看到很多東西,工作 - 所以我會建議它不像嘲弄HttpContext那麼簡單。我確實使用上述項目作爲基礎,nad有一個控制檯應用程序,它能夠使用Umbraco API來處理當前內容(我們用它來實現自動Umbraco升級工具)。 – user369142
啊,謝謝。我明白了,所以你從UmbracoApplicationBase繼承的事實意味着你可以返回你自己的BootManager,這又可以讓你覆蓋CreateServiceContext。 – Jimmyt1988