e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
277 lines
9.6 KiB
C#
277 lines
9.6 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="SoapServerMethod.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.Web.Services.Protocols {
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
using System.Web.Services;
|
|
using System.Web.Services.Description;
|
|
using System.Xml;
|
|
using System.Xml.Serialization;
|
|
using System.Security;
|
|
using System.Security.Permissions;
|
|
using System.Security.Policy;
|
|
using System.Web.Services.Diagnostics;
|
|
|
|
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
|
|
public sealed class SoapServerMethod {
|
|
//
|
|
// Internal field visibility is maintained for
|
|
// compatibility with existing code.
|
|
//
|
|
internal LogicalMethodInfo methodInfo;
|
|
internal XmlSerializer returnSerializer;
|
|
internal XmlSerializer parameterSerializer;
|
|
internal XmlSerializer inHeaderSerializer;
|
|
internal XmlSerializer outHeaderSerializer;
|
|
internal SoapHeaderMapping[] inHeaderMappings;
|
|
internal SoapHeaderMapping[] outHeaderMappings;
|
|
internal SoapReflectedExtension[] extensions;
|
|
internal object[] extensionInitializers;
|
|
internal string action;
|
|
internal bool oneWay;
|
|
internal bool rpc;
|
|
internal SoapBindingUse use;
|
|
internal SoapParameterStyle paramStyle;
|
|
internal WsiProfiles wsiClaims;
|
|
|
|
public SoapServerMethod() {
|
|
}
|
|
|
|
public SoapServerMethod(Type serverType, LogicalMethodInfo methodInfo) {
|
|
this.methodInfo = methodInfo;
|
|
|
|
//
|
|
// Set up the XmlImporter, the SoapImporter, and acquire
|
|
// the ServiceAttribute on the serverType for use in
|
|
// creating a SoapReflectedMethod.
|
|
//
|
|
WebServiceAttribute serviceAttribute = WebServiceReflector.GetAttribute(serverType);
|
|
string serviceNamespace = serviceAttribute.Namespace;
|
|
bool serviceDefaultIsEncoded = SoapReflector.ServiceDefaultIsEncoded(serverType);
|
|
|
|
SoapReflectionImporter soapImporter = SoapReflector.CreateSoapImporter(serviceNamespace, serviceDefaultIsEncoded);
|
|
XmlReflectionImporter xmlImporter = SoapReflector.CreateXmlImporter(serviceNamespace, serviceDefaultIsEncoded);
|
|
|
|
//
|
|
// Add some types relating to the methodInfo into the two importers
|
|
//
|
|
SoapReflector.IncludeTypes(methodInfo, soapImporter);
|
|
WebMethodReflector.IncludeTypes(methodInfo, xmlImporter);
|
|
|
|
//
|
|
// Create a SoapReflectedMethod by reflecting on the
|
|
// LogicalMethodInfo passed to us.
|
|
//
|
|
SoapReflectedMethod soapMethod = SoapReflector.ReflectMethod(methodInfo, false, xmlImporter, soapImporter, serviceNamespace);
|
|
|
|
//
|
|
// Most of the fields in this class are ----ed in from the reflected information
|
|
//
|
|
ImportReflectedMethod(soapMethod);
|
|
ImportSerializers(soapMethod, GetServerTypeEvidence(serverType));
|
|
ImportHeaderSerializers(soapMethod);
|
|
}
|
|
|
|
public LogicalMethodInfo MethodInfo {
|
|
get {
|
|
return methodInfo;
|
|
}
|
|
}
|
|
|
|
public XmlSerializer ReturnSerializer {
|
|
get {
|
|
return returnSerializer;
|
|
}
|
|
}
|
|
|
|
public XmlSerializer ParameterSerializer {
|
|
get {
|
|
return parameterSerializer;
|
|
}
|
|
}
|
|
|
|
public XmlSerializer InHeaderSerializer {
|
|
get {
|
|
return inHeaderSerializer;
|
|
}
|
|
}
|
|
|
|
public XmlSerializer OutHeaderSerializer {
|
|
get {
|
|
return outHeaderSerializer;
|
|
}
|
|
}
|
|
|
|
//
|
|
//
|
|
|
|
public SoapHeaderMapping[] InHeaderMappings {
|
|
get {
|
|
return inHeaderMappings;
|
|
}
|
|
}
|
|
|
|
//
|
|
//
|
|
|
|
public SoapHeaderMapping[] OutHeaderMappings {
|
|
get {
|
|
return outHeaderMappings;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* WSE3 does not require access to Extension data
|
|
*
|
|
public SoapReflectedExtension[] Extensions
|
|
{
|
|
get
|
|
{
|
|
return extensions;
|
|
}
|
|
}
|
|
|
|
public object[] ExtensionInitializers
|
|
{
|
|
get
|
|
{
|
|
return extensionInitializers;
|
|
}
|
|
}
|
|
*/
|
|
|
|
public string Action {
|
|
get {
|
|
return action;
|
|
}
|
|
}
|
|
|
|
public bool OneWay {
|
|
get {
|
|
return oneWay;
|
|
}
|
|
}
|
|
|
|
public bool Rpc {
|
|
get {
|
|
return rpc;
|
|
}
|
|
}
|
|
|
|
public SoapBindingUse BindingUse {
|
|
get {
|
|
return use;
|
|
}
|
|
}
|
|
|
|
public SoapParameterStyle ParameterStyle {
|
|
get {
|
|
return paramStyle;
|
|
}
|
|
}
|
|
|
|
public WsiProfiles WsiClaims {
|
|
get {
|
|
return wsiClaims;
|
|
}
|
|
}
|
|
|
|
[SecurityPermission(SecurityAction.Assert, ControlEvidence = true)]
|
|
private Evidence GetServerTypeEvidence(Type type) {
|
|
return type.Assembly.Evidence;
|
|
}
|
|
|
|
private List<XmlMapping> GetXmlMappingsForMethod(SoapReflectedMethod soapMethod) {
|
|
List<XmlMapping> mappings = new List<XmlMapping>();
|
|
mappings.Add(soapMethod.requestMappings);
|
|
if (soapMethod.responseMappings != null) {
|
|
mappings.Add(soapMethod.responseMappings);
|
|
}
|
|
mappings.Add(soapMethod.inHeaderMappings);
|
|
if (soapMethod.outHeaderMappings != null) {
|
|
mappings.Add(soapMethod.outHeaderMappings);
|
|
}
|
|
|
|
return mappings;
|
|
}
|
|
|
|
private void ImportReflectedMethod(SoapReflectedMethod soapMethod) {
|
|
this.action = soapMethod.action;
|
|
this.extensions = soapMethod.extensions;
|
|
this.extensionInitializers = SoapReflectedExtension.GetInitializers(this.methodInfo, soapMethod.extensions);
|
|
this.oneWay = soapMethod.oneWay;
|
|
this.rpc = soapMethod.rpc;
|
|
this.use = soapMethod.use;
|
|
this.paramStyle = soapMethod.paramStyle;
|
|
this.wsiClaims = soapMethod.binding == null ? WsiProfiles.None : soapMethod.binding.ConformsTo;
|
|
}
|
|
|
|
private void ImportHeaderSerializers(SoapReflectedMethod soapMethod) {
|
|
List<SoapHeaderMapping> inHeaders = new List<SoapHeaderMapping>();
|
|
List<SoapHeaderMapping> outHeaders = new List<SoapHeaderMapping>();
|
|
|
|
for (int j = 0; j < soapMethod.headers.Length; j++) {
|
|
SoapHeaderMapping mapping = new SoapHeaderMapping();
|
|
SoapReflectedHeader soapHeader = soapMethod.headers[j];
|
|
mapping.memberInfo = soapHeader.memberInfo;
|
|
mapping.repeats = soapHeader.repeats;
|
|
mapping.custom = soapHeader.custom;
|
|
mapping.direction = soapHeader.direction;
|
|
mapping.headerType = soapHeader.headerType;
|
|
if (mapping.direction == SoapHeaderDirection.In)
|
|
inHeaders.Add(mapping);
|
|
else if (mapping.direction == SoapHeaderDirection.Out)
|
|
outHeaders.Add(mapping);
|
|
else {
|
|
inHeaders.Add(mapping);
|
|
outHeaders.Add(mapping);
|
|
}
|
|
}
|
|
|
|
this.inHeaderMappings = inHeaders.ToArray();
|
|
if (this.outHeaderSerializer != null)
|
|
this.outHeaderMappings = outHeaders.ToArray();
|
|
}
|
|
|
|
private void ImportSerializers(SoapReflectedMethod soapMethod, Evidence serverEvidence) {
|
|
//
|
|
// Keep track of all XmlMapping instances we need for this method.
|
|
//
|
|
List<XmlMapping> mappings = GetXmlMappingsForMethod(soapMethod);
|
|
|
|
//
|
|
// Generate serializers from those XmlMappings
|
|
//
|
|
|
|
XmlMapping[] xmlMappings = mappings.ToArray();
|
|
TraceMethod caller = Tracing.On ? new TraceMethod(this, "ImportSerializers") : null;
|
|
if (Tracing.On) Tracing.Enter(Tracing.TraceId(Res.TraceCreateSerializer), caller, new TraceMethod(typeof(XmlSerializer), "FromMappings", xmlMappings, serverEvidence));
|
|
XmlSerializer[] serializers = null;
|
|
if (AppDomain.CurrentDomain.IsHomogenous) {
|
|
serializers = XmlSerializer.FromMappings(xmlMappings);
|
|
}
|
|
else {
|
|
#pragma warning disable 618 // If we're in a non-homogenous domain, legacy CAS mode is enabled, so passing through evidence will not fail
|
|
serializers = XmlSerializer.FromMappings(xmlMappings, serverEvidence);
|
|
#pragma warning restore 618
|
|
}
|
|
if (Tracing.On) Tracing.Exit(Tracing.TraceId(Res.TraceCreateSerializer), caller);
|
|
|
|
int i = 0;
|
|
this.parameterSerializer = serializers[i++];
|
|
if (soapMethod.responseMappings != null) {
|
|
this.returnSerializer = serializers[i++];
|
|
}
|
|
this.inHeaderSerializer = serializers[i++];
|
|
if (soapMethod.outHeaderMappings != null) {
|
|
this.outHeaderSerializer = serializers[i++];
|
|
}
|
|
}
|
|
}
|
|
}
|