使用WCF方法与Soap标头将用户信息传递给WCF Web服务

时间:2014-11-18 07:51:44

标签: asp.net wcf wcf-security

我的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)将每个方法调用的用户信息作为附加参数传递?

每个方法都必须添加此附加参数来传递用户信息,这似乎不是一个优雅的解决方案。

请建议。

的问候, 达尔门德拉

1 个答案:

答案 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");