我的WCF Web服务提供所有数据操作操作,我的ASP .Net Web应用程序提供用户界面。
我需要将许多wcf方法的用户信息从ASP .Net app传递到WCF应用程序。
关于将用户信息从Web应用程序传递到Web服务,哪一种方法更好?
1)使用SOAP标头传递用户信息?
ASP .Net Application必须将WCF Webservice客户端的实例数保持为使用Web应用程序登录的用户数。假设4000个用户同时处于活动状态,Web应用程序必须维护WCF webserice客户端的4000个实例。 它有任何性能问题吗?
2)将每个方法调用的用户信息作为附加参数传递?
每个方法都必须添加此附加参数来传递用户信息,这似乎不是一个优雅的解决方案。
请建议。
的问候, 达尔门德拉
答案 0 :(得分:2)
我认为最好在您发送到WCF服务的每封邮件的标头中传递某种用户ID。这很容易做到,如果需要的话,它是获取用户+授权用户服务端信息的好方法。而且您不需要4000个webservice客户端实例。
您只需要在客户端使用客户端消息检查器创建行为(并在您的配置中注册)。例如:
public class AuthClientMessageInspector: IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply, object correlationState)
{
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
request.Headers.Add(MessageHeader.CreateHeader("User", "app", "John"));
return null;
}
}
public class ClientBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
foreach (var operation in endpoint.Contract.Operations)
{
operation.Behaviors.Find<DataContractSerializerOperationBehavior>().MaxItemsInObjectGraph = Int32.MaxValue;
}
var inspector = new AuthClientMessageInspector();
clientRuntime.MessageInspectors.Add(inspector);
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
从服务端提取它:
var headers = OperationContext.Current.IncomingMessageHeaders;
var identity = headers.GetHeader<string>("User", "app");