XmlElement, завернутый в дополнительный тег в запросе SOAP - PullRequest
0 голосов
/ 30 июня 2010

Привет, у меня есть сервис-прокси с одним методом:

void SendRequest(MyMessage msg);

MyMessage определяется следующим образом:

[MessageContract(IsWrapped=false)]
public class MyMessage{
    [MessageBodyMember(Order=0)]
    public XmlElement Body;

    public MyMessage(XmlElement Body){
        this.Body = Body;
    }
}

Теперь проблема в том, что когда я отправляю запрос, тело обернуто в тег, например, так:

<s:Body>
    <Body>
         <MyMessage>
               <SomeData>Hello world</SomeData>
         </MyMessage>
    </Body>
</s:Body>

, когда я действительно хочу:

<s:Body>
    <MyMessage>
               <SomeData>Hello world</SomeData>
    </MyMessage>
</s:Body>

Может кто-нибудь помочь?Я начинаю отчаяться!: /

РЕДАКТИРОВАТЬ: Причина, по которой я хочу отправить XmlElement, заключается в том, что служба будет принимать различное количество XML-форматов и будет выполнять xsd-проверку и преобразование на стороне сервера.Предполагается, что это всего лишь оболочка.

Я также не могу заставить конечный сервер просто принять «неправильную» xml-структуру, поскольку я не контролирую это.

1 Ответ

2 голосов
/ 30 июня 2010

Хорошо, похоже, мне пришлось полностью отказаться от WCF, чтобы это сработало.

Я создал два простых метода:

    XDocument ConstructSoapEnvelope(string messageId, string action, XDocument body)
    {
        XDocument xd = new XDocument();
        XNamespace s = "http://schemas.xmlsoap.org/soap/envelope/";
        XNamespace a = "http://www.w3.org/2005/08/addressing";

        XElement soapEnvelope = new XElement(s + "Envelope", new XAttribute(XNamespace.Xmlns + "s", s), new XAttribute(XNamespace.Xmlns + "a", a));
        XElement header = new XElement(s + "Header");
        XElement xmsgId = new XElement(a + "MessageID", "uuid:" + messageId);
        XElement xaction = new XElement(a + "Action", action);
        header.Add(xmsgId);
        header.Add(xaction);

        XElement soapBody = new XElement(s + "Body", body.Root);
        soapEnvelope.Add(header);
        soapEnvelope.Add(soapBody);
        xd = new XDocument(soapEnvelope);
        return xd;
    }

    string HttpSOAPRequest(XmlDocument doc, string add, string proxy, X509Certificate2Collection certs)
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(add);
        req.ClientCertificates = certs;
        if (proxy != null) req.Proxy = new WebProxy("", true);

        req.Headers.Add("SOAPAction", "\"\"");

        req.ContentType = "text/xml;charset=\"utf-8\"";
        req.Accept = "text/xml";
        req.Method = "POST";
        Stream stm = req.GetRequestStream();
        doc.Save(stm);
        stm.Close();
        WebResponse resp = req.GetResponse();
        stm = resp.GetResponseStream();
        StreamReader r = new StreamReader(stm);

       return r.ReadToEnd();
    }

ConstructSoapEnvelope просто создает мыльный конверт с заголовком и телом (с учетом ws-адресации для моих нужд)

и HttpSOAPRequest является слегка измененной версией, найденной здесь: http://www.eggheadcafe.com/articles/20011103.asp

Мне пришлось изменить его, чтобы он принимал клиентские сертификаты, чтобы моя SSL-связь работала ..

Надеюсь, это поможет кому-то еще! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...