![](/img/trans.png)
[英]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.