我有 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;
}
这就是 IntegrationHeader 的样子:
[DataContract()]
public class IntegrationHeader
{
[DataMember]
public string UserName;
[DataMember]
public string Password;
}
项目 1将首先运行项目 2中的一个方法,该方法将(使用上面的代码)连接到服务上的服务方法。完成此操作后,项目 1也将连接到相同的服务,但使用本文中的第一个代码。
到目前为止一切顺利,没有问题。
问题 然后再次触发两个服务方法(第二次),但这次不需要上面的代码,因为它已经在 prev 循环中完成,所以这次我们直接进行服务方法请求,而不创建任何代理类或 channelFactories .
结果是第二次在服务上丢失了已发送消息的标头?
如果我删除项目 1(带有代理的那个)的服务调用,会不会有问题?
编辑 1:
如果我只运行项目 1执行的服务调用,那么它可以正常工作,如果我只运行项目 2执行的服务调用,它也可以正常工作。问题是在进行项目 2 调用、项目 1 调用然后再次返回到项目 2 调用时。
如果我以相反的方式运行它,Project 1,Project 2然后Project 1再次它也会在同样的问题上失败(第三次 Project 1 调用)?
编辑 2:
我在这两种情况下都使用 OperationContext.Current.OutgoingMessageHeaders 并且它只在每个项目的第一次调用时设置,也许他们使用的是相同的上下文?