我有调用WCF服务的MVC客户端。 MVC客户端需要在httprequest中传递一个自定义头。 MVC客户端也使用Unity for DI。
我已经浏览了SO POST和其他链接,但他们都建议使用消息检查器和自定义行为(这可能是正确的方法),但我正在寻找快速和肮脏的方式,因为这将是临时解决方案。
// Unity type Registration
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IDocumentManagementChannel>(new PerRequestLifetimeManager(),
new InjectionFactory(f=> CreateDocumentManagementChannel()));
}
private static IDocumentManagementChannel CreateDocumentManagementChannel()
{
var factory = new ChannelFactory<IDocumentManagementChannel>("BasicHttpEndPoint");
var channel = factory.CreateChannel();
// How do i add HttpHeaders into channel here?
return channel
}
在上面的代码中,如何在创建频道后添加自定义标题?
答案 0 :(得分:1)
1-下面的代码应该从MVC发送soap标头
string userName = Thread.CurrentPrincipal.Identity.Name;
MessageHeader<string> header = new MessageHeader<string>(userName);
OperationContext.Current.OutgoingMessageHeaders.Add(
header.GetUntypedHeader("String", "System"));
2-此代码应在WCF上阅读
string loginName = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("String", "System");
3-对于频道,我建议您按如下方式创建自定义System.ServiceModel.ClientBase:
public abstract class UserClientBase<T> : ClientBase<T> where T : class
{
public UserClientBase()
{
string userName = Thread.CurrentPrincipal.Identity.Name;
MessageHeader<string> header = new MessageHeader<string>(userName);
OperationContext.Current.OutgoingMessageHeaders.Add(
header.GetUntypedHeader("String", "System"));
}
}
4-创建一个继承自UserClientBase的自定义客户端类,并在内部使用基本通道来调用您的IxxService,这是T。