[英]Property cannot be deserialized because the member 'properties' is not public
[英]Error occurred in deployment step 'Retract Solution': <CLASS> cannot be deserialized because it does not have a public default constructor
我以本教程為例創建計時器作業。
這是我的計時器作業代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint;
namespace CalcAnnualConsumptionTotals
{
public class GroupAnnualConsumption : SPJobDefinition
{
public GroupAnnualConsumption() : base() {} // <-- public default constructor
public GroupAnnualConsumption(string jobName, SPService service,
SPServer server, SPJobLockType lockType)
: base(jobName, service, server, lockType)
{
this.Title = "Group Annual Consumption";
}
public GroupAnnualConsumption(string jobName, SPWebApplication webapp)
: base(jobName, webapp, null, SPJobLockType.ContentDatabase)
{
this.Title = "Group Annual Consumption";
}
public override void Execute(Guid targetInstanceId)
{
.....
}
}
}
如您所見,我具有默認的公共構造函數,但是當我嘗試部署它時,它顯示以下錯誤:
部署步驟“撤回解決方案”中發生錯誤:CalcAnnualConsumptionTotals.GroupAnnualConsumption無法反序列化,因為它沒有公共默認構造函數
當我第一次遇到此錯誤時,我實際上忘記了添加默認構造函數。 但是即使添加了它也會向我顯示錯誤。 我認為我的最初嘗試會部分成功,從而導致部署。 但是,即使通過管理中心或Get-SPTimerJob
我也找不到它。
任何想法為什么會出現此錯誤。
好的,這就是問題所在。 正如我在問題中已經提到的
...當我第一次遇到此錯誤時,我實際上忘記了添加默認構造函數。...
因此發生的事情是該解決方案已部署到SharePoint上,但該錯誤也是在第一時間出現的(無論是否是相同的錯誤,都無法回憶)。 下次當我更正錯誤並嘗試部署時,它向我顯示了錯誤:
部署步驟“撤回解決方案 ”中發生錯誤:CalcAnnualConsumptionTotals.GroupAnnualConsumption無法反序列化,因為它沒有公共默認構造函數
收回解決方案是此處的關鍵字。 當SharePoint嘗試部署更新的解決方案時,它不得不撤回舊的解決方案,但是由於(舊)解決方案中的錯誤而無法撤消。
因此,我去了管理 中心的“ 管理農場解決方案”並刪除了解決方案。 然后,當我部署時,它起作用了。
上面的方法對我不起作用,但是我確實找到了解決方案,並希望將其發布在這里,以防其他人遇到相同的情況。
就我而言,至少在最初無法通過“管理服務器場解決方案”頁面進行卸載。
我必須首先通過添加默認構造函數來修復代碼。 然后,我不得不使用gacutil將文件GAC起來。 然后,我使用iisreset / restart重置IIS。 直到那時,我才能夠在“管理農場解決方案”頁面中請求撤回解決方案。
不幸的是,它就坐在那兒。 因此,要解決該問題,我做了:
然后,我得以重新部署並重新開始工作。
從這里 :
您還需要從您的計時器作業定義的構造函數之一調用Web服務關聯構造函數或服務應用程序關聯構造函數。 請記住,您的計時器作業必須與這兩個實體之一相關聯。 只能從SPJobDefinition類上的構造函數創建關聯,因此您的一個構造函數必須與對適當的基本構造函數的調用相關聯。
似乎您需要從默認構造函數中設置這兩個屬性之一。 如果可以將值傳遞給其他構造函數之一,那將是最簡單的。
編輯:為澄清jobname
,我認為將jobname
參數傳遞給基本構造函數就足夠了。 如果您無權訪問該值(它是硬編碼的,還是在配置文件中?),則可能必須重新組織事物。
就是說,我從未與Sharepoint合作過,所以我可能會不在基地。
看來SharePoint Job的“舊版本”仍然可以運行。
部署SharePoint作業時,必須重新啟動SharePoint Timer服務 。
如何通過PowerShell重新啟動SharePoint Timer服務
function Restart-SPTimerV4()
{
[array]$servers= Get-SPServer | ? {$_.Role -eq "Application"}
$farm = Get-SPFarm
foreach ($server in $servers)
{
Write-Host "Restarting Timer Job on $server"
$Service = Get-WmiObject -Computer $server.name Win32_Service -Filter "Name='SPTimerV4'"
if ($Service -ne $null)
{
$Service.InvokeMethod('StopService',$null)
Start-Sleep -s 7
$service.InvokeMethod('StartService',$null)
Start-Sleep -s 7
Write-Host "Timer Job successfully restarted on $server"
}
else
{
write-host -ForegroundColor Yellow "Could not find SharePoint 2010 Timer Service on $server"
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.