0

次のようなカスタム ソープヘッダーがあります。

[DataContract()]
    public class IntegrationHeader
    {
        [DataMember]
        public string UserName;
        [DataMember]
        public string Password;
    }

次に、 messageInspector に次のコードがあります。

if (request.Headers.Action == null || request.Headers.Action.ToString().Length < 1)
                return null;

            foreach (var header in request.Headers)
            {
                if (header.Namespace == "ns" && header.Name == "SecurityToken")
                {
                    loginHandler = new LoginHandler();

                    integrationHeader = request.Headers.GetHeader<IntegrationHeader>(header.Name, header.Namespace);
                    if ((userContext = loginHandler.LoginUser(integrationHeader.UserName, PassWordManager.DESEncrypt(integrationHeader.Password), Business.Entity.LoginType.Regular)) == null)
                        throw new SecurityTokenException("Unknown username or invalid password");

                    Thread.CurrentPrincipal = userContext;

                    return null;
                }
            }

            throw new SecurityTokenException("Unknown username or invalid password");

soapui で次の SOAP ヘッダーを送信すると、正常に動作します。

   <soapenv:Header>
     <SecurityToken xmlns="ns" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
       <Password xmlns="MyApp.ServiceImplementation">X</Password>
       <UserName xmlns="MyApp.ServiceImplementation">X</UserName>
     </SecurityToken>
   </soapenv:Header>

次に、プロキシで生成された WCF クライアント内からこれを実行しようとします。

(クライアント = 新しい MyProxy()) を使用して {

                IntegrationHeader ih = new IntegrationHeader { UserName = "X", Password = "X" };

                MessageHeader untyped = MessageHeader.CreateHeader("SecurityToken", "ns", ih);
                using (new System.ServiceModel.OperationContextScope(client.InnerChannel))
                {
                    OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
                }

                client.GetData(request);
            }

問題は、このコードを実行すると、messageInspector に 2 つのヘッダーしかなく、いずれもセキュリティ ヘッダーにならないことです。

私は何を間違っていますか?

4

1 に答える 1

0

これは正しい解決策です:

            IntegrationHeader ih = new IntegrationHeader { UserName = "X", Password = "X" };

            MessageHeader untyped = MessageHeader.CreateHeader("SecurityToken", "ns", ih);
            using (new System.ServiceModel.OperationContextScope(client.InnerChannel))
            {
                OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
                client.GetData(request);
            }

サービス コールは、ほとんどの場合、セキュリティ ヘッダーを使用して発信コンテキストから削除されます。

于 2012-09-17T08:57:36.263 に答える