File: WebServiceMethodData.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (201 lines) | stat: -rw-r--r-- 7,798 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
//------------------------------------------------------------------------------
// <copyright file="WebServiceMethodData.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------

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<string, WebServiceParameterData> _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<string, WebServiceParameterData> 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<string, WebServiceParameterData> parameterData = new Dictionary<string, WebServiceParameterData>();
                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<string, WebServiceParameterData> ParameterDataDictionary {
            get {
                EnsureParameters();
                return _parameterData;
            }
        }

        internal ICollection<WebServiceParameterData> 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<string, object> 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<string, object> 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<string, object> StrongTypeParameters(IDictionary<string, object> rawParams) {
            Debug.Assert(ParameterDataDictionary != null);
            IDictionary<string, WebServiceParameterData> paramDataDictionary = ParameterDataDictionary;

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

            // Go through all the raw parameters
            foreach (KeyValuePair<string, object> 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;
        }
    }
}