Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Activities / InvokeWebService.cs / 1305376 / InvokeWebService.cs
namespace System.Workflow.Activities { #region Imports using System; using System.Text; using System.Reflection; using System.Collections; using System.CodeDom; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing.Design; using System.Drawing; using System.Windows.Forms; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Runtime.Serialization; using System.Workflow.ComponentModel.Compiler; using System.ComponentModel.Design.Serialization; using System.Collections.Specialized; using System.Xml; using System.Web.Services.Protocols; using System.Collections.Generic; using System.Workflow.Runtime; using System.Workflow.Activities.Common; #endregion #region Class InvokeWebService [Serializable] public sealed class InvokeWebServiceEventArgs : EventArgs { [NonSerialized] Object proxyInstance; public InvokeWebServiceEventArgs(Object proxyInstance) { this.proxyInstance = proxyInstance; } public Object WebServiceProxy { get { return this.proxyInstance; } } } [SRDescription(SR.InvokeWebServiceActivityDescription)] [ToolboxItem(typeof(InvokeWebServiceToolboxItem))] [Designer(typeof(InvokeWebServiceDesigner), typeof(IDesigner))] [ToolboxBitmap(typeof(InvokeWebServiceActivity), "Resources.WebServiceInOut.png")] [ActivityValidator(typeof(InvokeWebServiceValidator))] [SRCategory(SR.Standard)] public sealed class InvokeWebServiceActivity : Activity, IPropertyValueProvider, IDynamicPropertyTypeProvider { private static readonly Guid WebServiceInvoker = new Guid("C3FE5ABC-7D41-4064-810E-42BEF0A855EC"); public static readonly DependencyProperty ProxyClassProperty = DependencyProperty.Register("ProxyClass", typeof(Type), typeof(InvokeWebServiceActivity), new PropertyMetadata(null,DependencyPropertyOptions.Metadata)); public static readonly DependencyProperty MethodNameProperty = DependencyProperty.Register("MethodName", typeof(string), typeof(InvokeWebServiceActivity), new PropertyMetadata("",DependencyPropertyOptions.Metadata)); public static readonly DependencyProperty SessionIdProperty = DependencyProperty.Register("SessionId", typeof(string), typeof(InvokeWebServiceActivity), new PropertyMetadata("",DependencyPropertyOptions.Metadata)); public static readonly DependencyProperty ParameterBindingsProperty = DependencyProperty.Register("ParameterBindings", typeof(WorkflowParameterBindingCollection), typeof(InvokeWebServiceActivity), new PropertyMetadata(DependencyPropertyOptions.Metadata | DependencyPropertyOptions.ReadOnly, new Attribute[] { new BrowsableAttribute(false), new DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content) })); public static readonly DependencyProperty InvokingEvent = DependencyProperty.Register("Invoking", typeof(EventHandler), typeof(InvokeWebServiceActivity)); public static readonly DependencyProperty InvokedEvent = DependencyProperty.Register("Invoked", typeof(EventHandler ), typeof(InvokeWebServiceActivity)); static DependencyProperty SessionCookieContainerProperty = DependencyProperty.Register("SessionCookieContainer", typeof(System.Net.CookieContainer), typeof(InvokeWebServiceActivity)); static DependencyProperty SessionCookieMapProperty = DependencyProperty.RegisterAttached("SessionCookieMap", typeof(Dictionary ), typeof(InvokeWebServiceActivity)); #region Constructors public InvokeWebServiceActivity() { base.SetReadOnlyPropertyValue(ParameterBindingsProperty, new WorkflowParameterBindingCollection(this)); } public InvokeWebServiceActivity(string name) : base(name) { base.SetReadOnlyPropertyValue(ParameterBindingsProperty, new WorkflowParameterBindingCollection(this)); } #endregion internal System.Net.CookieContainer SessionCookieContainer { get { return (System.Net.CookieContainer)base.GetValue(SessionCookieContainerProperty); } set { base.SetValue(SessionCookieContainerProperty, value); } } internal static readonly ArrayList ReservedParameterNames = new ArrayList(new string[] { "Name", "Enabled", "Description", "MethodName", "ProxyClass", "SessionId", "Invoked", "Invoking" }); #region Execute() protected override sealed ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { if (executionContext == null) throw new ArgumentNullException("executionContext"); if(SessionId != "" && SessionId != null) PopulateSessionCookie(); // Create instance of Proxy. object proxyInstance = Activator.CreateInstance(this.ProxyClass); //Set Session Cookie System.Web.Services.Protocols.HttpWebClientProtocol proxy = proxyInstance as System.Web.Services.Protocols.HttpWebClientProtocol; System.Diagnostics.Debug.Assert(proxy != null); proxy.CookieContainer = this.SessionCookieContainer; //Invoke OnBefore Invoke this.RaiseGenericEvent(InvokeWebServiceActivity.InvokingEvent, this, new InvokeWebServiceEventArgs(proxyInstance)); // Get the parameters. MethodInfo methodInfo = this.ProxyClass.GetMethod(this.MethodName, BindingFlags.Instance | BindingFlags.Public); object[] actualParameters = InvokeHelper.GetParameters(methodInfo, this.ParameterBindings); WorkflowParameterBinding resultBinding = null; if (this.ParameterBindings.Contains("(ReturnValue)")) resultBinding = this.ParameterBindings["(ReturnValue)"]; Object result = null; try { //Invoke the Web Service. result = this.ProxyClass.InvokeMember(this.MethodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, proxyInstance, actualParameters, System.Globalization.CultureInfo.InvariantCulture); } catch (TargetInvocationException e) { if (e.InnerException != null) throw e.InnerException; else throw; } // Save the result. if (resultBinding != null) resultBinding.Value = result; // Save ref parameters. InvokeHelper.SaveOutRefParameters(actualParameters, methodInfo, this.ParameterBindings); //Invoke OnAfter Invoke this.RaiseGenericEvent(InvokeWebServiceActivity.InvokedEvent, this, new InvokeWebServiceEventArgs(proxyInstance)); return ActivityExecutionStatus.Closed; } void PopulateSessionCookie() { //Already session cookie is populated. if (this.SessionCookieContainer != null) return; //Map of Session - CookieContainer is populated in RootActvity. Activity rootActivity = (Activity)GetRootActivity(); Dictionary sessionCookieContainers; System.Net.CookieContainer cookieContainer; sessionCookieContainers = (Dictionary )rootActivity.GetValue(SessionCookieMapProperty); if (sessionCookieContainers == null) { sessionCookieContainers = new Dictionary (); rootActivity.SetValue(SessionCookieMapProperty, sessionCookieContainers); cookieContainer = new System.Net.CookieContainer(); sessionCookieContainers.Add(SessionId, cookieContainer); } else { if (!sessionCookieContainers.TryGetValue(SessionId, out cookieContainer)) { cookieContainer = new System.Net.CookieContainer(); sessionCookieContainers.Add(SessionId, cookieContainer); } } this.SessionCookieContainer = cookieContainer; } Activity GetRootActivity() { Activity parent = this; while (true) { if (parent.Parent == null) return parent; parent = parent.Parent; } } protected override void OnClosed(IServiceProvider provider) { base.RemoveProperty(InvokeWebServiceActivity.SessionCookieContainerProperty); base.RemoveProperty(InvokeWebServiceActivity.SessionCookieMapProperty); } #endregion [SRCategory(SR.Activity)] [SRDescription(SR.ProxyClassDescr)] [TypeConverter(typeof(TypePropertyValueProviderTypeConverter))] [RefreshProperties(RefreshProperties.All)] [MergablePropertyAttribute(false)] [DefaultValue(null)] public Type ProxyClass { get { return base.GetValue(ProxyClassProperty) as Type; } set { base.SetValue(ProxyClassProperty, value); } } [RefreshProperties(RefreshProperties.All)] [TypeConverter(typeof(PropertyValueProviderTypeConverter))] [SRCategory(SR.Activity)] [SRDescription(SR.MethodNameDescr)] [MergablePropertyAttribute(false)] [DefaultValue("")] public string MethodName { get { return base.GetValue(MethodNameProperty) as string; } set { base.SetValue(MethodNameProperty, value); } } [SRCategory(SR.Handlers)] [SRDescription(SR.OnBeforeMethodInvokeDescr)] [MergableProperty(false)] public event EventHandler Invoking { add { base.AddHandler(InvokingEvent, value); } remove { base.RemoveHandler(InvokingEvent, value); } } [SRCategory(SR.Handlers)] [SRDescription(SR.OnAfterMethodInvokeDescr)] [MergableProperty(false)] public event EventHandler Invoked { add { base.AddHandler(InvokedEvent, value); } remove { base.RemoveHandler(InvokedEvent, value); } } [SRCategory(SR.Activity)] [SRDescription(SR.WebServiceSessionIDDescr)] [DefaultValue("")] [MergablePropertyAttribute(false)] public string SessionId { get { return base.GetValue(SessionIdProperty) as string; } set { base.SetValue(SessionIdProperty, value); } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [Browsable(false)] public WorkflowParameterBindingCollection ParameterBindings { get { return base.GetValue(ParameterBindingsProperty) as WorkflowParameterBindingCollection; } } #region IPropertyValueProvider Members ICollection IPropertyValueProvider.GetPropertyValues(ITypeDescriptorContext context) { ITypeProvider typeProvider = (ITypeProvider)context.GetService(typeof(ITypeProvider)); if (typeProvider == null) throw new InvalidOperationException(SR.GetString(SR.General_MissingService, typeof(ITypeProvider).FullName)); ICollection values = null; if (context.PropertyDescriptor.Name == "ProxyClass") { List typeList = new List (); Type webServiceBaseType = typeProvider.GetType(typeof(System.Web.Services.Protocols.SoapHttpClientProtocol).FullName); if (webServiceBaseType != null) { Type[] types = typeProvider.GetTypes(); foreach (Type type in types) { if (!(type.Equals(webServiceBaseType)) && TypeProvider.IsAssignable(webServiceBaseType, type)) typeList.Add(type); } } values = typeList.ToArray(); } else if (context.PropertyDescriptor.Name == "MethodName") { StringCollection names = new StringCollection(); Type type = this.ProxyClass; if (type != null) { foreach (MethodInfo method in type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public)) { object[] attrs = method.GetCustomAttributes(typeof(SoapDocumentMethodAttribute), false); if (attrs == null || attrs.Length == 0) attrs = method.GetCustomAttributes(typeof(SoapRpcMethodAttribute), false); if (attrs != null && attrs.Length > 0) names.Add(method.Name); } } values = names; } return values; } #endregion #region IDynamicPropertyTypeProvider Type IDynamicPropertyTypeProvider.GetPropertyType(IServiceProvider serviceProvider, string propertyName) { if (propertyName == null) throw new ArgumentNullException("propertyName"); Dictionary parameters = new Dictionary (); this.GetParameterPropertyDescriptors(parameters); if (parameters.ContainsKey(propertyName)) { ParameterInfoBasedPropertyDescriptor descriptor = parameters[propertyName] as ParameterInfoBasedPropertyDescriptor; if (descriptor != null) return descriptor.ParameterType; } return null; } AccessTypes IDynamicPropertyTypeProvider.GetAccessType(IServiceProvider serviceProvider, string propertyName) { if (propertyName == null) throw new ArgumentNullException("propertyName"); return AccessTypes.Read; } internal void GetParameterPropertyDescriptors(IDictionary properties) { if (((IComponent)this).Site == null) return; ITypeProvider typeProvider = (ITypeProvider)((IComponent)this).Site.GetService(typeof(ITypeProvider)); if (typeProvider == null) throw new InvalidOperationException(SR.GetString(SR.General_MissingService, typeof(ITypeProvider).FullName)); Type type = this.ProxyClass; if (type != null) { MethodInfo method = type.GetMethod(this.MethodName); if (method != null) { ArrayList paramInfos = new ArrayList(method.GetParameters()); if (!(method.ReturnType == typeof(void))) paramInfos.Add(method.ReturnParameter); foreach (ParameterInfo paramInfo in paramInfos) { if (paramInfo.ParameterType != null) { PropertyDescriptor prop = null; if (paramInfo.Position == -1) prop = new ParameterInfoBasedPropertyDescriptor(typeof(InvokeWebServiceActivity), paramInfo, false, DesignOnlyAttribute.Yes); else prop = new ParameterInfoBasedPropertyDescriptor(typeof(InvokeWebServiceActivity), paramInfo, InvokeWebServiceActivity.ReservedParameterNames.Contains(paramInfo.Name), DesignOnlyAttribute.Yes); // return this parameter properties[prop.Name] = prop; } } } } } #endregion } #endregion #region class InvokeWebServiceValidator internal sealed class InvokeWebServiceValidator : ActivityValidator { public override ValidationErrorCollection Validate(ValidationManager manager, object obj) { ValidationErrorCollection validationErrors = base.Validate(manager, obj); InvokeWebServiceActivity invokeWebService = obj as InvokeWebServiceActivity; if (invokeWebService == null) throw new ArgumentException(SR.GetString(SR.Error_UnexpectedArgumentType, typeof(InvokeWebServiceActivity).FullName), "obj"); if (invokeWebService.ProxyClass == null) { ValidationError error = new ValidationError(SR.GetString(SR.Error_TypePropertyInvalid, "ProxyClass"), ErrorNumbers.Error_PropertyNotSet); error.PropertyName = "ProxyClass"; validationErrors.Add(error); } else { ITypeProvider typeProvider = (ITypeProvider)manager.GetService(typeof(ITypeProvider)); if (typeProvider == null) throw new InvalidOperationException(SR.GetString(SR.General_MissingService, typeof(ITypeProvider).FullName)); Type proxyClassType = invokeWebService.ProxyClass; // Validate method if (invokeWebService.MethodName == null || invokeWebService.MethodName.Length == 0) validationErrors.Add(ValidationError.GetNotSetValidationError("MethodName")); else { MethodInfo methodInfo = proxyClassType.GetMethod(invokeWebService.MethodName); if (methodInfo == null) { ValidationError error = new ValidationError(SR.GetString(SR.Error_MethodNotExists, "MethodName", invokeWebService.MethodName), ErrorNumbers.Error_MethodNotExists); error.PropertyName = "MethodName"; validationErrors.Add(error); } else { ArrayList paramInfos = new ArrayList(methodInfo.GetParameters()); if (methodInfo.ReturnType != typeof(void)) paramInfos.Add(methodInfo.ReturnParameter); foreach (ParameterInfo paramInfo in paramInfos) { string paramName = paramInfo.Name; if (paramInfo.Position == -1) paramName = "(ReturnValue)"; object paramValue = null; if (invokeWebService.ParameterBindings.Contains(paramName)) { if (invokeWebService.ParameterBindings[paramName].IsBindingSet(WorkflowParameterBinding.ValueProperty)) paramValue = invokeWebService.ParameterBindings[paramName].GetBinding(WorkflowParameterBinding.ValueProperty); else paramValue = invokeWebService.ParameterBindings[paramName].GetValue(WorkflowParameterBinding.ValueProperty); } if (!invokeWebService.ParameterBindings.Contains(paramName) || paramValue == null) { ValidationError validationError = ValidationError.GetNotSetValidationError(paramName); if (InvokeWebServiceActivity.ReservedParameterNames.Contains(paramName)) validationError.PropertyName = ParameterInfoBasedPropertyDescriptor.GetParameterPropertyName(invokeWebService.GetType(), paramName); validationError.PropertyName = paramName; validationErrors.Add(validationError); } else { AccessTypes access = AccessTypes.Read; if (paramInfo.IsOut || paramInfo.IsRetval) access = AccessTypes.Write; else if (paramInfo.ParameterType.IsByRef) access |= AccessTypes.Write; ValidationErrorCollection variableErrors = ValidationHelpers.ValidateProperty(manager, invokeWebService, paramValue, new PropertyValidationContext(invokeWebService.ParameterBindings[paramName], null, paramName), new BindValidationContext(paramInfo.ParameterType.IsByRef ? paramInfo.ParameterType.GetElementType() : paramInfo.ParameterType, access)); if (InvokeWebServiceActivity.ReservedParameterNames.Contains(paramName)) { foreach (ValidationError validationError in variableErrors) validationError.PropertyName = ParameterInfoBasedPropertyDescriptor.GetParameterPropertyName(invokeWebService.GetType(), paramName); } validationErrors.AddRange(variableErrors); } } if(invokeWebService.ParameterBindings.Count > paramInfos.Count) validationErrors.Add(new ValidationError(SR.GetString(SR.Warning_AdditionalBindingsFound), ErrorNumbers.Warning_AdditionalBindingsFound, true)); } } } return validationErrors; } } #endregion } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- OutputCacheProfileCollection.cs
- KnownBoxes.cs
- LeaseManager.cs
- VirtualizingPanel.cs
- RegexInterpreter.cs
- Button.cs
- CheckableControlBaseAdapter.cs
- VariableAction.cs
- DataObjectMethodAttribute.cs
- PrimarySelectionGlyph.cs
- WebPartManagerDesigner.cs
- GraphicsContainer.cs
- HttpValueCollection.cs
- SeekableReadStream.cs
- StreamDocument.cs
- CompilerHelpers.cs
- Constraint.cs
- SafeCancelMibChangeNotify.cs
- NativeMethods.cs
- HorizontalAlignConverter.cs
- TemplatedMailWebEventProvider.cs
- WebPartEditorCancelVerb.cs
- DbConnectionHelper.cs
- MaterialCollection.cs
- CapabilitiesSection.cs
- FontInfo.cs
- FactoryMaker.cs
- _NegoState.cs
- CellTreeNodeVisitors.cs
- ProtocolsConfigurationEntry.cs
- DefaultTraceListener.cs
- WindowsButton.cs
- WithParamAction.cs
- TreeView.cs
- LockedBorderGlyph.cs
- ParserStack.cs
- StreamUpdate.cs
- TransformConverter.cs
- ToolStripLocationCancelEventArgs.cs
- RawStylusInput.cs
- DefaultTextStore.cs
- GPPOINT.cs
- CmsInterop.cs
- ImageListUtils.cs
- ImageMapEventArgs.cs
- ReflectTypeDescriptionProvider.cs
- ProgramPublisher.cs
- securestring.cs
- Missing.cs
- TableLayoutPanelCodeDomSerializer.cs
- TogglePatternIdentifiers.cs
- localization.cs
- TransformConverter.cs
- EditorPartCollection.cs
- GeneratedCodeAttribute.cs
- TextParaClient.cs
- SynchronizedDispatch.cs
- ActiveXHelper.cs
- ApplicationContext.cs
- SymLanguageType.cs
- PropertyValueChangedEvent.cs
- ByteStack.cs
- RotateTransform.cs
- FormViewUpdateEventArgs.cs
- TrackBarRenderer.cs
- DbReferenceCollection.cs
- Calendar.cs
- IsolatedStoragePermission.cs
- WhereQueryOperator.cs
- WindowsGraphicsWrapper.cs
- _TransmitFileOverlappedAsyncResult.cs
- StateMachineAction.cs
- GridToolTip.cs
- Point4D.cs
- Mappings.cs
- ResXResourceSet.cs
- HtmlButton.cs
- RadioButtonPopupAdapter.cs
- DataPagerCommandEventArgs.cs
- GridLength.cs
- DiagnosticEventProvider.cs
- _DigestClient.cs
- CanExecuteRoutedEventArgs.cs
- OdbcStatementHandle.cs
- BindingList.cs
- Color.cs
- NetPeerTcpBinding.cs
- TextViewSelectionProcessor.cs
- EntityViewGenerationConstants.cs
- SendMailErrorEventArgs.cs
- ConfigurationPropertyAttribute.cs
- Rect.cs
- XmlPreloadedResolver.cs
- VisualTreeUtils.cs
- ContractNamespaceAttribute.cs
- FrameDimension.cs
- ShapingEngine.cs
- VisualBasicSettingsConverter.cs
- WMIGenerator.cs
- WebCategoryAttribute.cs