2010-01-04 14 views
1

如何添加如何ASP.net web服務指令添加到CodeDom中產生的.asmx文件

<%@ 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

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

您必須手動插入WebService指令。您可以通過在將指令傳遞給CodeDom提供者之前首先將指令寫入tw編寫器來完成此操作。