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
- WebExceptionStatus.cs
- DefaultAsyncDataDispatcher.cs
- DataSourceSelectArguments.cs
- LogicalExpr.cs
- PermissionSetEnumerator.cs
- MenuScrollingVisibilityConverter.cs
- GeneralTransform2DTo3D.cs
- BamlRecords.cs
- URI.cs
- TextChangedEventArgs.cs
- UserPersonalizationStateInfo.cs
- CachingHintValidation.cs
- InheritanceAttribute.cs
- HttpPostClientProtocol.cs
- BuildProviderAppliesToAttribute.cs
- SchemaMapping.cs
- DataBoundControlDesigner.cs
- DataControlLinkButton.cs
- CodeObjectCreateExpression.cs
- HostingEnvironmentSection.cs
- ViewDesigner.cs
- TextDecorationCollection.cs
- XmlSecureResolver.cs
- ContextMenuStripGroup.cs
- IPGlobalProperties.cs
- Bits.cs
- OracleConnectionString.cs
- Choices.cs
- DialogResultConverter.cs
- UIElementHelper.cs
- MetaChildrenColumn.cs
- Blend.cs
- PrinterSettings.cs
- WebConfigurationFileMap.cs
- FlowLayoutSettings.cs
- UITypeEditor.cs
- SemanticAnalyzer.cs
- NameValuePermission.cs
- Tablet.cs
- OdbcDataReader.cs
- DataGridCaption.cs
- GeneralTransform3DTo2D.cs
- TextProperties.cs
- SqlDataSource.cs
- DataGridColumn.cs
- ContractHandle.cs
- ProgressPage.cs
- WindowsListBox.cs
- DrawingBrush.cs
- Stream.cs
- UserNameSecurityTokenAuthenticator.cs
- EventLogPermissionAttribute.cs
- AudienceUriMode.cs
- RequestQueue.cs
- JournalEntryListConverter.cs
- LocalizableResourceBuilder.cs
- FileNotFoundException.cs
- TriggerBase.cs
- ZipIOExtraFieldPaddingElement.cs
- UniqueEventHelper.cs
- SQLUtility.cs
- WorkflowDesignerColors.cs
- PnrpPermission.cs
- CodeConditionStatement.cs
- WorkflowMarkupSerializer.cs
- DoubleUtil.cs
- XPathNodeIterator.cs
- DESCryptoServiceProvider.cs
- ContainerFilterService.cs
- DataBoundControlAdapter.cs
- ServiceObjectContainer.cs
- ProcessHostServerConfig.cs
- TaskFileService.cs
- NoneExcludedImageIndexConverter.cs
- PenThreadPool.cs
- ExtentJoinTreeNode.cs
- SymbolType.cs
- HtmlGenericControl.cs
- KeyInfo.cs
- xmlglyphRunInfo.cs
- TextBlockAutomationPeer.cs
- ParseElement.cs
- RoleProviderPrincipal.cs
- TimeSpanMinutesOrInfiniteConverter.cs
- RadioButtonRenderer.cs
- InstanceContextManager.cs
- StrongName.cs
- ReadOnlyHierarchicalDataSource.cs
- ToolStripRendererSwitcher.cs
- TypeForwardedFromAttribute.cs
- KeyConverter.cs
- TextTreeObjectNode.cs
- ErrorRuntimeConfig.cs
- TraceContextEventArgs.cs
- SoapAttributeAttribute.cs
- RemotingAttributes.cs
- OutputScopeManager.cs
- DataGridViewEditingControlShowingEventArgs.cs
- WindowsSolidBrush.cs
- _NetworkingPerfCounters.cs