Versionshantering sida vid sida i WorkflowServiceHost
Versionshantering WorkflowServiceHost sida vid sida som introducerades i .NET Framework 4.5 ger möjlighet att vara värd för flera versioner av en arbetsflödestjänst på en enda slutpunkt. De funktioner som tillhandahålls sida vid sida gör att en arbetsflödestjänst kan konfigureras så att nya instanser av arbetsflödestjänsten skapas med den nya arbetsflödesdefinitionen, samtidigt som instanser som körs slutförs med den befintliga definitionen. Det här avsnittet innehåller en översikt över körningen av arbetsflödestjänsten sida vid sida med hjälp av WorkflowServiceHost.
Vara värd för flera versioner i en arbetsflödestjänst
WorkflowServiceHost innehåller två egenskaper som kan konfigureras för att tillåta att flera versioner av ett arbetsflöde körs sida vid sida: SupportedVersions och DefinitionIdentity. SupportedVersions innehåller de versioner av arbetsflödestjänsten som stöds och DefinitionIdentity används för att unikt identifiera varje arbetsflödestjänst. Detta görs genom att associera en WorkflowIdentity med arbetsflödestjänsten. A WorkflowIdentity innehåller tre identifierande informationsdelar. Name och Version innehåller ett namn och ett Version och krävs, och Package är valfritt och kan användas för att ange ytterligare en sträng som innehåller information som sammansättningsnamn eller annan önskad information. Varje arbetsflödestjänst som ingår i SupportedVersions samlingen måste ha en unik WorkflowIdentity. A WorkflowIdentity är unikt om någon av dess tre egenskaper skiljer sig från en annan WorkflowIdentity. A null
WorkflowIdentity är ett tillåtet värde för DefinitionIdentity, men endast en tidigare version av en arbetsflödestjänst kan ha en null
WorkflowIdentity.
Viktigt!
En WorkflowIdentity bör inte innehålla någon personligt identifierbar information (PII). WorkflowIdentity består av tre delar: en Name (String), en Version (Version) och en Package (String). Information om den WorkflowIdentity som används för att skapa en instans skickas till alla konfigurerade spårningstjänster vid flera olika tidpunkter i aktivitetslivscykeln av körningen. WF-spårning har ingen mekanism för att dölja PII (känsliga användardata). Därför bör en WorkflowIdentity instans inte innehålla några PII-data eftersom den genereras av körningen i spårningsposter och kan vara synlig för alla som har åtkomst till att visa spårningsposterna.
Regler för att vara värd för flera versioner av en arbetsflödestjänst
När en användare lägger till ytterligare en version i WorkflowServiceHostfinns det flera villkor som måste uppfyllas för att en arbetsflödestjänst ska vara värd för samma uppsättning slutpunkter och beskrivning. Om någon av de ytterligare versionerna inte uppfyller dessa villkor utlöser WorkflowServiceHost undantaget när Open
anropas. Varje arbetsflödesdefinition som tillhandahålls värden som en ytterligare version måste uppfylla följande krav (där den primära versionen är arbetsflödestjänstdefinitionen som tillhandahålls till värdkonstruktorn). Den ytterligare arbetsflödesversionen måste:
Ha samma Name som den primära versionen av arbetsflödestjänsten.
Får inte ha några Receive aktiviteter eller SendReply aktiviteter i den Body som inte finns i den primära versionen, och de måste matcha åtgärdskontraktet.
Ha en unik DefinitionIdentity. En och endast en arbetsflödesdefinition kan ha en
null
DefinitionIdentity.
Vissa ändringar tillåts. Följande objekt kan skilja sig mellan versionerna:
DefinitionIdentity Kan ha ett annat namn och paket än den primära versionen.
Värdet AllowBufferedReceive kan skilja sig från den primära versionen.
Kan ConfigurationName skilja sig från den primära versionen.
Kan ImplementedContracts skilja sig från den primära versionen.
Konfigurera DefinitionIdentity
När en arbetsflödestjänst skapas med hjälp av arbetsflödesdesignern DefinitionIdentity anges den med hjälp av fönstret Egenskaper . Klicka utanför tjänstens rotaktivitet i designern för att välja arbetsflödestjänsten och välj Egenskapsfönster på menyn Visa . Välj WorkflowIdentity i listrutan som visas bredvid egenskapen DefinitionIdentity och expandera och ange önskade WorkflowIdentity egenskaper. I följande exempel DefinitionIdentity konfigureras med MortgageWorkflow
Name och av Version 1.0.0.0
. Package är valfritt och i det här exemplet är null
.
När en arbetsflödestjänst DefinitionIdentity är lokalt installerad konfigureras den när arbetsflödestjänsten skapas. I följande exempel DefinitionIdentity konfigureras med samma värden som i föregående exempel, med Name MortgageWorkflow
och en Name av 1.0.0.0
.
WorkflowService service = new WorkflowService
{
Name = "MortgageWorkflowService",
Body = new MortgageWorkflow(),
DefinitionIdentity = new WorkflowIdentity
{
Name = "MortgageWorkflow",
Version = new Version(1, 0, 0, 0)
}
};
Dim service As New WorkflowService
With service
.Name = "MortgageWorkflowService"
.Body = New MortgageWorkflow
.DefinitionIdentity = New WorkflowIdentity With _
{ _
.Name = "MortgageWorkflow", _
.Version = New Version(1, 0, 0, 0) _
}
End With
A DefinitionIdentity krävs inte, även om endast en version av arbetsflödestjänsten kan ha nullDefinitionIdentity.
Kommentar
Detta är användbart om tjänsten distribuerades först utan konfigurerad DefinitionIdentity och sedan skapas en uppdaterad version.
Lägga till en ny version i en webbaserad arbetsflödestjänst
Det första steget i att konfigurera en ny version av en arbetsflödestjänst i en webbaserad tjänst är att skapa en ny mapp i App_Code
mappen som har samma namn som tjänstfilen. Om tjänstens xamlx
fil heter MortgageWorkflow.xamlx
måste mappen ha namnet MortgageWorkflow
. Placera en kopia av den ursprungliga tjänstens xamlx
fil i den här mappen och byt namn på den till ett nytt namn, till exempel MortgageWorkflowV1.xamlx
. Gör önskade ändringar i den primära tjänsten, uppdatera dess DefinitionIdentityoch distribuera sedan tjänsten. I följande exempel DefinitionIdentity har uppdaterats med en Name av MortgageWorkflow
och en Version av 2.0.0.0
.
När tjänsten startas om läggs den tidigare versionen automatiskt till i SupportedVersions samlingen eftersom den finns i den avsedda App_Code
undermappen. Observera att om den primära versionen av arbetsflödestjänsten har en null
DefinitionIdentity tidigare version kommer inte att läggas till. En version kan ha en null
DefinitionIdentity, men om det finns flera versioner får den primära versionen inte vara den med null
DefinitionIdentity , annars läggs inte tidigare versioner till i SupportedVersions samlingen.
Lägga till en ny version i en lokalt installerad arbetsflödestjänst
När du lägger till en ny version i en lokalt installerad arbetsflödestjänst WorkflowServiceHost konfigureras den med den primära versionen av arbetsflödestjänsten och tidigare versioner måste uttryckligen läggas till i SupportedVersions samlingen. I följande exempel konfigureras en WorkflowServiceHost med en primär arbetsflödestjänst som använder en MortgageWorkflowV2
arbetsflödesdefinition, och en arbetsflödestjänst som konfigurerats med en MortgageWorkflowV1
arbetsflödesdefinition läggs till i SupportedVersions samlingen. Varje arbetsflödestjänst är konfigurerad med en unik DefinitionIdentity som återspeglar versionen av arbetsflödesdefinitionen.
// Create the primary version of the workflow service.
WorkflowService serviceV2 = new WorkflowService
{
Name = "MortgageWorkflowService",
Body = new MortgageWorkflowV2(),
DefinitionIdentity = new WorkflowIdentity
{
Name = "MortgageWorkflow",
Version = new Version(2, 0, 0, 0)
}
};
// Configure the WorkflowServiceHost with the current version
// of the workflow service. This code requires Administrator
// privileges to function correctly. If running from Visual
// Studio, Visual Studio must be run with Administrator privileges.
WorkflowServiceHost host = new WorkflowServiceHost(serviceV2,
new Uri("http://localhost:8080/MortgageWorkflowService"));
// Create the previous version of the workflow service.
WorkflowService serviceV1 = new WorkflowService
{
Name = "MortgageWorkflowService",
Body = new MortgageWorkflowV1(),
DefinitionIdentity = new WorkflowIdentity
{
Name = "MortgageWorkflow",
Version = new Version(1, 0, 0, 0)
}
};
// Add the previous version of the service to the SupportedVersions collection.
host.SupportedVersions.Add(serviceV1);
'Create the primary version of the workflow service
Dim serviceV2 As New WorkflowService
With serviceV2
.Name = "MortgageWorkflowService"
.Body = New MortgageWorkflowV2
.DefinitionIdentity = New WorkflowIdentity With _
{ _
.Name = "MortgageWorkflow", _
.Version = New Version(2, 0, 0, 0) _
}
End With
'Configure the WorkflowServiceHost with the current version
'of the workflow service. This code requires Administrator
'privileges to function correctly. If running from Visual
'Studio, Visual Studio must be run with Administrator privileges.
Dim host As New WorkflowServiceHost(serviceV2, _
New Uri("http://localhost:8080/MortgageWorkflowService"))
'Create the previous version of the workflow service.
Dim serviceV1 As New WorkflowService
With serviceV1
.Name = "MortgageWorkflowService"
.Body = New MortgageWorkflowV1
.DefinitionIdentity = New WorkflowIdentity With _
{ _
.Name = "MortgageWorkflow", _
.Version = New Version(1, 0, 0, 0) _
}
End With
'Add the previous version of the service to the SupportedVersions collection.
host.SupportedVersions.Add(serviceV1)