【问题标题】:Access XML Header using SOAPCore使用 SOAPCore 访问 XML 标头
【发布时间】:2021-06-14 16:01:53
【问题描述】:

我将 SoapCore 1.1.0.8 与 .NetCore 3.1 一起使用

有谁知道如何使用 SoapCore 从信封中访问 XML 标头?

例如像下面这样的信封

    <SOAP:Header xmlns='http://www.acompany.com/gsd'>
        <ns0:AuthenticationInfo xmlns:ns0='http://customheader.com'>
            <ns0:userName>Dummy_User</ns0:userName>
            <ns0:password>Dummy_Pwd</ns0:password>
        </ns0:AuthenticationInfo>
    </SOAP:Header>
    <SOAP:Body xmlns='http://www.acompany.com/gsd'>
        <MsgReq xmlns='http://www.acompany.com/gsd' xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>
            <MethodName>Identify</MethodName>
            <MethodID>IS_001_01</MethodID>
.
.
        </MsgReq>
    </SOAP:Body>
</SOAP:Envelope>

您如何访问用户名和密码元素?

【问题讨论】:

    标签: xml asp.net-core header soapcore


    【解决方案1】:

    您可以使用 IServiceOperationTuner 访问 XML 标头。

    public class ServiceOperationTuner : IServiceOperationTuner
        {
            public void Tune(HttpContext httpContext, object serviceInstance, OperationDescription operation)
            {
                if (serviceInstance is YourServiceClass)
                {
                    YourServiceClass)service = serviceInstance as YourServiceClass)
                    service.SetHttpRequest(httpContext.Request);
                }
            }
        }
    

    之后在 Startup.cs 中注册 ServiceOperationTuner。

            public void ConfigureServices(IServiceCollection services)
            {
    ...
                services.AddSoapServiceOperationTuner(new ServiceOperationTuner());
    ...
            }
    

    在您的服务中添加

      private ThreadLocal<HttpRequest> _httpRequest = new() { Value = null };
    
            public void SetHttpRequest(HttpRequest request)
            {
                _httpRequest.Value = request;
            }
    

    然后你可以从 HttpContext 获取 RAW Soap Header XML

            private XmlNode GetHeaderFromRequest(HttpRequest request)
            {
                var bytes = (request.Body as MemoryStream)?.ToArray();
                if (bytes == null)
                {
                    // Body missing from request
                    return null;
                }
    
                var envelope = new XmlDocument();
                envelope.LoadXml(Encoding.UTF8.GetString(bytes));
    
                return envelope.DocumentElement?.ChildNodes.Cast<XmlNode>().FirstOrDefault(n => n.LocalName == "Header");
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 2023-03-06
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多