提问人:cITsecure 提问时间:11/8/2023 最后编辑:Guru StroncITsecure 更新时间:11/8/2023 访问量:75
从 .NET 6 HttpClient 调用 SOAP 操作 - 出现错误
Calling SOAP Action from .NET 6 HttpClient - Getting Error
问:
我需要根据我拥有的规范调用SOAP操作。我已经创建了SOAP消息,需要发送它。我已配置,但每次发送帖子消息时,我都会收到“服务不可用”响应状态。HttpClient
我已经测试了从 SOAPUI 调用 SOAP 服务操作并且它有效。我错过了什么?HttpClient
以下是服务提供商提供的 HTTP 标头规范:
POST https://soap.msg-qa.com
HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/soap+xml;charset=”UTF8”;action="QuoteRealTime"
Content-Length: 3108
Host: soap.msg-qa.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5
代码如下:
HttpClientHandler handler = new HttpClientHandler();
handler.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
using (var client = new HttpClient(handler))
{
client.Timeout = new TimeSpan(0, 2, 0);
var request = new HttpRequestMessage()
{
RequestUri = new Uri("https://soap.msg-qa.com"),
Method = HttpMethod.Post
};
request.Content = new StringContent(soapmessage, Encoding.UTF8, "text/xml");
request.Headers.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml"));
request.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml");
request.Headers.Add("SOAPAction", "QuoteRealTime");
HttpResponseMessage response = client.SendAsync(request).Result;
if (!response.IsSuccessStatusCode)
{
_logger.LogError($"result = {response.StatusCode}, message = {response.ReasonPhrase}");
return null;
}
else
{
_logger.LogInformation($"Success. result = {response.StatusCode}, message = {response.ReasonPhrase}");
return "";
}
}
答:
-1赞
0xced
11/8/2023
#1
与其编写自己的自定义代码,不如查看适用于 .NET Core 的 dotnet-svcutil 工具。它将从 WSDL 文件生成 C# 代码,自动为您处理 SOAP 的所有血腥细节。然后,您将使用生成的客户端。
下面介绍如何在命令行上为实际(示例)Web 服务生成客户端。
dotnet svcutil --targetFramework net6.0 --namespace "*, ServiceReference" "https://apps.learnwebservices.com/services/hello?WSDL"
dotnet new classlib -f net6.0
dotnet add package System.ServiceModel.Http --version 6.1.0
rm Class1.cs
评论
0赞
cITsecure
11/9/2023
这有点复杂,因为必须对消息进行签名,我需要用我的代码完成这项工作,因为 dotnet core 创建的代理不会这样做。
0赞
0xced
11/9/2023
您可以使用自定义行为扩展代理。当然,这相当复杂。
评论
application/soap+xml;charset=”UTF8”;action="QuoteRealTime"
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/soap+xml;charset=\"UTF8\";action=\"QuoteRealTime\"");
text/xml