gpt4 book ai didi

wcf - 使用 SOAP 调用 WCF 服务

转载 作者:行者123 更新时间:2023-12-04 19:26:03 25 4
gpt4 key购买 nike

我正在尝试在不创建 WCF 客户端的情况下测试 WCF 服务。我有类似的代码/问题 here .

我希望完全控制 SOAP 有效负载,因此我希望能够发出我自己的 Web 请求/响应并将我自己的 XML 作为参数替换到任何方法中。我还希望完全按原样返回 SOAP XML,而不创建响应对象、故障异常对象等。

作为引用,我想做什么SoapUI在您单击执行按钮并返回响应时正在执行的操作。我只是假设 SoapUI 没有创建 WCF 客户端、构建请求和调用方法,而是向 WCF 服务发出完整的 SOAP 调用并显示结果。

在回答评论中的问题时,我不想创建 WCF 客户端的原因是我想与对服务的任何和所有更改隔离,不必重建引用,修改自己的代码,创建单独的每个新服务/方法等的代码,因为这个过程在每次构建后自动启动,没有交互。

因此,我将数十万个测试 XML 参数传递给数百个方法,而不关心它们是什么。我们在 ASMX 网络服务上已经做了多年,一种方法(非常类似于上面的链接)处理所有网络服务/方法/测试参数。

切换到 WCF 后,我收到内部服务器错误,尤其是在测试无效的 XML 节点时:缺少必需的节点、创建方法中的重复名称错误等(任何错误条件)。我认为有一种简单的方法可以以相同的方式使用 WCF 做到这一点是有道理的。

我确切地想要 SoapUI 发回的内容,我只需要知道它是如何做的。

最佳答案

@John Saunders 在他的评论中是正确的。无论您使用 ASMX 做什么,您都应该可以使用 WCF。事实上,只要您执行正确的 SOAP 请求,您的 Web 服务使用哪种框架/技术并不重要。

WCF只是一个帮助构建面向服务的应用程序的框架。与任何其他此类框架一样,它使您可以专注于您将提供的实际服务,处理将该服务公开为 SOAP Web 服务所需的所有管道功能。

至于 SoapUI,它是一种 Java 工具,可让您测试 Web 服务。当您向它提供 WSDL 时,it dynamically creates请求样本然后发送到网络服务(如果我没记错的话)Http Client .

如果您拥有 WCF Web 服务,则不会发生任何奇特的事情。即使使用像这样的基本客户端,您仍然可以进行 SOAP 通信:

public class Program
{
public static void Main(string[] args)
{
// OK, this is not a WCF web service, but that should not matter :D
string endpoint = "http://www.html2xml.nl/Services/Calculator/Version1/Calculator.asmx";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint);
request.ContentType = "text/xml"; // or application/soap+xml for SOAP 1.2
request.Method = "POST";
request.KeepAlive = false;

//In case you have a proxy to resolve the server name also add these lines
var proxyServer = new WebProxy("XX.XX.XX.XX", 1234);
proxyServer.Credentials = CredentialCache.DefaultCredentials; // or username + password
request.Proxy = proxyServer;

// you can read these from files
string payload = @"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:tem=""http://tempuri.org/"">
<soapenv:Header/>
<soapenv:Body>
<tem:Add>
<tem:a>1</tem:a>
<tem:b>2</tem:b>
</tem:Add>
</soapenv:Body>
</soapenv:Envelope>";

byte[] byteArray = Encoding.UTF8.GetBytes(payload);
request.ContentLength = byteArray.Length;

Stream requestStream = request.GetRequestStream();
requestStream.Write(byteArray, 0, byteArray.Length);
requestStream.Close();

HttpWebResponse response = null;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
response = (HttpWebResponse)ex.Response;
}

Console.WriteLine(string.Format("HTTP/{0} {1} {2}\n", response.ProtocolVersion, (int)response.StatusCode, response.StatusDescription));

// you can write this to files
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
Console.WriteLine(reader.ReadToEnd());

// cleanp
reader.Close();
requestStream.Close();
responseStream.Close();
response.Close();
}
}

你会得到一个 SOAP 响应,在这种情况下是这样的:
HTTP/1.1 200 OK

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<AddResponse xmlns="http://tempuri.org/">
<AddResult>3</AddResult>
</AddResponse>
</soap:Body>
</soap:Envelope>

并且它是生成它的 ASMX 还是 WCF 或其他什么都没有关系。它是对 HTTP 请求的响应。

如果您发送的是无效消息,例如:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:Add>
<tem:a>x</tem:a>
<tem:b>y</tem:b>
</tem:Add>
</soapenv:Body>
</soapenv:Envelope>

你会得到一个错误,比如:
HTTP/1.1 500 Internal Server Error

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring> ... exception stacktrace here ... </faultstring>
<detail />
</soap:Fault>
</soap:Body>
</soap:Envelope>

您可以 automate the tests with SoapUI甚至将它们与 Junit 集成,你甚至可以使用类似 JMeter 的东西虽然不是专门为 Web 服务(如 SoapUI)设计的 it can test SOAP .您当然可以使用我添加到答案中的基本客户端。

关于wcf - 使用 SOAP 调用 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10607771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com