【问题标题】:BeforeSendRequest not called SecurityTokenInspectorBeforeSendRequest 未调用 SecurityTokenInspector
【发布时间】:2019-12-26 16:11:58
【问题描述】:

我正在尝试向 Amadeus Enterprise WSAP 发送 SOAP 请求。他们几乎没有提供有关如何连接的文档,我遵循了他们的代码示例

class SecurityTokenInspector : IClientMessageInspector
{
    .....
    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
    {
        if (channel.State == CommunicationState.Closed)
        {
            UsernameToken token = new UsernameTokenBP10(this.username, this.password, PasswordOption.SendHashed);
            XmlElement securityToken = token.GetXml(new XmlDocument());
            MessageHeader securityHeader = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", securityToken, false);
            request.Headers.Add(securityHeader);
        }
        return null;
    }
    .....
}

这里是使用:

AmadeusWebServicesPTClient client = new AmadeusWebServicesPTClient("AmadeusWebServicesPort");

            SecurityTokenInspector iSecurity = new SecurityTokenInspector(ConfigurationManager.AppSettings["user"], ConfigurationManager.AppSettings["pass"]);
            SecurityBehavior behavior = new SecurityBehavior
            {
                inspector = iSecurity
            };
            client.Endpoint.Behaviors.Add(behavior);

但未调用 BeforeSendRequest。

谁能帮忙?

【问题讨论】:

  • 所以你确实调用了client.ServiceMethod,对吧?因为仅仅添加行为不会调用任何东西。

标签: c# .net wcf soap amadeus


【解决方案1】:

您的代码 sn-ps 似乎没有问题。如何定义实现 IEndpointBehavior 接口和 BehaviorExtensionElement 抽象类的 SecurityBehavior?这是我的示例,希望对您有用。
ClientMessageLogger.

    public class ClientMessageLogger : IClientMessageInspector
    {
        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
            string displayText = $"the client has received the reply:\n{reply}\n";
            Console.Write(displayText);
        }

        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            request.Headers.Add(MessageHeader.CreateHeader("myheader", "", "myvalue"));
            string displayText = $"the client send request message:\n{request}\n";
            Console.WriteLine(displayText);
            return null;
        }
}

端点行为。

public class AuthBehavior : BehaviorExtensionElement, IEndpointBehavior
    {
        public override Type BehaviorType => typeof(AuthBehavior);

        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }
        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            ClientMessageLogger inspector = new ClientMessageLogger();
            clientRuntime.ClientMessageInspectors.Add(inspector);
        }
        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
        }
        public void Validate(ServiceEndpoint endpoint)
        {
        }
        protected override object CreateBehavior()
        {
            return new AuthBehavior();
        }
}

示例。

ServiceReference1.ServiceClient client = new ServiceReference1.ServiceClient();
//apply the endpoint behavior.
            client.Endpoint.Behaviors.Add(new AuthBehavior());
            var result = client.SayHello();
            Console.WriteLine(result);

结果。

如果问题仍然存在,请随时告诉我。

【讨论】:

  • 我试了你的代码和link的代码,不行我不知道怎么解决,两个代码是一样的!!!!!!
  • 请贴出您的全部代码,我会尽力找出问题所在。这两种方式是有区别的。一种使用服务合同扩展,另一种使用端点行为扩展。根据您上面的代码,我们应该使用端点行为扩展。
猜你喜欢
  • 2011-08-05
  • 1970-01-01
  • 2013-05-17
  • 2019-03-24
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多