簡體   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