访问WCF中的基础请求(WebRequest或HTTPRequest)对象以进行摘要预验证

访问WCF中的基础请求(WebRequest或HTTPRequest)对象以进行摘要预验证,wcf,web-services,authentication,digest-authentication,pre-authentication,Wcf,Web Services,Authentication,Digest Authentication,Pre Authentication,我们通过WCF服务公开实体对象。为了检索实体,我们通过WCF发出了几个请求,接近100或更多。我们最近切换到摘要身份验证,并注意到每个服务器请求都会发出401。这将在服务器上产生两倍的负载,而且由于我们有非常大的“帖子”,这将产生额外的流量延迟。目标是只有来自服务器的一个质询(401),其余的请求应该包括Auth头,这样服务器就不会发出401。因为Digest是一个基于挑战的协议,具有过期的nonce,即使我们可能不会完全消除401,但至少在每个请求中都会避免401。因为我们同时控制服务器和客户

我们通过WCF服务公开实体对象。为了检索实体,我们通过WCF发出了几个请求,接近100或更多。我们最近切换到摘要身份验证,并注意到每个服务器请求都会发出401。这将在服务器上产生两倍的负载,而且由于我们有非常大的“帖子”,这将产生额外的流量延迟。目标是只有来自服务器的一个质询(401),其余的请求应该包括Auth头,这样服务器就不会发出401。因为Digest是一个基于挑战的协议,具有过期的nonce,即使我们可能不会完全消除401,但至少在每个请求中都会避免401。因为我们同时控制服务器和客户端,所以我们希望发送每个请求中包含的摘要Auth头。 在.NET 2.0 webservices样式的Web引用代理/客户端(继承SOAPHttpClientProtocol)中有一个预验证属性,允许在请求中包含身份验证头,但在WCF服务Web引用客户端(使用ChannelFactory)中没有预验证属性。设置此属性与未设置此属性时,请求/响应流量存在明显差异。由于这是摘要身份验证(不是基本身份验证),我无法在使用ClientMessageInspector进行BeginRequest期间手动添加身份验证标头

    NetworkCredential creds = new NetworkCredential("username", "pass", "domain");

    //using .NET 2.0 "Web Reference" Style client that uses inherits SoapHttpClientProtocol:
    webReferenceClient = new Service1();
    webReferenceClient.Credentials = creds;
    //**Pre Authenticate **
    webReferenceClient.PreAuthenticate = true;
    string resp1 = "";
    for (int i = 0; i < 3;i++) 
        resp1 = resp1 + webReferenceClient.SayHello("jack");

    //using WCF "Service Reference" Client that uses ChannelFactory
    serviceReferenceClient = new Service1Client();

    serviceReferenceClient.ClientCredentials.HttpDigest.ClientCredential = creds;
    serviceReferenceClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel =          TokenImpersonationLevel.Impersonation;

    string resp="";
    for (var i = 0; i < 3;i++) 
        resp = resp + serviceReferenceClient.SayHello("jack");
NetworkCredential creds=新的网络凭据(“用户名”、“密码”、“域”);
//使用使用继承SoapHttpClientProtocol的.NET 2.0“Web引用”样式的客户端:
webReferenceClient=newservice1();
webReferenceClient.Credentials=creds;
//**预认证**
webReferenceClient.PreAuthenticate=true;
字符串resp1=“”;
对于(int i=0;i<3;i++)
resp1=resp1+webReferenceClient.SayHello(“杰克”);
//使用使用ChannelFactory的WCF“服务引用”客户端
serviceReferenceClient=新的Service1Client();
serviceReferenceClient.ClientCredentials.HttpDigest.ClientCredential=creds;
serviceReferenceClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel=TokenImpersonationLevel.Impersonation;
字符串resp=“”;
对于(变量i=0;i<3;i++)
resp=resp+serviceReferenceClient.SayHello(“杰克”);
Fiddler跟踪,带有.NET 2.0样式的Web引用客户端,带有预验证集。请注意,只有一个401请求,其余的请求都有Auth头

使用WCF样式的服务引用客户端进行跟踪。每个请求都会从服务器生成一个401:

我看到两种选择:

  • 将我们的客户端代码切换为使用.NET 2.0样式的Web参考客户端, 这将是一个重大举措,因为我们正在进行一些自定义故障处理
  • 找到一种方法来访问WebRequest或WCF的HTTPRequest对象 ChannelFactory并设置预验证属性。 如何访问实际的WebRequest对象

  • 是否还有其他选项???

    了解用于进行预验证的绑定的正确设置如何?