WebServiceMethodData.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / xsp / System / Web / Extensions / Script / Services / WebServiceMethodData.cs / 1 / WebServiceMethodData.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

using System.Collections.Generic; 
using System.Diagnostics; 
using System.Globalization;
using System.Reflection; 
using System.Web.Resources;
using System.Web.Script.Serialization;
using System.Web.Services;
 
namespace System.Web.Script.Services {
 
    internal class WebServiceMethodData { 
        private MethodInfo _methodInfo;
        private WebMethodAttribute _webMethodAttribute; 
        private ScriptMethodAttribute _scriptMethodAttribute;
        private string _methodName;
        private Dictionary _parameterData;
        private WebServiceData _owner; 
        private bool? _useHttpGet;
 
        internal WebServiceMethodData(WebServiceData owner, MethodInfo methodInfo, WebMethodAttribute webMethodAttribute, ScriptMethodAttribute scriptMethodAttribute) { 
            _owner = owner;
            _methodInfo = methodInfo; 
            _webMethodAttribute = webMethodAttribute;
            _methodName = _webMethodAttribute.MessageName;
            _scriptMethodAttribute = scriptMethodAttribute;
            if (String.IsNullOrEmpty(_methodName)) { 
                _methodName = methodInfo.Name;
            } 
        } 

        // This constructor is only used by WCF. Owener, MethodName, ParameterDataDictionary, ParamterData 
        // are the only valid properties in WCF case.
        internal WebServiceMethodData(WebServiceData owner, string methodName, Dictionary parameterData, bool useHttpGet) {
            _owner = owner;
            _methodName = methodName; 
            _parameterData = parameterData;
            _useHttpGet = useHttpGet; 
        } 

        internal WebServiceData Owner { 
            get {
                return _owner;
            }
        } 

        private void EnsureParameters() { 
 
            // Build the parameters collection on demand
            if (_parameterData != null) 
                return;

            lock (this) {
                Dictionary parameterData = new Dictionary(); 
                int index = 0;
                foreach (ParameterInfo param in _methodInfo.GetParameters()) { 
                    parameterData[param.Name] = new WebServiceParameterData(param, index); 
                    index++;
                } 
                _parameterData = parameterData;
            }
        }
 
        internal string MethodName {
            get { 
                return _methodName; 
            }
        } 

        internal MethodInfo MethodInfo {
            get {
                return _methodInfo; 
            }
        } 
 
        internal IDictionary ParameterDataDictionary {
            get { 
                EnsureParameters();
                return _parameterData;
            }
        } 

        internal ICollection ParameterDatas { 
            get { 
                return ParameterDataDictionary.Values;
            } 
        }

        internal int CacheDuration {
            get { 
                Debug.Assert(_webMethodAttribute != null); // If fails: WebserviceMethodData corrosponding to WCF is being used by ASMX JSON handler
                return _webMethodAttribute.CacheDuration; 
            } 
        }
 
        internal bool RequiresSession {
            get {
                Debug.Assert(_webMethodAttribute != null); // If fails: WebserviceMethodData corrosponding to WCF is being used by ASMX JSON handler
                return _webMethodAttribute.EnableSession; 
            }
        } 
 
        internal bool IsStatic {
            get { 
                Debug.Assert(_methodInfo != null); // If fails: WebserviceMethodData corrosponding to WCF is being used by ASMX JSON handler
                return _methodInfo.IsStatic;
            }
        } 

        internal Type ReturnType { 
            get { 
                Debug.Assert(_methodInfo != null); // If fails: WebserviceMethodData corrosponding to WCF is being used by ASMX JSON handler
                return (_methodInfo == null) ? null : _methodInfo.ReturnType; 
            }
        }

        internal bool UseXmlResponse { 
            get {
                if (_scriptMethodAttribute != null) { 
                    return _scriptMethodAttribute.ResponseFormat == ResponseFormat.Xml; 
                }
                return false; 
            }
        }

        internal bool XmlSerializeString { 
            get {
                if (_scriptMethodAttribute != null) { 
                    return _scriptMethodAttribute.XmlSerializeString; 
                }
                return false; 
            }
        }

        internal bool UseGet { 
            get {
                if (_useHttpGet != null) { 
                    return _useHttpGet.Value; 
                }
                if (_scriptMethodAttribute != null) { 
                    return _scriptMethodAttribute.UseHttpGet;
                }
                return false;
            } 
        }
 
        internal object CallMethodFromRawParams(object target, IDictionary parameters) { 
            // Process the 'raw' parameters so that we use strongly typed objects when possible
            parameters = StrongTypeParameters(parameters); 
            return CallMethod(target, parameters);
        }

        private object CallMethod(object target, IDictionary parameters) { 
            // Make sure we have all the data about this method's parameters
            EnsureParameters(); 
 
            // Allocate an object array for all the formal parameters (whether passed in or not)
            object[] actualParams = new object[_parameterData.Count]; 

            // Go through all the actual parameters
            foreach (WebServiceParameterData paramData in _parameterData.Values) {
                object value; 
                if (parameters.TryGetValue(paramData.ParameterInfo.Name, out value)) {
                    actualParams[paramData.Index] = value; 
                } 
                else {
                    throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, AtlasWeb.WebService_MissingArg, paramData.ParameterInfo.Name)); 
                }
            }

            // Make the actual method call 
            return _methodInfo.Invoke(target, actualParams);
        } 
 
        private IDictionary StrongTypeParameters(IDictionary rawParams) {
            Debug.Assert(ParameterDataDictionary != null); 
            IDictionary paramDataDictionary = ParameterDataDictionary;

            // Allocate a dictionary to hold the processed parameters.
            IDictionary result = new Dictionary(rawParams.Count); 

            // Go through all the raw parameters 
            foreach (KeyValuePair pair in rawParams) { 
                string memberName = pair.Key;
                if (paramDataDictionary.ContainsKey(memberName)) { 
                    // Get the type of the formal parameter
                    Type paramType = paramDataDictionary[memberName].ParameterInfo.ParameterType;

                    // Convert the raw parameter based on that type 
                    result[memberName] = ObjectConverter.ConvertObjectToType(pair.Value, paramType, Owner.Serializer);
                } 
            } 
            return result;
        } 
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

using System.Collections.Generic; 
using System.Diagnostics; 
using System.Globalization;
using System.Reflection; 
using System.Web.Resources;
using System.Web.Script.Serialization;
using System.Web.Services;
 
namespace System.Web.Script.Services {
 
    internal class WebServiceMethodData { 
        private MethodInfo _methodInfo;
        private WebMethodAttribute _webMethodAttribute; 
        private ScriptMethodAttribute _scriptMethodAttribute;
        private string _methodName;
        private Dictionary _parameterData;
        private WebServiceData _owner; 
        private bool? _useHttpGet;
 
        internal WebServiceMethodData(WebServiceData owner, MethodInfo methodInfo, WebMethodAttribute webMethodAttribute, ScriptMethodAttribute scriptMethodAttribute) { 
            _owner = owner;
            _methodInfo = methodInfo; 
            _webMethodAttribute = webMethodAttribute;
            _methodName = _webMethodAttribute.MessageName;
            _scriptMethodAttribute = scriptMethodAttribute;
            if (String.IsNullOrEmpty(_methodName)) { 
                _methodName = methodInfo.Name;
            } 
        } 

        // This constructor is only used by WCF. Owener, MethodName, ParameterDataDictionary, ParamterData 
        // are the only valid properties in WCF case.
        internal WebServiceMethodData(WebServiceData owner, string methodName, Dictionary parameterData, bool useHttpGet) {
            _owner = owner;
            _methodName = methodName; 
            _parameterData = parameterData;
            _useHttpGet = useHttpGet; 
        } 

        internal WebServiceData Owner { 
            get {
                return _owner;
            }
        } 

        private void EnsureParameters() { 
 
            // Build the parameters collection on demand
            if (_parameterData != null) 
                return;

            lock (this) {
                Dictionary parameterData = new Dictionary(); 
                int index = 0;
                foreach (ParameterInfo param in _methodInfo.GetParameters()) { 
                    parameterData[param.Name] = new WebServiceParameterData(param, index); 
                    index++;
                } 
                _parameterData = parameterData;
            }
        }
 
        internal string MethodName {
            get { 
                return _methodName; 
            }
        } 

        internal MethodInfo MethodInfo {
            get {
                return _methodInfo; 
            }
        } 
 
        internal IDictionary ParameterDataDictionary {
            get { 
                EnsureParameters();
                return _parameterData;
            }
        } 

        internal ICollection ParameterDatas { 
            get { 
                return ParameterDataDictionary.Values;
            } 
        }

        internal int CacheDuration {
            get { 
                Debug.Assert(_webMethodAttribute != null); // If fails: WebserviceMethodData corrosponding to WCF is being used by ASMX JSON handler
                return _webMethodAttribute.CacheDuration; 
            } 
        }
 
        internal bool RequiresSession {
            get {
                Debug.Assert(_webMethodAttribute != null); // If fails: WebserviceMethodData corrosponding to WCF is being used by ASMX JSON handler
                return _webMethodAttribute.EnableSession; 
            }
        } 
 
        internal bool IsStatic {
            get { 
                Debug.Assert(_methodInfo != null); // If fails: WebserviceMethodData corrosponding to WCF is being used by ASMX JSON handler
                return _methodInfo.IsStatic;
            }
        } 

        internal Type ReturnType { 
            get { 
                Debug.Assert(_methodInfo != null); // If fails: WebserviceMethodData corrosponding to WCF is being used by ASMX JSON handler
                return (_methodInfo == null) ? null : _methodInfo.ReturnType; 
            }
        }

        internal bool UseXmlResponse { 
            get {
                if (_scriptMethodAttribute != null) { 
                    return _scriptMethodAttribute.ResponseFormat == ResponseFormat.Xml; 
                }
                return false; 
            }
        }

        internal bool XmlSerializeString { 
            get {
                if (_scriptMethodAttribute != null) { 
                    return _scriptMethodAttribute.XmlSerializeString; 
                }
                return false; 
            }
        }

        internal bool UseGet { 
            get {
                if (_useHttpGet != null) { 
                    return _useHttpGet.Value; 
                }
                if (_scriptMethodAttribute != null) { 
                    return _scriptMethodAttribute.UseHttpGet;
                }
                return false;
            } 
        }
 
        internal object CallMethodFromRawParams(object target, IDictionary parameters) { 
            // Process the 'raw' parameters so that we use strongly typed objects when possible
            parameters = StrongTypeParameters(parameters); 
            return CallMethod(target, parameters);
        }

        private object CallMethod(object target, IDictionary parameters) { 
            // Make sure we have all the data about this method's parameters
            EnsureParameters(); 
 
            // Allocate an object array for all the formal parameters (whether passed in or not)
            object[] actualParams = new object[_parameterData.Count]; 

            // Go through all the actual parameters
            foreach (WebServiceParameterData paramData in _parameterData.Values) {
                object value; 
                if (parameters.TryGetValue(paramData.ParameterInfo.Name, out value)) {
                    actualParams[paramData.Index] = value; 
                } 
                else {
                    throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, AtlasWeb.WebService_MissingArg, paramData.ParameterInfo.Name)); 
                }
            }

            // Make the actual method call 
            return _methodInfo.Invoke(target, actualParams);
        } 
 
        private IDictionary StrongTypeParameters(IDictionary rawParams) {
            Debug.Assert(ParameterDataDictionary != null); 
            IDictionary paramDataDictionary = ParameterDataDictionary;

            // Allocate a dictionary to hold the processed parameters.
            IDictionary result = new Dictionary(rawParams.Count); 

            // Go through all the raw parameters 
            foreach (KeyValuePair pair in rawParams) { 
                string memberName = pair.Key;
                if (paramDataDictionary.ContainsKey(memberName)) { 
                    // Get the type of the formal parameter
                    Type paramType = paramDataDictionary[memberName].ParameterInfo.ParameterType;

                    // Convert the raw parameter based on that type 
                    result[memberName] = ObjectConverter.ConvertObjectToType(pair.Value, paramType, Owner.Serializer);
                } 
            } 
            return result;
        } 
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.

                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK