我正在构建一个DLL,应该由我正在构建的其他一些应用程序使用.
DLL功能的一部分是记录所有SOAP事务.
DLL功能的一部分是记录所有SOAP事务.
我已经找到了关于如何在C#中捕获SOAP事务的解释.
https://web.archive.org/web/20160402053148/http://blog.encoresystems.net/articles/how-to-capture-soap-envelopes-when-consuming-a-web-service.aspx
我的问题是它需要将以下内容添加到app.config(链接的页面末尾).
<system.web> <webServices> <soapExtensionTypes> <add type="Encore.PayPal.Soap.TraceExtension,Encore.PayPal.Soap" priority="1" group="0" /> </soapExtensionTypes> </webServices> </system.web>
我不希望它是所有使用我的DLL将其添加到app.config的要求.
有没有办法在DLL加载时动态执行此操作?
解决方法
我在MSDN论坛上发现了类似的问题:
Programmatically 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 (e.g. 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,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); }
RegisterSoapExtension(typeof(TraceExtension),1,PriorityGroup.Low); PaypalClient cli = new PaypalClient();