Methods.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. //
  2. // Methods.cs: Information about a method and its mapping to a SOAP web service.
  3. //
  4. // Author:
  5. // Miguel de Icaza
  6. // Lluis Sanchez Gual ([email protected])
  7. //
  8. // (C) 2003 Ximian, Inc.
  9. //
  10. //
  11. // Permission is hereby granted, free of charge, to any person obtaining
  12. // a copy of this software and associated documentation files (the
  13. // "Software"), to deal in the Software without restriction, including
  14. // without limitation the rights to use, copy, modify, merge, publish,
  15. // distribute, sublicense, and/or sell copies of the Software, and to
  16. // permit persons to whom the Software is furnished to do so, subject to
  17. // the following conditions:
  18. //
  19. // The above copyright notice and this permission notice shall be
  20. // included in all copies or substantial portions of the Software.
  21. //
  22. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  23. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  24. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  25. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  26. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  27. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29. //
  30. using HeaderInfo = System.Web.Services.Protocols.SoapHeaderMapping;
  31. using System.Reflection;
  32. using System.Collections;
  33. using System.Xml;
  34. using System.Xml.Serialization;
  35. using System.Web.Services;
  36. using System.Web.Services.Description;
  37. namespace System.Web.Services.Protocols {
  38. //
  39. // This class represents all the information we extract from a MethodInfo
  40. // in the SoapHttpClientProtocol derivative stub class
  41. //
  42. internal class SoapMethodStubInfo : MethodStubInfo
  43. {
  44. internal string Action;
  45. internal string Binding;
  46. // The name/namespace of the request
  47. internal string RequestName;
  48. internal string RequestNamespace;
  49. // The name/namespace of the response.
  50. internal string ResponseName;
  51. internal string ResponseNamespace;
  52. internal bool OneWay;
  53. internal SoapParameterStyle ParameterStyle;
  54. internal SoapBindingStyle SoapBindingStyle;
  55. internal SoapBindingUse Use;
  56. internal HeaderInfo[] Headers;
  57. internal HeaderInfo[] InHeaders;
  58. internal HeaderInfo[] OutHeaders;
  59. internal HeaderInfo[] FaultHeaders;
  60. internal SoapExtensionRuntimeConfig[] SoapExtensions;
  61. internal XmlMembersMapping InputMembersMapping;
  62. internal XmlMembersMapping OutputMembersMapping;
  63. internal XmlMembersMapping InputHeaderMembersMapping;
  64. internal XmlMembersMapping OutputHeaderMembersMapping;
  65. internal XmlMembersMapping FaultHeaderMembersMapping;
  66. private int requestSerializerId;
  67. private int responseSerializerId;
  68. private int requestHeadersSerializerId = -1;
  69. private int responseHeadersSerializerId = -1;
  70. private int faultHeadersSerializerId = -1;
  71. internal XmlSerializer RequestSerializer
  72. {
  73. get { return TypeStub.GetSerializer (requestSerializerId); }
  74. }
  75. internal XmlSerializer ResponseSerializer
  76. {
  77. get { return TypeStub.GetSerializer (responseSerializerId); }
  78. }
  79. internal XmlSerializer RequestHeadersSerializer
  80. {
  81. get { return requestHeadersSerializerId != -1 ? TypeStub.GetSerializer (requestHeadersSerializerId) : null; }
  82. }
  83. internal XmlSerializer ResponseHeadersSerializer
  84. {
  85. get { return responseHeadersSerializerId != -1 ? TypeStub.GetSerializer (responseHeadersSerializerId) : null; }
  86. }
  87. internal XmlSerializer FaultHeadersSerializer
  88. {
  89. get { return faultHeadersSerializerId != -1 ? TypeStub.GetSerializer (faultHeadersSerializerId) : null; }
  90. }
  91. //
  92. // Constructor
  93. //
  94. public SoapMethodStubInfo (TypeStubInfo typeStub, LogicalMethodInfo source, object kind, XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter)
  95. : base (typeStub, source)
  96. {
  97. SoapTypeStubInfo parent = (SoapTypeStubInfo) typeStub;
  98. XmlElementAttribute optional_ns = null;
  99. if (kind == null) {
  100. Use = parent.Use;
  101. RequestName = "";
  102. RequestNamespace = "";
  103. ResponseName = "";
  104. ResponseNamespace = "";
  105. ParameterStyle = parent.ParameterStyle;
  106. SoapBindingStyle = parent.SoapBindingStyle;
  107. OneWay = false;
  108. }
  109. else if (kind is SoapDocumentMethodAttribute){
  110. SoapDocumentMethodAttribute dma = (SoapDocumentMethodAttribute) kind;
  111. Use = dma.Use;
  112. if (Use == SoapBindingUse.Default) {
  113. if (parent.SoapBindingStyle == SoapBindingStyle.Document)
  114. Use = parent.Use;
  115. else
  116. Use = SoapBindingUse.Literal;
  117. }
  118. Action = dma.Action;
  119. Binding = dma.Binding;
  120. RequestName = dma.RequestElementName;
  121. RequestNamespace = dma.RequestNamespace;
  122. ResponseName = dma.ResponseElementName;
  123. ResponseNamespace = dma.ResponseNamespace;
  124. ParameterStyle = dma.ParameterStyle;
  125. if (ParameterStyle == SoapParameterStyle.Default)
  126. ParameterStyle = parent.ParameterStyle;
  127. OneWay = dma.OneWay;
  128. SoapBindingStyle = SoapBindingStyle.Document;
  129. } else {
  130. SoapRpcMethodAttribute rma = (SoapRpcMethodAttribute) kind;
  131. Use = SoapBindingUse.Encoded; // RPC always use encoded
  132. Action = rma.Action;
  133. Binding = rma.Binding;
  134. // When using RPC, MS.NET seems to ignore RequestElementName and
  135. // MessageName, and it always uses the method name
  136. RequestName = source.Name;
  137. ResponseName = source.Name + "Response";
  138. // RequestName = rma.RequestElementName;
  139. // ResponseName = rma.ResponseElementName;
  140. RequestNamespace = rma.RequestNamespace;
  141. ResponseNamespace = rma.ResponseNamespace;
  142. ParameterStyle = SoapParameterStyle.Wrapped;
  143. OneWay = rma.OneWay;
  144. SoapBindingStyle = SoapBindingStyle.Rpc;
  145. // For RPC calls, make all arguments be part of the empty namespace
  146. optional_ns = new XmlElementAttribute ();
  147. optional_ns.Namespace = "";
  148. }
  149. if (OneWay){
  150. if (source.ReturnType != typeof (void))
  151. throw new Exception ("OneWay methods should not have a return value.");
  152. if (source.OutParameters.Length != 0)
  153. throw new Exception ("OneWay methods should not have out/ref parameters.");
  154. }
  155. BindingInfo binfo = parent.GetBinding (Binding);
  156. if (binfo == null) throw new InvalidOperationException ("Type '" + parent.Type + "' is missing WebServiceBinding attribute that defines a binding named '" + Binding + "'.");
  157. string serviceNamespace = binfo.Namespace;
  158. if (RequestNamespace == "") RequestNamespace = parent.LogicalType.GetWebServiceNamespace (serviceNamespace, Use);
  159. if (ResponseNamespace == "") ResponseNamespace = parent.LogicalType.GetWebServiceNamespace (serviceNamespace, Use);
  160. if (RequestName == "") RequestName = Name;
  161. if (ResponseName == "") ResponseName = Name + "Response";
  162. if (Action == null || Action == "")
  163. Action = serviceNamespace.EndsWith("/") ? (serviceNamespace + Name) : (serviceNamespace + "/" + Name);
  164. bool hasWrappingElem = (ParameterStyle == SoapParameterStyle.Wrapped);
  165. bool writeAccessors = (SoapBindingStyle == SoapBindingStyle.Rpc);
  166. XmlReflectionMember [] in_members = BuildRequestReflectionMembers (optional_ns);
  167. XmlReflectionMember [] out_members = BuildResponseReflectionMembers (optional_ns);
  168. if (Use == SoapBindingUse.Literal) {
  169. xmlImporter.IncludeTypes (source.CustomAttributeProvider);
  170. InputMembersMapping = xmlImporter.ImportMembersMapping (RequestName, RequestNamespace, in_members, hasWrappingElem);
  171. OutputMembersMapping = xmlImporter.ImportMembersMapping (ResponseName, ResponseNamespace, out_members, hasWrappingElem);
  172. }
  173. else {
  174. soapImporter.IncludeTypes (source.CustomAttributeProvider);
  175. InputMembersMapping = soapImporter.ImportMembersMapping (RequestName, RequestNamespace, in_members, hasWrappingElem, writeAccessors);
  176. OutputMembersMapping = soapImporter.ImportMembersMapping (ResponseName, ResponseNamespace, out_members, hasWrappingElem, writeAccessors);
  177. }
  178. requestSerializerId = parent.RegisterSerializer (InputMembersMapping);
  179. responseSerializerId = parent.RegisterSerializer (OutputMembersMapping);
  180. object[] o = source.GetCustomAttributes (typeof (SoapHeaderAttribute));
  181. ArrayList allHeaderList = new ArrayList (o.Length);
  182. ArrayList inHeaderList = new ArrayList (o.Length);
  183. ArrayList outHeaderList = new ArrayList (o.Length);
  184. ArrayList faultHeaderList = new ArrayList ();
  185. SoapHeaderDirection unknownHeaderDirections = (SoapHeaderDirection)0;
  186. for (int i = 0; i < o.Length; i++) {
  187. SoapHeaderAttribute att = (SoapHeaderAttribute) o[i];
  188. MemberInfo[] mems = source.DeclaringType.GetMember (att.MemberName);
  189. if (mems.Length == 0) throw new InvalidOperationException ("Member " + att.MemberName + " not found in class " + source.DeclaringType.FullName + ".");
  190. HeaderInfo header = new HeaderInfo (mems[0], att);
  191. allHeaderList.Add (header);
  192. if (!header.Custom) {
  193. if ((header.Direction & SoapHeaderDirection.In) != 0)
  194. inHeaderList.Add (header);
  195. if ((header.Direction & SoapHeaderDirection.Out) != 0)
  196. outHeaderList.Add (header);
  197. if ((header.Direction & SoapHeaderDirection.Fault) != 0)
  198. faultHeaderList.Add (header);
  199. } else
  200. unknownHeaderDirections |= header.Direction;
  201. }
  202. Headers = (HeaderInfo[]) allHeaderList.ToArray (typeof(HeaderInfo));
  203. if (inHeaderList.Count > 0 || (unknownHeaderDirections & SoapHeaderDirection.In) != 0) {
  204. InHeaders = (HeaderInfo[]) inHeaderList.ToArray (typeof(HeaderInfo));
  205. XmlReflectionMember[] members = BuildHeadersReflectionMembers (InHeaders);
  206. if (Use == SoapBindingUse.Literal)
  207. InputHeaderMembersMapping = xmlImporter.ImportMembersMapping ("", RequestNamespace, members, false);
  208. else
  209. InputHeaderMembersMapping = soapImporter.ImportMembersMapping ("", RequestNamespace, members, false, false);
  210. requestHeadersSerializerId = parent.RegisterSerializer (InputHeaderMembersMapping);
  211. }
  212. if (outHeaderList.Count > 0 || (unknownHeaderDirections & SoapHeaderDirection.Out) != 0) {
  213. OutHeaders = (HeaderInfo[]) outHeaderList.ToArray (typeof(HeaderInfo));
  214. XmlReflectionMember[] members = BuildHeadersReflectionMembers (OutHeaders);
  215. if (Use == SoapBindingUse.Literal)
  216. OutputHeaderMembersMapping = xmlImporter.ImportMembersMapping ("", RequestNamespace, members, false);
  217. else
  218. OutputHeaderMembersMapping = soapImporter.ImportMembersMapping ("", RequestNamespace, members, false, false);
  219. responseHeadersSerializerId = parent.RegisterSerializer (OutputHeaderMembersMapping);
  220. }
  221. if (faultHeaderList.Count > 0 || (unknownHeaderDirections & SoapHeaderDirection.Fault) != 0) {
  222. FaultHeaders = (HeaderInfo[]) faultHeaderList.ToArray (typeof(HeaderInfo));
  223. XmlReflectionMember[] members = BuildHeadersReflectionMembers (FaultHeaders);
  224. if (Use == SoapBindingUse.Literal)
  225. FaultHeaderMembersMapping = xmlImporter.ImportMembersMapping ("", RequestNamespace, members, false);
  226. else
  227. FaultHeaderMembersMapping = soapImporter.ImportMembersMapping ("", RequestNamespace, members, false, false);
  228. faultHeadersSerializerId = parent.RegisterSerializer (FaultHeaderMembersMapping);
  229. }
  230. SoapExtensions = SoapExtension.GetMethodExtensions (source);
  231. }
  232. XmlReflectionMember [] BuildRequestReflectionMembers (XmlElementAttribute optional_ns)
  233. {
  234. ParameterInfo [] input = MethodInfo.InParameters;
  235. XmlReflectionMember [] in_members = new XmlReflectionMember [input.Length];
  236. for (int i = 0; i < input.Length; i++)
  237. {
  238. XmlReflectionMember m = new XmlReflectionMember ();
  239. m.IsReturnValue = false;
  240. m.MemberName = input [i].Name;
  241. m.MemberType = input [i].ParameterType;
  242. m.XmlAttributes = new XmlAttributes (input[i]);
  243. m.SoapAttributes = new SoapAttributes (input[i]);
  244. if (m.MemberType.IsByRef)
  245. m.MemberType = m.MemberType.GetElementType ();
  246. if (optional_ns != null)
  247. m.XmlAttributes.XmlElements.Add (optional_ns);
  248. in_members [i] = m;
  249. }
  250. return in_members;
  251. }
  252. XmlReflectionMember [] BuildResponseReflectionMembers (XmlElementAttribute optional_ns)
  253. {
  254. ParameterInfo [] output = MethodInfo.OutParameters;
  255. bool has_return_value = !(OneWay || MethodInfo.ReturnType == typeof (void));
  256. XmlReflectionMember [] out_members = new XmlReflectionMember [(has_return_value ? 1 : 0) + output.Length];
  257. XmlReflectionMember m;
  258. int idx = 0;
  259. if (has_return_value)
  260. {
  261. m = new XmlReflectionMember ();
  262. m.IsReturnValue = true;
  263. m.MemberName = RequestName + "Result";
  264. m.MemberType = MethodInfo.ReturnType;
  265. m.XmlAttributes = new XmlAttributes (MethodInfo.ReturnTypeCustomAttributeProvider);
  266. m.SoapAttributes = new SoapAttributes (MethodInfo.ReturnTypeCustomAttributeProvider);
  267. if (optional_ns != null)
  268. m.XmlAttributes.XmlElements.Add (optional_ns);
  269. idx++;
  270. out_members [0] = m;
  271. }
  272. for (int i = 0; i < output.Length; i++)
  273. {
  274. m = new XmlReflectionMember ();
  275. m.IsReturnValue = false;
  276. m.MemberName = output [i].Name;
  277. m.MemberType = output [i].ParameterType;
  278. m.XmlAttributes = new XmlAttributes (output[i]);
  279. m.SoapAttributes = new SoapAttributes (output[i]);
  280. if (m.MemberType.IsByRef)
  281. m.MemberType = m.MemberType.GetElementType ();
  282. if (optional_ns != null)
  283. m.XmlAttributes.XmlElements.Add (optional_ns);
  284. out_members [i + idx] = m;
  285. }
  286. return out_members;
  287. }
  288. XmlReflectionMember [] BuildHeadersReflectionMembers (HeaderInfo[] headers)
  289. {
  290. XmlReflectionMember [] mems = new XmlReflectionMember [headers.Length];
  291. for (int n=0; n<headers.Length; n++)
  292. {
  293. HeaderInfo header = headers [n];
  294. XmlReflectionMember m = new XmlReflectionMember ();
  295. m.IsReturnValue = false;
  296. m.MemberName = header.HeaderType.Name;
  297. m.MemberType = header.HeaderType;
  298. // MS.NET reflects header classes in a weird way. The root element
  299. // name is the CLR class name unless it is specified in an XmlRootAttribute.
  300. // The usual is to use the xml type name by default, but not in this case.
  301. XmlAttributes ats = new XmlAttributes (header.HeaderType);
  302. if (ats.XmlRoot != null) {
  303. XmlElementAttribute xe = new XmlElementAttribute ();
  304. xe.ElementName = ats.XmlRoot.ElementName;
  305. xe.Namespace = ats.XmlRoot.Namespace;
  306. m.XmlAttributes = new XmlAttributes ();
  307. m.XmlAttributes.XmlElements.Add (xe);
  308. }
  309. mems [n] = m;
  310. }
  311. return mems;
  312. }
  313. public HeaderInfo GetHeaderInfo (Type headerType)
  314. {
  315. foreach (HeaderInfo headerInfo in Headers)
  316. if (headerInfo.HeaderType == headerType) return headerInfo;
  317. return null;
  318. }
  319. public XmlSerializer GetBodySerializer (SoapHeaderDirection dir, bool soap12)
  320. {
  321. switch (dir) {
  322. case SoapHeaderDirection.In: return RequestSerializer;
  323. case SoapHeaderDirection.Out: return ResponseSerializer;
  324. case SoapHeaderDirection.Fault: return soap12 ? Soap12Fault.Serializer : Fault.Serializer;
  325. default: return null;
  326. }
  327. }
  328. public XmlSerializer GetHeaderSerializer (SoapHeaderDirection dir)
  329. {
  330. switch (dir) {
  331. case SoapHeaderDirection.In: return RequestHeadersSerializer;
  332. case SoapHeaderDirection.Out: return ResponseHeadersSerializer;
  333. case SoapHeaderDirection.Fault: return FaultHeadersSerializer;
  334. default: return null;
  335. }
  336. }
  337. HeaderInfo[] GetHeaders (SoapHeaderDirection dir)
  338. {
  339. switch (dir) {
  340. case SoapHeaderDirection.In: return InHeaders;
  341. case SoapHeaderDirection.Out: return OutHeaders;
  342. case SoapHeaderDirection.Fault: return FaultHeaders;
  343. default: return null;
  344. }
  345. }
  346. public object[] GetHeaderValueArray (SoapHeaderDirection dir, SoapHeaderCollection headers)
  347. {
  348. HeaderInfo[] headerInfos = GetHeaders (dir);
  349. if (headerInfos == null) return null;
  350. object[] hs = new object [headerInfos.Length];
  351. for (int n=0; n<headers.Count; n++) {
  352. SoapHeader h = headers[n];
  353. Type t = h.GetType();
  354. for (int i=0; i<headerInfos.Length; i++)
  355. if (headerInfos [i].HeaderType == t)
  356. hs [i] = h;
  357. }
  358. return hs;
  359. }
  360. }
  361. //
  362. // Holds the metadata loaded from the type stub, as well as
  363. // the metadata for all the methods in the type
  364. //
  365. internal class SoapTypeStubInfo : TypeStubInfo
  366. {
  367. Hashtable[] header_serializers = new Hashtable [3];
  368. Hashtable[] header_serializers_byname = new Hashtable [3];
  369. Hashtable methods_byaction = new Hashtable ();
  370. #if NET_2_0
  371. WsiProfiles wsi_claims = WsiProfiles.None;
  372. #endif
  373. // Precomputed
  374. internal SoapParameterStyle ParameterStyle;
  375. internal SoapServiceRoutingStyle RoutingStyle;
  376. internal SoapBindingUse Use;
  377. internal SoapExtensionRuntimeConfig[][] SoapExtensions;
  378. internal SoapBindingStyle SoapBindingStyle;
  379. internal XmlReflectionImporter xmlImporter;
  380. internal SoapReflectionImporter soapImporter;
  381. public SoapTypeStubInfo (ServerType logicalTypeInfo)
  382. : base (logicalTypeInfo)
  383. {
  384. xmlImporter = new XmlReflectionImporter ();
  385. soapImporter = new SoapReflectionImporter ();
  386. object [] o;
  387. o = Type.GetCustomAttributes (typeof (WebServiceBindingAttribute), false);
  388. if (typeof (SoapHttpClientProtocol).IsAssignableFrom (Type))
  389. {
  390. if (o.Length == 0)
  391. throw new InvalidOperationException ("WebServiceBindingAttribute is required on proxy class '" + Type + "'.");
  392. if (o.Length > 1)
  393. throw new InvalidOperationException ("Only one WebServiceBinding attribute may be specified on type '" + Type + "'.");
  394. // Remove the default binding, it is not needed since there is always
  395. // a binding attribute.
  396. Bindings.Clear ();
  397. #if NET_2_0
  398. WebServiceBindingAttribute wsba = (WebServiceBindingAttribute) o [0];
  399. if (wsba.EmitConformanceClaims)
  400. wsi_claims = wsba.ConformsTo;
  401. #endif
  402. }
  403. foreach (WebServiceBindingAttribute at in o)
  404. AddBinding (new BindingInfo (at, LogicalType.WebServiceNamespace));
  405. o = Type.GetCustomAttributes (typeof (SoapDocumentServiceAttribute), false);
  406. if (o.Length == 1){
  407. SoapDocumentServiceAttribute a = (SoapDocumentServiceAttribute) o [0];
  408. ParameterStyle = a.ParameterStyle;
  409. RoutingStyle = a.RoutingStyle;
  410. Use = a.Use;
  411. SoapBindingStyle = SoapBindingStyle.Document;
  412. } else {
  413. o = Type.GetCustomAttributes (typeof (SoapRpcServiceAttribute), false);
  414. if (o.Length == 1){
  415. SoapRpcServiceAttribute srs = (SoapRpcServiceAttribute) o [0];
  416. ParameterStyle = SoapParameterStyle.Wrapped;
  417. RoutingStyle = srs.RoutingStyle;
  418. Use = SoapBindingUse.Encoded;
  419. SoapBindingStyle = SoapBindingStyle.Rpc;
  420. } else {
  421. ParameterStyle = SoapParameterStyle.Wrapped;
  422. RoutingStyle = SoapServiceRoutingStyle.SoapAction;
  423. Use = SoapBindingUse.Literal;
  424. SoapBindingStyle = SoapBindingStyle.Document;
  425. }
  426. }
  427. if (ParameterStyle == SoapParameterStyle.Default) ParameterStyle = SoapParameterStyle.Wrapped;
  428. if (Use == SoapBindingUse.Default) Use = SoapBindingUse.Literal;
  429. xmlImporter.IncludeTypes (Type);
  430. soapImporter.IncludeTypes (Type);
  431. SoapExtensions = SoapExtension.GetTypeExtensions (Type);
  432. }
  433. #if NET_2_0
  434. public override WsiProfiles WsiClaims {
  435. get { return wsi_claims; }
  436. }
  437. #endif
  438. public override XmlReflectionImporter XmlImporter
  439. {
  440. get { return xmlImporter; }
  441. }
  442. public override SoapReflectionImporter SoapImporter
  443. {
  444. get { return soapImporter; }
  445. }
  446. public override string ProtocolName
  447. {
  448. get { return "Soap"; }
  449. }
  450. protected override MethodStubInfo CreateMethodStubInfo (TypeStubInfo parent, LogicalMethodInfo lmi, bool isClientProxy)
  451. {
  452. SoapMethodStubInfo res = null;
  453. object [] ats = lmi.GetCustomAttributes (typeof (SoapDocumentMethodAttribute));
  454. if (ats.Length == 0) ats = lmi.GetCustomAttributes (typeof (SoapRpcMethodAttribute));
  455. if (ats.Length == 0 && isClientProxy)
  456. return null;
  457. else if (ats.Length == 0)
  458. res = new SoapMethodStubInfo (parent, lmi, null, xmlImporter, soapImporter);
  459. else
  460. res = new SoapMethodStubInfo (parent, lmi, ats[0], xmlImporter, soapImporter);
  461. methods_byaction [res.Action] = res;
  462. return res;
  463. }
  464. public SoapMethodStubInfo GetMethodForSoapAction (string name)
  465. {
  466. return (SoapMethodStubInfo) methods_byaction [name.Trim ('"',' ')];
  467. }
  468. }
  469. internal class Soap12TypeStubInfo : SoapTypeStubInfo
  470. {
  471. public Soap12TypeStubInfo (ServerType logicalTypeInfo)
  472. : base (logicalTypeInfo)
  473. {
  474. }
  475. public override string ProtocolName
  476. {
  477. get { return "Soap12"; }
  478. }
  479. }
  480. }