2

我以本教程为例来创建一个计时器作业。

这是我的计时器工作代码:

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.

任何想法为什么会出现这个错误。

4

4 回答 4

2

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

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

所以发生的事情是该解决方案已部署在 SharePoint 上,但错误也是第一次出现(不记得是否是相同的错误)。下次我纠正错误并尝试部署时,它向我显示了错误:

部署步骤“撤回解决方案”中发生错误:CalcAnnualConsumptionTotals.GroupAnnualConsumption 无法反序列化,因为它没有公共默认构造函数

Retract Solution是这里的关键词。当 SharePoint 尝试部署更新的解决方案时,它不得不撤回旧解决方案,但由于(旧)解决方案中的错误而无法撤回。

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

于 2014-08-14T09:39:22.810 回答
1

以上对我不起作用,但我确实找到了解决方案,并想在这里发布,以防其他人遇到同样的情况。

就我而言,我无法通过“管理农场解决方案”页面进行卸载,至少一开始没有。

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

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

  1. stsadm -o 枚举部署
  2. stsadm -o canceldeployment -id "步骤 1 中显示的 guid 值"
  3. 通过 powershell:remove-spsolution -Identity solutionname.wsp -force
  4. iisreset /restart(在重新部署期间您可能会收到一个错误,即解决方案仍然安装,除非您手动退回 iis)

然后我能够重新部署并重新开始工作。

于 2014-10-28T18:05:59.303 回答
0

这里

您还需要从计时器作业定义的构造函数之一调用 Web 服务关联构造函数或服务应用程序关联构造函数。请记住,您的计时器作业必须与这两个实体之一相关联。唯一可以从 SPJobDefinition 类的构造函数中创建关联,因此您的构造函数之一必须与向下调用适当的基本构造函数相关联。

看来您需要从默认构造函数中设置这两个属性之一。如果您可以将值传递给其他构造函数之一,那将是最简单的。

编辑:为了澄清,我认为将jobname参数传递给基本构造函数就足够了。如果您无权访问该值(它是硬编码的,还是在配置文件中?)您可能需要重新构造事物。

也就是说,我从未与 Sharepoint 合作过,所以我可能会离开基地。

于 2014-08-13T12:10:16.937 回答
0

SharePoint Job 的“旧版本”似乎仍在运行。

部署 SharePoint 作业时,必须重新启动SharePoint 计时器服务。

如何通过 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"            
     }            
  }
}
于 2014-08-13T13:15:01.563 回答