\


 Monday, 25 October 2004
Webové služby obohacené o SoapExtensionReflector

Když jsem psal článek o http modulech pro Interval s příkladem http modulu pro dynamické přidání dokumentace k operacím webových služeb, stále jsem trpěl obsedantní představou, že by mělo existovat lepší API pro práci s generovaným WSDL webové služby.

Představa lepšího API mě znovu přepadla při přípravě staršího spotu o http modulu pro změnu URL adresy webové služby.

A nepletl jsem se. Pro tyto účely je zde třída SoapExtensionReflector, i když její význam Microsoft cudně v MSDN skrývá pod nepřátelskou větu "The SoapExtensionReflector type supports the .NET Framework infrastructure and is not intended to be used directly from your code", která má ale na mě přesně opačný účinek, protože vyburcuje moji zvědavost lačně ohledávající vnitřnosti .Net Frameworku.;)

V potomku abstraktní třídy SoapExtensionReflector je nutné přepsat metodu ReflectMethod. Metoda ReflectMethod je volána pro každou metodu webové služby. Podstatné informace o právě zpracovávané webové metodě jsou uloženy v v zděděné vlastnosti ReflectionContext.

Příklad přidání dokumentace k webové službě v potomku třídy SoapExtensionReflector. Stejně jako v článku na Intervalu platí, že dokumentace k metodě musí být uložena v sekci appSettings, v elementu add, a že název klíče (key) musí být shodný s názvem metody, k němuž je přidán suffix Method, a text dokumentace tvoří hodnota atributu value.

using System;
using System.Collections;
using System.Configuration;
using System.Web.Services.Description;
namespace AddDocExtension
{
    /// <summary>
    /// Zkušební SoapExtensionReflector pro přidání dokumentace k webové metodě
    /// </summary>
    public class ImportDocExtension : SoapExtensionReflector
    {
        #region Private constants
        private const string METHOD_KEY_SUFFIX = "Method";
        #endregion Private constants
        #region Private static fields
        private static Hashtable m_operationsDoc;
        #endregion Private fields
        
        #region Constructors
        /// <summary>
        /// Statický konstruktor
        /// </summary>
        static ImportDocExtension()
        {
            readConfig();
        }
        
        /// <summary>
        /// Konstruktor
        /// </summary>
        public ImportDocExtension() : base()
        {
        }
        #endregion Constructors
        #region Public methods
        /// <summary>
        /// Přidání dokumentace ke každé operaci
        /// </summary>
        public override void ReflectMethod()
        {
            string opName = ReflectionContext.Operation.Name;
            if (m_operationsDoc.ContainsKey(opName))
            {
                ReflectionContext.Operation.Documentation = (string) m_operationsDoc[opName];
            }
        }
        #endregion Public methods
        #region Private static methods
        /// <summary>
        /// Načtení dokumentace k metodám z konfiguračního souboru
        /// </summary>
        private static void readConfig()
        {
             m_operationsDoc = new Hashtable();
            
            string[]keys = ConfigurationSettings.AppSettings.AllKeys;
            
            foreach (string key in keys)
            {
                if (key.EndsWith(METHOD_KEY_SUFFIX))
                {
                    string hashKey = key.Substring(0, key.LastIndexOf(METHOD_KEY_SUFFIX));
                    string hashValue = ConfigurationSettings.AppSettings[key];
                    m_operationsDoc.Add(hashKey, hashValue);
                }
            }
        }
        #endregion Private static methods
    }
}

SoapExtensionReflector musí být zaregistrován v konfiguračním souboru webové služby v sekci webServices.

<webServices>

  <soapExtensionReflectorTypes>

    <add type="AddDocExtension.ImportDocExtension,AddDocExtension" />

  </soapExtensionReflectorTypes>

</webServices>



Monday, 25 October 2004 19:04:00 (Central Europe Standard Time, UTC+01:00)       
Comments [1]  Web Services