繁体   English   中英

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

[英]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。 直到那时,我才能够在“管理农场解决方案”页面中请求撤回解决方案。

不幸的是,它就坐在那儿。 因此,要解决该问题,我做了:

  1. stsadm -o枚举
  2. stsadm -o canceldeployment -id“步骤1中显示的GUID值”
  3. 通过Powershell:remove-spsolution -Identity solutionname.wsp -force
  4. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM