SOAP Trap in C #, in DLL

I am creating a DLL that should be used by some other applications that I am creating. Part of the functionality of the DLL is to register all SOAP transactions.

I found this explanation on how to intercept SOAP transactions in C #. https://web.archive.org/web/20160402053148/http://blog.encoresystems.net/articles/how-to-capture-soap-envelopes-when-consuming-a-web-service.aspx

My problem is that I need to add the following to app.config (end of link page).

<system.web> <webServices> <soapExtensionTypes> <add type="Encore.PayPal.Soap.TraceExtension, Encore.PayPal.Soap" priority="1" group="0" /> </soapExtensionTypes> </webServices> </system.web> 

I do not want this to be a requirement for anyone using my DLL to add this to app.config.

Is there a way to do this on the fly when loading a DLL?

+4
source share
1 answer

I found a similar question on the MSDN forums: Program registering a SOAP extension

 /// <summary> /// Programatically registers a <see cref="SoapExtension"/> at runtime with the specified /// <see cref="SoapExtensionTypeElement.Priority"/> and <see cref="SoapExtensionTypeElement.Group"/> settings. /// </summary> /// <param name="type">The <see cref="Type"/> of the <see cref="SoapExtension"/> to register.</param> /// <param name="priority"> /// A value that indicates the relative order in which this SOAP extension runs when multiple SOAP extensions are /// specified. Within each group the priority attribute distinguishes the overall relative priority of the SOAP /// extension. A lower priority number indicates a higher priority for the SOAP extension. The lowest possible /// value for the priority attribute is 1. /// </param> /// <param name="group"> /// The relative priority group (eg Low or High) in which this SOAP extension runs when multiple SOAP extensions /// are configured to run. /// </param> [ReflectionPermission(SecurityAction.Demand, Unrestricted = true)] public static void RegisterSoapExtension(Type type, int priority, PriorityGroup group) { if (!type.IsSubclassOf(typeof(SoapExtension))) { throw new ArgumentException("Type must be derived from SoapException.", "type"); } if (priority < 1) { throw new ArgumentOutOfRangeException("priority", priority, "Priority must be greater or equal to 1."); } // get the current web services settings... WebServicesSection wss = WebServicesSection.Current; // set SoapExtensionTypes collection to read/write... FieldInfo readOnlyField = typeof(System.Configuration.ConfigurationElementCollection).GetField("bReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); readOnlyField.SetValue(wss.SoapExtensionTypes, false); // inject SoapExtension... wss.SoapExtensionTypes.Add(new SoapExtensionTypeElement(type, priority, group)); // set SoapExtensionTypes collection back to readonly and clear modified flags... MethodInfo resetModifiedMethod = typeof(System.Configuration.ConfigurationElement).GetMethod("ResetModified", BindingFlags.NonPublic | BindingFlags.Instance); resetModifiedMethod.Invoke(wss.SoapExtensionTypes, null); MethodInfo setReadOnlyMethod = typeof(System.Configuration.ConfigurationElement).GetMethod("SetReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); setReadOnlyMethod.Invoke(wss.SoapExtensionTypes, null); } 

You need to call this method before your client / server is created.

 RegisterSoapExtension(typeof(TraceExtension), 1, PriorityGroup.Low); PaypalClient cli = new PaypalClient(); 
+4
source

Source: https://habr.com/ru/post/1383279/


All Articles