C# 控制台应用程序 - 使用自定义进行 Soap 调用 Header

C# Console App - Make a Soap Call with Custom Header

我需要从 C# .net 控制台应用程序调用 SOAP Web 服务。该服务需要自定义 UsernameToken header 才能参与通话。我可以像这样在 app.config 文件中添加这个 header 并且它有效:

        <headers>
          <wsse:Security mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
              <wsse:Username>username</wsse:Username>
              <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
            </wsse:UsernameToken>
          </wsse:Security>
        </headers>

然而,我实际上需要循环调用多次,每次都传递不同的用户名和密码。我怎样才能做到这一点?我似乎无法从代码中访问此值。

我有一些来自我的项目之一的示例代码:

public static MessageHeader<SecurityHeaderType> GetSecurityHeader(string userName, string passWord, string nonce)
    {
        if (string.IsNullOrEmpty(userName)
        {
            userName = string.Empty;
        }

        if (string.IsNullOrEmpty(passWord))
        {
            passWord = string.Empty;
        }

        if (string.IsNullOrEmpty(nonce))
        {
            nonce = string.Empty;
        }

        var usernameToken = new UsernameToken();
        var securityHeader = new SecurityHeaderType { UsernameToken = usernameToken };
        // ReSharper disable once SpecifyACultureInStringConversionExplicitly
        string now = DateTime.Now.ToString();
        var tokenManager = new UsernameTokenManager();
        var passwordDigest = tokenManager.CreatePasswordDigest(Convert.FromBase64String(nonce), now, passWord);
        securityHeader.UsernameToken.Created = now;
        securityHeader.UsernameToken.Nonce = nonce;
        securityHeader.UsernameToken.Password = passwordDigest;
        securityHeader.UsernameToken.Username = userName;

        var header = new MessageHeader<SecurityHeaderType> { Content = securityHeader, Actor = "" };

        return header;
    }

    Public void CallService(){
 const string userName = "username";
        const string passWord = "password";
        const string nonce = "nonce";
        var securityHeader = SecurityHeaderHelper.GetSecurityHeader(userName, passWord, nonce);

        using (new OperationContextScope(_client.InnerChannel))
        {
            var untypedSecurityHeader = securityHeader.GetUntypedHeader("Security", Constants.SecurityHeaderWSSE);
            OperationContext.Current.OutgoingMessageHeaders.Add(untypedSecurityHeader);

           var dummyRequest = new DummyRequest();

            try
            {
                var testResponse = _client.Call(dummyRequest);
            }
            catch (Exception exp)
            {
                Assert.Fail(exp.Message);
            }               
        }
    }}