2010-02-25 10 views
8

के साथ ढीले एक्सएएमएल से डब्ल्यूएफ सेवा लोड करते समय अज्ञात प्रकार नहीं बना सकता है मैं गतिशील रूप से एक डब्ल्यूएफ 4 (आरसी) सेवा होस्ट करने की कोशिश कर रहा हूं। मेरे पास दो परियोजनाओं के साथ एक परीक्षण समाधान है। पहला एक घोषणात्मक वर्कफ़्लो सेवा लाइब्रेरी है जिसमें एक रूट फ्लोचार्ट गतिविधि है, और एक साधारण कस्टम कोड गतिविधि है। वर्कफ़्लो सेवा लाइब्रेरी किसी भी अन्य कस्टम असेंबली या संदर्भों पर निर्भर नहीं है। दूसरा मेरा होस्ट ऐप है, जो मेरे परीक्षण समाधान में सिर्फ एक कंसोल एप्लीकेशन है।डब्ल्यूएफ 4 आरसी - गतिविधि एक्सएएमएल सर्विसेज

मेरे होस्ट ऐप में, मैं वर्कफ़्लो सेवा के लिए Xaml को किसी गतिविधि में लोड करने के लिए ActivityXamlServices का उपयोग करने का प्रयास कर रहा हूं, और फिर उस गतिविधि का उपयोग करके वर्कफ़्लो इंस्टेंस को फायर करने के लिए वर्कफ़्लो सर्विसवर्कहोस्ट का उपयोग करें।

जैसे ही मैंने नई अप WorkflowServiceHost वस्तु की कोशिश करते हैं, मैं इस अपवाद मिलता है ...

Cannot create unknown type '{clr-namespace:DeclarativeServiceLibrary1}CodeActivity1'.

अगर मैं अपने फ़्लोचार्ट डिजाइनर से CodeActivity1 निकालने के लिए, सब कुछ ठीक चलता है। यदि मैं अपने होस्ट प्रोजेक्ट से वर्कफ़्लो सेवा प्रोजेक्ट का प्रत्यक्ष संदर्भ जोड़ता हूं और फिर Xaml से बनाई गई गतिविधि की बजाय मेरी फ़्लोचार्ट गतिविधि के उदाहरण का उपयोग करके वर्कफ़्लो सेवावॉस्ट बना देता हूं, तो यह भी ठीक काम करता है।

ऐसा लगता है कि गतिशील रूप से लोड होने पर किसी कारण से मेरी CodeActivity का उपयोग करना पसंद नहीं है।

किसी के पास कोई विचार है कि मैं अपनी वर्कफ़्लो सेवा को गतिशील रूप से क्यों नहीं बना सकता?

मेरे कोड इस प्रकार है ...

DeclarativeServiceLibrary1.Activity1.xaml ...

<Activity mc:Ignorable="sap" x:Class="DeclarativeServiceLibrary1.Activity1" sap:VirtualizedContainerService.HintSize="654,676" mva:VisualBasic.Settings="Assembly references and imported namespaces for internal implementation" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:local="clr-namespace:DeclarativeServiceLibrary1" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System" xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/servicemodel" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:s1="clr-namespace:System;assembly=System" xmlns:s2="clr-namespace:System;assembly=System.Xml" xmlns:s3="clr-namespace:System;assembly=System.Core" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System" xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel" xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core" xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:sd="clr-namespace:System.Data;assembly=System.Data" xmlns:sl="clr-namespace:System.Linq;assembly=System.Core" xmlns:st="clr-namespace:System.Text;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Flowchart sad:XamlDebuggerXmlReader.FileName="C:\dev\test\MyWorkflow\DeclarativeServiceLibrary1\Activity1.xaml" sap:VirtualizedContainerService.HintSize="614,636"> 
    <sap:WorkflowViewStateService.ViewState> 
     <scg3:Dictionary x:TypeArguments="x:String, x:Object"> 
     <x:Boolean x:Key="IsExpanded">False</x:Boolean> 
     <av:Point x:Key="ShapeLocation">270,2.5</av:Point> 
     <av:Size x:Key="ShapeSize">60,75</av:Size> 
     <av:PointCollection x:Key="ConnectorLocation">300,77.5 300,107.5 300,165</av:PointCollection> 
     </scg3:Dictionary> 
    </sap:WorkflowViewStateService.ViewState> 
    <Flowchart.StartNode> 
     <FlowStep x:Name="__ReferenceID0"> 
     <sap:WorkflowViewStateService.ViewState> 
      <scg3:Dictionary x:TypeArguments="x:String, x:Object"> 
      <av:Point x:Key="ShapeLocation">172.5,165</av:Point> 
      <av:Size x:Key="ShapeSize">255,90</av:Size> 
      <av:PointCollection x:Key="ConnectorLocation">300,255 300,285 300,299.5</av:PointCollection> 
      </scg3:Dictionary> 
     </sap:WorkflowViewStateService.ViewState> 
     <p:Receive CanCreateInstance="True" sap:VirtualizedContainerService.HintSize="255,90" OperationName="MyOperation" ServiceContractName="MyContractName" /> 
     <FlowStep.Next> 
      <FlowStep x:Name="__ReferenceID1"> 
      <sap:WorkflowViewStateService.ViewState> 
       <scg3:Dictionary x:TypeArguments="x:String, x:Object"> 
       <av:Point x:Key="ShapeLocation">194.5,299.5</av:Point> 
       <av:Size x:Key="ShapeSize">211,61</av:Size> 
       <av:PointCollection x:Key="ConnectorLocation">300,360.5 300,390.5 300,399</av:PointCollection> 
       </scg3:Dictionary> 
      </sap:WorkflowViewStateService.ViewState> 
      <WriteLine sap:VirtualizedContainerService.HintSize="211,61" Text="Workflow started" /> 
      <FlowStep.Next> 
       <FlowStep x:Name="__ReferenceID3"> 
       <sap:WorkflowViewStateService.ViewState> 
        <scg3:Dictionary x:TypeArguments="x:String, x:Object"> 
        <av:Point x:Key="ShapeLocation">200,399</av:Point> 
        <av:Size x:Key="ShapeSize">200,22</av:Size> 
        <av:PointCollection x:Key="ConnectorLocation">300,421 300,451 300,479.5</av:PointCollection> 
        </scg3:Dictionary> 
       </sap:WorkflowViewStateService.ViewState> 
       <local:CodeActivity1 sap:VirtualizedContainerService.HintSize="200,22" /> 
       <FlowStep.Next> 
        <FlowStep x:Name="__ReferenceID2"> 
        <sap:WorkflowViewStateService.ViewState> 
         <scg3:Dictionary x:TypeArguments="x:String, x:Object"> 
         <av:Point x:Key="ShapeLocation">194.5,479.5</av:Point> 
         <av:Size x:Key="ShapeSize">211,61</av:Size> 
         </scg3:Dictionary> 
        </sap:WorkflowViewStateService.ViewState> 
        <WriteLine sap:VirtualizedContainerService.HintSize="211,61" Text="The code activity worked!" /> 
        </FlowStep> 
       </FlowStep.Next> 
       </FlowStep> 
      </FlowStep.Next> 
      </FlowStep> 
     </FlowStep.Next> 
     </FlowStep> 
    </Flowchart.StartNode> 
    <x:Reference>__ReferenceID0</x:Reference> 
    <x:Reference>__ReferenceID1</x:Reference> 
    <x:Reference>__ReferenceID2</x:Reference> 
    <x:Reference>__ReferenceID3</x:Reference> 
    </Flowchart> 
</Activity> 

DeclarativeServiceLibrary1.CodeActivity1.cs ...

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Activities; 

namespace DeclarativeServiceLibrary1 
{ 

    public sealed class CodeActivity1 : CodeActivity 
    { 
     // Define an activity input argument of type string 
     //public InArgument<string> Text { get; set; } 

     // If your activity returns a value, derive from CodeActivity<TResult> 
     // and return the value from the Execute method. 
     protected override void Execute(CodeActivityContext context) 
     { 
      // Obtain the runtime value of the Text input argument 
      //string text = context.GetValue(this.Text); 
     } 
    } 
} 

DeclarativeServiceLibrary1.Web। कॉन्फ़िगर करें ...

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

ConsoleApplication1.Program.cs ...

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Activities; 
using System.Activities.XamlIntegration; 
using System.ServiceModel; 
using System.ServiceModel.Activities; 
using System.ServiceModel.Description; 
using System.Xaml; 
using System.Reflection; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     {    
      string baseAddress = @"http://localhost:8081/MyContractName"; 

      string curDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
      string wfDefPath = Path.Combine(curDir, "Activity1.xaml"); 

      Activity workflowActivity = (Activity)ActivityXamlServices.Load(wfDefPath); 
      WorkflowService service = new WorkflowService { Body = workflowActivity }; 
      Uri serviceUri = new Uri(baseAddress, UriKind.Absolute); 
      WorkflowServiceHost host = new WorkflowServiceHost(service, new Uri[] { serviceUri }); 
      host.Open(); 

      //Display that we are listening on the console window 
      Console.WriteLine("Workflow '{0}' is listening at '{1}'", host.Activity.DisplayName, baseAddress); 
      Console.ReadLine(); 
     } 
    } 
} 

मैं delarative कार्यप्रवाह सेवा है जो प्रतियां मेजबान कंसोल अनुप्रयोग के बिन \ डिबग \ फ़ोल्डर में विधानसभा और XAML फाइल पुस्तकालय में एक के बाद निर्माण घटना है।

उत्तर

12

संक्षिप्त उत्तर - Xaml लोड स्थानीय (डिफ़ॉल्ट) असेंबली का अनुमान नहीं लगा सकता है, इसलिए आपको इसे XamlReaderSettings.LocalAssembly पर निर्दिष्ट करना होगा।

+0

धन्यवाद, टिम। मैंने XamlXmlReaderSettings.LocalAssembly का उपयोग करके xaml फ़ाइल में पढ़ने के लिए XamlXmlReader का उपयोग करने के लिए स्विच किया है जैसा आपने वर्णन किया है। ऐसा करना और XamlXmlReader को ActivityXamlServices.Load विधि में एक आकर्षण की तरह काम किया। – racingcow

+0

वैकल्पिक रूप से आप एक्सएएमएल वर्कफ़्लो और उनके द्वारा उपयोग की जाने वाली गतिविधियों को विभाजित कर सकते हैं। जब आप ऐसा करते हैं, तो गतिविधि अब स्थानीय सीएलआर नेमस्पेस में नहीं है और इसे ठीक से लोड किया जाएगा। तो बस एक एक्सएएमएल वर्कफ़्लो-केवल प्रोजेक्ट और एक गतिविधि प्रोजेक्ट बनाएं। –

+0

जैसा वर्णन किया गया है? –

0

आप सीधे xaml फ़ाइल को deserializing कर रहे हैं, लेकिन यह एक प्रकार (CodeActivity1) का संदर्भ दे रहा है जिसे एक CLR प्रकार के रूप में DeclarativeServiceLibrary1 असेंबली में संकलित किया गया है। सबसे स्पष्ट जवाब यह है कि DeclarativeServiceLibrary1 असेंबली रनटाइम पर कंसोल ऐप पर उपलब्ध नहीं है। सुनिश्चित करें कि इस असेंबली को उस फ़ोल्डर में कॉपी किया गया है जहां आप कंसोल ऐप (\ bin \ debug) चला रहे हैं और देखें कि इससे कोई फर्क पड़ता है या नहीं।

नीचे की रेखा यह है कि भले ही आप सीधे xaml फ़ाइल पढ़ रहे हों, फिर भी इसे संदर्भित करने वाले किसी भी प्रकार तक पहुंच की आवश्यकता है।

+1

DeclarativeServiceLibrary1 विधानसभा के बिन \ डिबग \ फ़ोल्डर में कॉपी किया जाता है कंसोल ऐप। मैंने कंसोल ऐप से इसका सीधा संदर्भ जोड़ने का भी प्रयास किया। – racingcow

0

अपना कोड देखकर मैं बता सकता हूं कि आपको एक साधारण गतिविधि के बजाय वर्कफ़्लो सेवा लोड करनी चाहिए थी। यहां प्रयास करने के लिए मूल रूप से दो विकल्प हैं:

विकल्प 1: गतिविधि लोड करें और इसे जेनरेट वर्कफ़्लो सेवा के अंदर होस्ट करें।

आप सामान्य रूप में गतिविधि लोड करके ऐसा करते हैं और यह एक कार्यप्रवाह सेवा उदाहरण में बनाने के लिए निम्नलिखित स्निपेट का उपयोग कर सकते हैं:

WorkflowService service = new WorkflowService(); 
service.Body = loadedActivity; 

उसके बाद आप कार्यप्रवाह सेवा मेजबान अंदर होस्ट कर सकते हैं।

विकल्प 2: कार्यप्रवाह सेवा लोड सीधे

दूसरा विकल्प क्या आप अब से बहुत अलग नहीं है। लेकिन ActivityXamlServices क्लास का उपयोग करने के बजाय आपको वर्कफ़्लो सेवा लोड करने के लिए XamlServices क्लास का उपयोग करने की आवश्यकता होगी। उसके बाद वर्कफ़्लो सेवा होस्ट को आपके नमूने में उपयोग की जाने वाली सेटिंग्स के साथ फायर करने का मामला है।

+0

विकल्प 1 काम करता है अगर मैं सीधे घोषणा करता हूं कि DeclarativeServiceLibrary1.Activity1 को तुरंत चालू करें और इसका उपयोग करें, लेकिन यह अभी भी मुझे डिस्क से Xaml लोड करना पसंद नहीं है। मुझे वर्कफ़्लो सेवा सर्विस बनाने की कोशिश करते समय मूल त्रुटि। विकल्प 2 मुझे एक त्रुटि देता है जो कहता है "'कोई मिलान करने वाला कन्स्ट्रक्टर प्रकार' सिस्टम पर नहीं मिला। क्रियाएँ। सक्रियता '। आप इस प्रकार के निर्माण के लिए Arguments या FactoryMethod निर्देशों का उपयोग कर सकते हैं। '' जैसे ही मैं XamlServices.Load विधि का उपयोग कर गतिविधि को लोड करने का प्रयास करता हूं। मुझे बताएं कि क्या आप मेरे अपडेट किए गए कोड को देखते हैं और मैं पोस्ट करता हूं यह – racingcow

+0

मैंने अपने समाधान को दोबारा जांच लिया है और मैं आपके द्वारा प्राप्त त्रुटियों को पुन: उत्पन्न नहीं कर सकता। मैंने कोड के निम्न स्निपेट को आजमाया: गतिविधि वर्कफ़्लोएक्टिविटी = (गतिविधि) ActivityXamlServices.Load ("वर्कफ़्लो 1.xaml"); वर्कफ़्लो सेवा सेवा = नए WorkflowService { शारीरिक = workflowActivity }; उरी serviceUri = नए उरी ("http: // localhost: 9001/testservice", UriKind.Absolute); वर्कफ़्लो सेवा सेवा होस्ट = नया वर्कफ़्लो सेवा सेवा (सेवा, नई उरी [] {serviceUri}); होस्ट। ओपन(); –

+0

मैंने आपके कोड में एकीकृत किया है और अभी भी इसे किसी कारण से नहीं लग रहा है। मैंने उपरोक्त पद में कोड अपडेट किया। मैंने अपना पूरा समाधान http://dntest.criticaltech.com/MyWorkflow.zip पर भी अपलोड किया। यदि आपको एक मौका मिलता है तो इसकी जांच - पड़ताल करें। आपकी मदद के लिए धन्यवाद, बीटीडब्ल्यू। – racingcow

9

गतिविधि का ओपन सोर्स कोड। बदलें "xmlns: स्थानीय =" clr-नाम स्थान: clr-namespace: "स्थानीय = xmlns करने के लिए": DeclarativeServiceLibrary1। DeclarativeServiceLibrary1; विधानसभा = DeclarativeServiceLibrary1 "

+0

यह मेरे लिए एक और बग भी तय करता है: http: // stackoverflow।कॉम/प्रश्न/9743133/समाधान-के लिए-xamlinjectorcannot-create-अज्ञात-प्रकार-त्रुटियां-काम नहीं करते त्रुटि: त्रुटि "अप्रत्याशित 'संपत्ति' में पार्स नियम 'तत्व :: =। खाली करें | प्रारंभ करें (StartElement ElementBody)। '।' –

+0

बहुत बहुत धन्यवाद। –

+0

यह खूबसूरती से काम किया, धन्यवाद! – Kris

संबंधित मुद्दे