Хорошо, элемент <string>
отображается как есть, потому что ваш метод определен как возвращающий строку. За кулисами .NET фактически просто берет любой объект, возвращаемый вашим методом, и сериализует его. Сериализованная строка представляется как <string>actual string contents</string>
.
То, что вы хотите сделать, это либо каким-либо образом вернуть объект, который сериализуется точно в нужное вам сообщение, либо, если ваша строка здесь действительно содержит XML, записать его непосредственно в поток ответов.
Я на самом деле никогда не пробовал это с помощью [WebMethod], но он может работать примерно так:
[WebMethod]
public void myFunc(string xmlRequest)
{
var myXml = @"<?xml version="1.0" encoding="utf-8"?><myRoot><myElement /></myRoot>";
Response.ContentType = "text/xml";
Response.Write(myXml);
Response.Flush();
Response.Close();
}
Как примечание, WCF фактически делает то же самое. Если вы определяете операцию службы WCF:
[OperationContract]
public string myFunc()
{
return "hi";
}
Возвращенный XML (который на самом деле дополнительно обернут в SOAP) - <string>hi</string>
Так же, как у вас здесь с классическими веб-сервисами. Немного больше боли «развернуть» этот XML в WCF. Вы должны сделать собственный писатель сообщений, IIRC.