次のようなカスタム ソープヘッダーがあります。
[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 つのヘッダーしかなく、いずれもセキュリティ ヘッダーにならないことです。
私は何を間違っていますか?