views:

139

answers:

1

How can I add

<%@ webservice class="MyNamespace.MyClass" ... %>

To the top of a CodeDom generated .asmx file?

Here's some code to fill this question out a bit more:

       public void Generate<T>()
        {
            string[] importNameSpaces = new string[] { "System","CoreData","System.Web.Services", "System.Data", "System.Text", "System.Collections.Generic" };
            targetUnit = new CodeCompileUnit();


            CodeNamespace samples = new CodeNamespace(TargetNamespace);


            foreach (string space in importNameSpaces)
            {
                samples.Imports.Add(new CodeNamespaceImport(space));
            }

            ClassName = typeof(T).Name;

            CodeSnippetStatement WebServiceDirective = new CodeSnippetStatement("<%@ WebService Language=\"C#\" CodeBehind=\"Plans.asmx.cs\" Class=\"" + TargetNamespace + "." + ClassName + "\" %>");

            targetClass = new CodeTypeDeclaration(ClassName);
            targetClass.IsClass = true;
            targetClass.TypeAttributes =
                TypeAttributes.Public;
            targetClass.IsPartial = true;

            CodeAttributeDeclaration WebServiceAtt = new CodeAttributeDeclaration(
                new CodeTypeReference(
                    typeof(WebServiceAttribute)), new CodeAttributeArgument[] 
            { new CodeAttributeArgument("Namespace",new CodeSnippetExpression(@"http://tempuri.org"))});
            targetClass.CustomAttributes.Add(WebServiceAtt);

            WebServiceAtt = new CodeAttributeDeclaration(
                new CodeTypeReference(
                    typeof(WebServiceAttribute)), 
                    new CodeAttributeArgument[] 
                    { new CodeAttributeArgument("ConformsTo", new CodeTypeReferenceExpression(WsiProfiles.BasicProfile1_1.GetType())) });

            targetClass.CustomAttributes.Add(WebServiceAtt);

            foreach (OperationType o in Enum.GetValues(typeof(OperationType)))
            {
                if (CoreData.Utility.SupportsOperation(typeof(T),o))
                {
                    targetClass.Members.Add(createWebServiceMethod(typeof(T).Name,typeof(T).GetProperties(),o));
                }

            }


            samples.Types.Add(targetClass);
            targetUnit.Namespaces.Add(samples);
            //targetUnit.StartDirectives.Add(WebServiceDirective);

            CSharpCodeProvider provider = new CSharpCodeProvider();

            IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(OutputDirectory + @"\" + targetClass.Name + ".asmx", false));
            provider.GenerateCodeFromCompileUnit(targetUnit, tw, new CodeGeneratorOptions());
            tw.Close();
}
+1  A: 

CodeDom doesn't directly support generating ASMX files. It only supports languages such as C# and VB.

You'll have to insert the WebService directive manually. You might be able to do this by first writing the directive to the tw writer before passing it into the CodeDom provider.

Eilon