【问题标题】:C# How to get soap XML from service reference (wsdl import)?C#如何从服务引用(wsdl导入)中获取soap XML?
【发布时间】:2016-08-24 23:47:23
【问题描述】:

我得到了一个 wsdl 文件,我将它添加为 Visual Studio 中的服务参考。

我现在可以创建一个新的服务客户端,然后执行肥皂操作没有问题。

但是在 C# 中,我只需要获取它生成的用于执行操作的 soap 请求 XML 并将其存储在一个变量中,而不是实际将其发送到 Web 服务。

这可能吗?我尝试只是将类序列化为 xml,但结果与预期的肥皂请求 xml 有点不同。

【问题讨论】:

  • 就像您创建服务客户端一样,也可以使用 wsdl 创建 Web 服务。然后使用 SoapUI 获取 web 服务的 soap 请求。
  • @KosalaW 感谢您的帮助。我没有考虑用它创建我自己的网络服务。不过,我确实需要以编程方式获取它,所以我认为我需要的不仅仅是 SoapUI。但也许我创建的 Web 服务可以只返回请求 xml,如果没有其他方法的话......
  • 只是为了确认我对您的要求的理解,您有一个 wsdl,并且您想知道,对于您计划实施的每个操作,soap 请求(xml?)会是什么样子?跨度>
  • @KosalaW 我需要将soap请求xml作为c#中的字符串获取。为了清楚起见,稍微编辑了问题。

标签: c# web-services wsdl


【解决方案1】:

我仍在研究此问题,但最好的办法是创建 Web 服务参考的部分类。

在 Visual Studio 解决方案资源管理器中(选中您的项目),单击“显示所有文件”图标,这将允许您展开 Web 服务,直到找到名为 Reference.cs 的文件(它位于 Reference.map 节点下) .

这个类将被标记为 partial 并继承自 SoapHttpClientProtocol,这应该让您可以访问一些有趣的属性和方法等。

我会在完成探索后尽快更新此答案。

希望对你有帮助!

更新; 我发现这篇很有帮助的文章,我认为可以解决问题;

http://orbinary.com/blog/2010/01/getting-the-raw-soap-xml-sent-via-soaphttpclientprotocol/

您可以使用下面的类来实现 XmlWriterSpy;

public class XmlWriterSpy : XmlWriter
{
    private readonly XmlWriter _originalWriter;
    private readonly XmlTextWriter _buffer;
    private readonly StringWriter _sw;

    public XmlWriterSpy(XmlWriter originalWriter)
    {
        _originalWriter = originalWriter;

        _sw = new StringWriter();

        _buffer = new XmlTextWriter(_sw)
        {
            Formatting = Formatting.Indented
        };
    }

    public override void Flush()
    {
        _originalWriter.Flush();
        _buffer.Flush();
        _sw.Flush();
    }

    public string Xml => _sw?.ToString();

    public override WriteState WriteState => _originalWriter.WriteState;

    public override void Close() { _originalWriter.Close(); _buffer.Close(); }

    public override string LookupPrefix(string ns) { return _originalWriter.LookupPrefix(ns); }

    public override void WriteRaw(string data)
    {
        _originalWriter.WriteRaw(data);
        _buffer.WriteRaw(data);
    }

    public override void WriteBase64(byte[] buffer, int index, int count)
    {
        _originalWriter.WriteBase64(buffer, index, count);
        _buffer.WriteBase64(buffer, index, count);
    }


    public override void WriteString(string text)
    {
        _originalWriter.WriteString(text);
        _buffer.WriteString(text);
    }

    public override void WriteSurrogateCharEntity(char lowChar, char highChar)
    {
        _originalWriter.WriteSurrogateCharEntity(lowChar, highChar);
        _buffer.WriteSurrogateCharEntity(lowChar, highChar);
    }
    public override void WriteChars(char[] buffer, int index, int count)
    {
        _originalWriter.WriteChars(buffer, index, count);
        _buffer.WriteChars(buffer, index, count);
    }

    public override void WriteRaw(char[] buffer, int index, int count)
    {
        _originalWriter.WriteRaw(buffer, index, count);
        _buffer.WriteRaw(buffer, index, count);
    }

    public override void WriteStartDocument()
    {
        _originalWriter.WriteStartDocument();
        _buffer.WriteStartDocument();
    }

    public override void WriteStartDocument(bool standalone)
    {
        _originalWriter.WriteStartDocument(standalone);
        _buffer.WriteStartDocument(standalone);
    }

    public override void WriteEndDocument()
    {
        _originalWriter.WriteEndDocument();
        _buffer.WriteEndDocument();
    }

    public override void WriteDocType(string name, string pubid, string sysid, string subset)
    {
        _originalWriter.WriteDocType(name, pubid, sysid, subset);
        _buffer.WriteDocType(name, pubid, sysid, subset);
    }

    public override void WriteStartElement(string prefix, string localName, string ns)
    {
        _originalWriter.WriteStartElement(prefix, localName, ns);
        _buffer.WriteStartElement(prefix, localName, ns);
    }

    public override void WriteEndElement()
    {
        _originalWriter.WriteEndElement();
        _buffer.WriteEndElement();
    }

    public override void WriteFullEndElement()
    {
        _originalWriter.WriteFullEndElement();
        _buffer.WriteFullEndElement();
    }

    public override void WriteStartAttribute(string prefix, string localName, string ns)
    {
        _originalWriter.WriteStartAttribute(prefix, localName, ns);
        _buffer.WriteStartAttribute(prefix, localName, ns);
    }

    public override void WriteEndAttribute()
    {
        _originalWriter.WriteEndAttribute();
        _buffer.WriteEndAttribute();
    }

    public override void WriteCData(string text)
    {
        _originalWriter.WriteCData(text);
        _buffer.WriteCData(text);
    }

    public override void WriteComment(string text)
    {
        _originalWriter.WriteComment(text);
        _buffer.WriteComment(text);
    }

    public override void WriteProcessingInstruction(string name, string text)
    {
        _originalWriter.WriteProcessingInstruction(name, text);
        _buffer.WriteProcessingInstruction(name, text);
    }

    public override void WriteEntityRef(string name)
    {
        _originalWriter.WriteEntityRef(name);
        _buffer.WriteEntityRef(name);
    }

    public override void WriteCharEntity(char ch)
    {
        _originalWriter.WriteCharEntity(ch);
        _buffer.WriteCharEntity(ch);
    }

    public override void WriteWhitespace(string ws)
    {
        _originalWriter.WriteWhitespace(ws);
        _buffer.WriteWhitespace(ws);
    }
}

然后你只需要继承代理生成的类,如下所示;

public class MyHelloService : HelloService
{

    private XmlWriterSpy _xmlSpy;

    public MyHelloService() : base() { }

    protected override XmlWriter GetWriterForMessage(SoapClientMessage message, int bufferSize)
    {
        _xmlSpy = new XmlWriterSpy(base.GetWriterForMessage(message, bufferSize));
        return _xmlSpy;
    }

    public string Xml => _xmlSpy?.Xml;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2012-08-26
    • 2010-09-08
    • 2013-10-26
    相关资源
    最近更新 更多