C# 部署步骤';收回解决方案';:&书信电报;类别>;无法反序列化,因为它没有公共默认构造函数
我用这个例子来创建一个计时器作业 这是我的计时器作业代码:C# 部署步骤';收回解决方案';:&书信电报;类别>;无法反序列化,因为它没有公共默认构造函数,c#,sharepoint,sharepoint-2010,timer-jobs,C#,Sharepoint,Sharepoint 2010,Timer Jobs,我用这个例子来创建一个计时器作业 这是我的计时器作业代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.SharePoint.Administration; using Microsoft.SharePoint; namespace CalcAnnualConsumptionTotals { public class Group
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)
{
.....
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用Microsoft.SharePoint.Administration;
使用Microsoft.SharePoint;
命名空间CalcAnnualConsumptionTotals
{
公共类GroupAnnualConsumption:SPJobDefinition
{
公共组年度消费():base(){}/来自:
您还需要调用web服务关联
构造函数或来自的服务应用程序关联构造函数
您的计时器作业定义的构造函数之一。请记住,您的计时器
作业必须与这两个实体之一关联。只有
可以从上的构造函数创建关联
SPJobDefinition类,因此必须有一个构造函数
与调用相应的基本构造函数相关联
似乎需要从默认构造函数中设置这两个属性中的一个。如果可以将值传递给其他构造函数中的一个,这将是最简单的
Edit:为了澄清这一点,我认为将jobname
参数传递给基本构造函数就足够了。如果您无法访问该值(是硬编码的,还是在配置文件中?),则可能需要重新构造
也就是说,我从未使用过Sharepoint,因此我可能会偏离基准。看来Sharepoint作业的“旧版本”仍在运行
部署SharePoint作业时,必须重新启动
如何通过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"
}
}
}
好的,问题就在这里。正如我在问题中已经提到的
…当我第一次遇到这个错误时,我实际上忘记了添加默认构造函数
因此,发生的情况是,解决方案部署在SharePoint上,但错误也是第一次出现的(无法回忆是否是同一个错误)。下次我更正错误并尝试部署时,它向我显示了错误:
部署步骤“收回解决方案”中出错:
CalcAnnualConsumptionTotals.GroupAnnualConsumption不能为空
反序列化,因为它没有公共默认构造函数
收回解决方案是此处的关键字。当SharePoint尝试部署更新的解决方案时,它必须收回旧的解决方案,但由于(旧)解决方案中的错误而无法收回
因此,我去中央管理局管理农场解决方案并删除了该解决方案。然后,当我部署时,它起了作用。上述方法对我不起作用,但我确实找到了一个解决方案,并希望在这里发布,以防其他人遇到同样的情况
在我的情况下,我无法通过Manage Farm Solutions(管理场解决方案)页面卸载,至少一开始无法
我必须首先通过添加默认构造函数来修复代码。然后,我必须使用gacutil对文件进行GAC。然后,我使用iisreset/restart重置IIS。只有这样,我才能在“管理场解决方案”页面中请求收回解决方案
不幸的是,然后它就停在那里了。所以,为了解决这个问题,我做了:
stsadm-o枚举部署
stsadm-o canceldeployment-id“步骤1中显示的guid值”
通过powershell:删除spsolution-Identity solutionname.wsp-force
iisreset/restart(重新部署过程中可能会出现错误,除非手动跳出iis,否则解决方案仍在安装)
然后我可以重新部署并重新开始工作。我也找到了这个链接。但是我如何从计时器作业定义的构造函数中调用web服务关联构造函数或服务应用程序关联构造函数呢我是SharePoint的新手。我终于发现了这个问题,并将其发布为。谢谢你的帮助。我对SharePoint了解得越多,就越不想处理它。我终于发现了这个问题,并将其发布为。谢谢你的帮助。谢谢,这对我帮助很大。我知道这已经有一段时间了,但这个答案仍然有效,并且仍然适用SP2013的谎言。刚才有这个问题。它也有助于将重建的DLL部署到gac中。