Веб-сервис, возвращающий пользовательский XML - PullRequest
1 голос
/ 24 июня 2010

Я имею дело с унаследованным веб-сервисом и сталкиваюсь с проблемами, пытаясь настроить ответы методов на ранее определенные XML-файлы. К сожалению, об изменении WSDL не может быть и речи, и, чтобы еще больше усложнить проблему, она несовместима с инструментом WSDL.exe.

О-о-так-разыскиваемый XML:

<soap:Envelope 
xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <Response xmlns="my/Namespace">Success</Response>
    </soap:Body>
</soap:Envelope>

Путем экспериментов - поскольку я не бегло говорю на .NET - я нашел решение ниже, которое сработало бы, если бы оба метода использовали разные теги XML. К сожалению, когда для ResponseElementName установлено то же значение, он «ломает» веб-сервис со следующей ошибкой:

The XML element 'Response' from namespace 'my/Namespace' references a method and a type. Change the method's message name using WebMethodAttribute or change the type's root element using the XmlRootAttribute.

Итак, есть ли другой способ достичь нирваны XML без изменения всей системы?

Заранее спасибо!

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml;
using System.Xml.Serialization;

[WebService(Name = "WSOcean",
    Namespace = "my/Namespace"
)]
public class WSOcean : System.Web.Services.WebService
{
    [WebMethod]
    [SoapDocumentMethod(
        Action = "Method1",
        RequestNamespace = "my/Method1/Namespace",
        ResponseElementName = "Response"
    )]
    [return: XmlText(DataType = "string")]
    public string Method1(int MessageType)
    {
        return "Example message 1";
    }

    [WebMethod]
    [SoapDocumentMethod(
        Action = "Method2",
        RequestNamespace = "my/Method2/Namespace",
        ResponseElementName = "Response"
    )]
    [return: XmlText(DataType = "string")]
    public string Method2(bool MessageStatus)
    {
        return "Random message 2";
    }
}

1 Ответ

0 голосов
/ 24 июня 2010

Прежде всего, вы должны использовать WCF для любой новой разработки веб-сервиса.

Во-вторых, попробуйте вернуть тип XmlElement вместо строки. Попробуйте создать именно тот XML, который вы хотите вернуть, а затем вернуть его.

...