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();
}