消息头在第二次调用时丢失

本文关键字:调用 第二次 消息 | 更新日期: 2023-09-27 18:33:10

我有 2 个项目,项目 1 引用了项目 2。

项目 1 使用带有代理类的简单服务引用来连接到服务。为了能够在标头中发送用户名/密码,在此代理类上使用以下代码:

public static void Connect()
{
    _Myclient = new MyService.MyIntegrationClient();
    _Scope = new OperationContextScope(_Myclient.InnerChannel);
    IntegrationHeader ih = new IntegrationHeader
    {
        UserName = Properties.Settings.Default.MyUserLogin,
        Password = Properties.Settings.Default.MyUserPassword
    };
    MessageHeader untyped = MessageHeader.CreateHeader("SecurityToken", "ns", ih);
    OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
}

到目前为止一切顺利,运行没有问题,并且可以在服务上读取用户名/密码。

项目 2 使用 channelFactory 来连接到同一服务。用于创建通道和添加消息头的代码如下所示:

public static IMyIntegration GetMyFactory(string userName, string password)
{
    IMyIntegration client;
    OperationContextScope operationContextScope;
    IntegrationHeader integrationHeader;
    ConfigurationChannelFactory<IMyIntegration> factory;
    MessageHeader messageHeader;
    integrationHeader = new IntegrationHeader { UserName = userName, Password = password };
    messageHeader = MessageHeader.CreateHeader("SecurityToken", "ns", integrationHeader);
    factory = new ConfigurationChannelFactory<IMyIntegration>("BasicHttpBinding_IMyIntegration", ConfigHelper.MyConfiguration, null);
    client = factory.CreateChannel();
    operationContextScope = new OperationContextScope((IClientChannel)client);
    if (OperationContext.Current.OutgoingMessageHeaders.Count < 1)
        OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);
        return client;
    }

这是集成标头的样子:

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

1 将首先在项目 2 中运行一个方法,该方法连接到(使用上面的代码(到服务中的服务方法。完成此操作后,项目 1 还将连接到相同的服务,但使用本文中第一个代码。

到目前为止一切顺利,没问题。

问题然后再次触发这两个服务方法(第二次(,但这次不需要上面的代码,因为它已经在 prev 循环中完成,所以这次我们直接执行服务方法请求,而不创建任何代理类或 channelFactory。

结果是服务上第二次缺少已发送消息上的标头?

如果我删除项目 1(带有代理的服务调用(发出的服务调用,不会有问题吗?

编辑 1 :

如果我只运行项目 1 执行的服务调用,那么它将正常工作,如果我只运行项目 2 执行的服务调用,它也会正常工作。问题是在执行项目 2 调用时,项目 1 调用,然后再次返回项目 2 调用。

如果我以相反的方式运行它,项目 1、项目 2 然后再次项目 1,它也会在同一个问题上失败(第三个项目1 调用(?

编辑 2 :

我在这两种情况下都使用 OperationContext.Current.OutgoingMessageHeaders,它只在每个项目的第一次调用时设置,也许 thay 使用相同的上下文?

消息头在第二次调用时丢失

我的猜测是,在您进行第二次调用时(暂停一分钟后(,OperationContextScope正在被释放。

这将导致 OperationContext.Current 返回创建作用域之前操作上下文的上一个实例,该实例不包含任何标头。

解决此问题的方法是将OpertationContextScope初始化移出工厂方法:

var client = GetMyFactory("username", "password);
using (operationContextScope = new OperationContextScope((IClientChannel)client))
{
    OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);
    client.DoSomething()
    ....
}

从 MSDN:

创建 OperationContextScope 时,当前 OperationContext 被存储,新的操作上下文成为由 当前属性。当 OperationContextScope 被释放时, 恢复原始操作上下文。