从 .NET 6 HttpClient 调用 SOAP 操作 - 出现错误

Calling SOAP Action from .NET 6 HttpClient - Getting Error

提问人:cITsecure 提问时间:11/8/2023 最后编辑:Guru StroncITsecure 更新时间:11/8/2023 访问量:75

问:

我需要根据我拥有的规范调用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 "";
    }
}
C# ASP.NET-Core SOAP HTTPAnclient net-6.0

评论

1赞 Guru Stron 11/8/2023
至少有一件事似乎是错误的 - 您以 3 种不同的方式添加内容类型标头,但它们都没有添加您在显示的请求中使用的内容类型标头 -application/soap+xml;charset=”UTF8”;action="QuoteRealTime"
0赞 cITsecure 11/8/2023
关于如何添加application/soap+xml;charset=“UTF8”的任何建议;action=“QuoteRealTime”
0赞 Selvin 11/8/2023
与添加 text/xml 的方式相同...
2赞 Selvin 11/8/2023
此外,您可以从 wsdl 生成客户端并使用它来代替普通的 httpclient
0赞 Guru Stron 11/8/2023
尝试类似(删除您正在设置的其他提及)。request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/soap+xml;charset=\"UTF8\";action=\"QuoteRealTime\"");text/xml

答:

-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
您可以使用自定义行为扩展代理。当然,这相当复杂。