如何将ASP.net webservice指令添加到CodeDom生成的.asmx文件中

时间:2010-01-04 18:30:36

标签: asp.net web-services codedom

如何添加

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

在CodeDom生成的.asmx文件的顶部?

这里有一些代码可以解决这个问题:

       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 个答案:

答案 0 :(得分:1)

CodeDom不直接支持生成ASMX文件。它只支持C#和VB等语言。

您必须手动插入WebService指令。您可以通过先将指令写入tw编写器,然后再将其传递给CodeDom提供程序来完成此操作。