Code:
/ DotNET / DotNET / 8.0 / untmp / Orcas / RTM / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XmlElementList.cs
- PKCS1MaskGenerationMethod.cs
- XmlNodeChangedEventManager.cs
- DbReferenceCollection.cs
- SelectionGlyph.cs
- UIElementHelper.cs
- AtomPub10CategoriesDocumentFormatter.cs
- WebEvents.cs
- LineProperties.cs
- MenuTracker.cs
- ClientType.cs
- XmlMemberMapping.cs
- EditingCoordinator.cs
- BinHexDecoder.cs
- OptimizerPatterns.cs
- PixelFormat.cs
- ParseHttpDate.cs
- EntityClientCacheKey.cs
- ImportContext.cs
- DBParameter.cs
- Dictionary.cs
- AttributeUsageAttribute.cs
- BindableTemplateBuilder.cs
- DataRowChangeEvent.cs
- ConsumerConnectionPointCollection.cs
- HttpCacheVary.cs
- StorageMappingFragment.cs
- FormsAuthenticationTicket.cs
- ActionNotSupportedException.cs
- ObjectDataSourceEventArgs.cs
- ControlPropertyNameConverter.cs
- TraceHandlerErrorFormatter.cs
- WmlValidatorAdapter.cs
- WS2007HttpBindingCollectionElement.cs
- BaseUriHelper.cs
- SrgsNameValueTag.cs
- UIElementParagraph.cs
- HMAC.cs
- RegistryPermission.cs
- SelectedDatesCollection.cs
- Variant.cs
- Control.cs
- Attributes.cs
- DesignerAdRotatorAdapter.cs
- CaseStatementProjectedSlot.cs
- SourceItem.cs
- SingleResultAttribute.cs
- AssemblyInfo.cs
- DrawingGroupDrawingContext.cs
- Pair.cs
- WSSecurityOneDotOneSendSecurityHeader.cs
- SafeEventHandle.cs
- ConnectionStringSettingsCollection.cs
- ClockController.cs
- SoapIncludeAttribute.cs
- ChangeConflicts.cs
- TypeListConverter.cs
- InheritanceContextChangedEventManager.cs
- ValueExpressions.cs
- RadioButtonAutomationPeer.cs
- ServiceAuthorizationElement.cs
- XamlVector3DCollectionSerializer.cs
- DynamicEntity.cs
- FlowNode.cs
- SQLString.cs
- thaishape.cs
- Msec.cs
- DependencyPropertyKey.cs
- VerbConverter.cs
- OperatingSystem.cs
- EmptyReadOnlyDictionaryInternal.cs
- ISAPIApplicationHost.cs
- SecurityPolicyVersion.cs
- AnnotationMap.cs
- NotificationContext.cs
- TreeViewImageIndexConverter.cs
- RepeatEnumerable.cs
- PartialTrustVisibleAssembly.cs
- ManagedWndProcTracker.cs
- AuthenticationService.cs
- CultureInfoConverter.cs
- Encoder.cs
- BamlTreeNode.cs
- cryptoapiTransform.cs
- InternalBufferOverflowException.cs
- WindowsRebar.cs
- AndCondition.cs
- DesignerTransactionCloseEvent.cs
- EntityDataSourceReferenceGroup.cs
- SystemIPv6InterfaceProperties.cs
- TableLayoutSettingsTypeConverter.cs
- CompositeTypefaceMetrics.cs
- SchemaElementDecl.cs
- OperationCanceledException.cs
- AncestorChangedEventArgs.cs
- UdpTransportBindingElement.cs
- SafeCryptoHandles.cs
- PageCatalogPart.cs
- ObjectContext.cs
- XmlSiteMapProvider.cs