Как добавить директиву веб-сервиса ASP.net в сгенерированный CodeDom файл .asmx - PullRequest
1 голос
/ 04 января 2010

Как я могу добавить

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

В начало файла .asmx, созданного CodeDom?

Вот код, чтобы заполнить этот вопрос немного больше:

       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 Ответ

1 голос
/ 04 января 2010

CodeDom напрямую не поддерживает создание файлов ASMX. Он поддерживает только такие языки, как C # и VB.

Вы должны будете вставить директиву WebService вручную. Вы могли бы сделать это, сначала написав директиву в tw писателю, прежде чем передать ее провайдеру CodeDom.

...