Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如何从服务引用(wsdl导入)获取soap XML?_C#_Web Services_Wsdl - Fatal编程技术网

C#如何从服务引用(wsdl导入)获取soap XML?

C#如何从服务引用(wsdl导入)获取soap XML?,c#,web-services,wsdl,C#,Web Services,Wsdl,给了我一个wsdl文件,我在VisualStudio中将其作为服务引用添加 我现在可以创建一个新的服务客户机,然后执行soap操作 然而,在C#中,我只需要获取它生成的soap请求XML来执行操作并将其存储在变量中,而不是实际将其发送到web服务 这可能吗?我尝试将该类序列化为xml,但结果与预期的soap请求xml略有不同。我仍在研究这一点,但最好是创建web服务引用的部分类 在Visual Studio解决方案资源管理器(选中项目)中,单击“显示所有文件”图标,这将允许您展开Web服务,直到

给了我一个wsdl文件,我在VisualStudio中将其作为服务引用添加

我现在可以创建一个新的服务客户机,然后执行soap操作

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


这可能吗?我尝试将该类序列化为xml,但结果与预期的soap请求xml略有不同。

我仍在研究这一点,但最好是创建web服务引用的部分类

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

这个类将被标记为
partial
,并从
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;
}

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