部署步骤中发生错误&#39;撤回解决方案&#39;:<class>无法反序列化,因为它没有公共默认构造函数</class>

时间:2014-08-13 12:03:29

标签: c# sharepoint sharepoint-2010 timer-jobs

我使用此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找到它。

出现此错误的任何想法。

4 个答案:

答案 0 :(得分:2)

好的,这是问题所在。正如我在问题中已经提到的那样

  

...当我第一次收到此错误时,我实际上已经忘记添加默认构造函数....

所以发生的事情是该解决方案已部署在SharePoint上,但错误也是在第一时间发生的(如果是相同的错误,则无法重新收集)。下次当我纠正错误并尝试部署时,它向我显示错误:

  

部署步骤出现错误&#39; 撤回解决方案&#39;:   CalcAnnualConsumptionTotals.GroupAnnualConsumption不能   反序列化,因为它没有公共默认构造函数

撤回解决方案是此处的关键字。当SharePoint尝试部署更新的解决方案时,它必须撤回旧的解决方案,但不能并且因为(旧)解决方案中的错误而退缩。

所以我去了管理中心中的管理场解决方案并删除了解决方案。然后,当我部署时,它工作。

答案 1 :(得分:1)

以上对我没有用,但我确实找到了一个解决方案,并希望在此处发布,以防其他人遇到同样的情况。

在我的情况下,我无法通过“管理农场解决方案”页面卸载,至少不是最初。

我必须首先通过添加默认构造函数来修复代码。然后我不得不使用 gacutil 来GAC文件。然后我使用 iisreset / restart 重置IIS。只有这样,我才能要求在“管理农场解决方案”页面中撤消解决方案。

不幸的是,它只是坐在那里。所以,为了解决这个问题我做了:

  1. stsadm -o enumdeployments
  2. stsadm -o canceldeployment -id&#34;步骤1&#34中显示的guid值;
  3. via powershell:remove-spsolution -Identity solutionname.wsp -force
  4. iisreset / restart(重新部署期间可能会出现错误,除非您手动退回iis,否则仍会安装解决方案)
  5. 然后我能够重新部署并重新开始工作。

答案 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"            
     }            
  }
}