我使用此tutorial作为示例来创建计时器作业。
这是我的计时器工作代码:
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)
{
.....
}
}
}
正如您所看到的,我有默认的公共构造函数,但是当我尝试部署它时,它显示错误:
部署步骤出现错误&#39;撤回解决方案&#39;: CalcAnnualConsumptionTotals.GroupAnnualConsumption不能 反序列化,因为它没有公共默认构造函数
当我第一次遇到此错误时,我实际上忘记添加默认构造函数。但即使在添加之后它也会向我显示错误。我认为我的初步尝试将部分成功,从而导致部署。但我甚至无法通过中央管理局或Get-SPTimerJob
找到它。
出现此错误的任何想法。
答案 0 :(得分:2)
好的,这是问题所在。正如我在问题中已经提到的那样
...当我第一次收到此错误时,我实际上已经忘记添加默认构造函数....
所以发生的事情是该解决方案已部署在SharePoint上,但错误也是在第一时间发生的(如果是相同的错误,则无法重新收集)。下次当我纠正错误并尝试部署时,它向我显示错误:
部署步骤出现错误&#39; 撤回解决方案&#39;: CalcAnnualConsumptionTotals.GroupAnnualConsumption不能 反序列化,因为它没有公共默认构造函数
撤回解决方案是此处的关键字。当SharePoint尝试部署更新的解决方案时,它必须撤回旧的解决方案,但不能并且因为(旧)解决方案中的错误而退缩。
所以我去了管理中心中的管理场解决方案并删除了解决方案。然后,当我部署时,它工作。
答案 1 :(得分:1)
以上对我没有用,但我确实找到了一个解决方案,并希望在此处发布,以防其他人遇到同样的情况。
在我的情况下,我无法通过“管理农场解决方案”页面卸载,至少不是最初。
我必须首先通过添加默认构造函数来修复代码。然后我不得不使用 gacutil 来GAC文件。然后我使用 iisreset / restart 重置IIS。只有这样,我才能要求在“管理农场解决方案”页面中撤消解决方案。
不幸的是,它只是坐在那里。所以,为了解决这个问题我做了:
然后我能够重新部署并重新开始工作。
答案 2 :(得分:0)
来自here:
您还需要呼叫Web服务协会 构造函数或服务应用程序关联构造函数 您的一个计时器作业定义的构造函数。记住,你的计时器 工作必须与这两个实体中的一个相关联。唯一的一次 可以创建关联来自于构造函数 SPJobDefinition类,所以你的一个构造函数必须是 与调用相应的基础构造函数相关联。
您似乎需要从默认构造函数中设置这两个属性中的一个。如果您可以将值传递给其他构造函数,那将是最简单的。
编辑:为了澄清,我认为将jobname
参数传递给基础构造函数就足够了。如果您无法访问该值(是硬编码还是配置文件?),您可能需要重新构建内容。
那就是说,我从来没有使用过Sharepoint,所以我可能会离开基地。
答案 3 :(得分:0)
似乎是#34;旧版本&#34; SharePoint作业仍然正常运行。
部署SharePoint作业时,必须重新启动SharePoint Timer service。
如何通过PowerShell重新启动SharePoint定时服务
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"
}
}
}