如何在WPF应用程序中的SOAP客户端的“Set-Cookie”标头响应的新请求中设置“Cookie”标头

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在WPF应用程序中的SOAP客户端的“Set-Cookie”标头响应的新请求中设置“Cookie”标头相关的知识,希望对你有一定的参考价值。

我正在将我的WPF应用程序与2个WCF应用程序集成(一个是“身份验证应用程序”,另一个是需要身份验证的“真实”应用程序)。 “身份验证应用程序”返回3个Set-Cookie标头,我需要将它们添加到“真实”应用程序的请求标头中。但我不确定如何获得这些标题(只有结果)我可以得到:

AuthenticationApplicationService.SoapClient authenticationSoapClient = new AuthenticationApplicationService.SoapClient("AuthenticationApplicationServiceSoap");
bool loggedInSuccess = await authenticationSoapClient.PerformLoginAsync();
// how do I get the cookie headers from this call and set them on the next?

RealService.SoapClient realSoapClient = new RealService.SoapClient("RealServiceSoap");
realSoapClient.PostAsync("hello");

第一次调用PerformLoginAsync会成功登录返回true或false,并且标题包括Set-Cookie。如何获取这些标题并在下一次请求Cookie时设置PostAsync标题?

如果还有其他问题,请告诉我!

答案

您应该使用OperationContext,它具有可以发送cookie的属性。要启用cookie,您应该在绑定配置中将allowcookie属性设置为true。

 <bindings>
  <basicHttpBinding>
    <binding name="AuthSoap" allowCookies="true" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:63599/Auth" binding="basicHttpBinding"
    bindingConfiguration="AuthSoap" contract="Auth.AuthSoap" name="AuthSoap" />
</client>

然后你可以调用login方法,如下所示。

 Auth.AuthSoapClient authSoapClient = new Auth.AuthSoapClient();
        using (new OperationContextScope(authSoapClient.InnerChannel))
        {
// please put the call of method in OperationContextScope
            authSoapClient.Login("admin", "admin");

          // the following code get the set-cookie header passed by server

            HttpResponseMessageProperty response = (HttpResponseMessageProperty)
            OperationContext.Current.IncomingMessageProperties[
                HttpResponseMessageProperty.Name];
            string header  = response.Headers["Set-Cookie"];
          // then you could save it some place  
        }

获得cookie后,每次调用方法时都应在标题中设置它。

 Auth.AuthSoapClient authSoapClient = new Auth.AuthSoapClient();
        using (new OperationContextScope(authSoapClient.InnerChannel))
        {
             //below code sends the cookie back to server

            HttpRequestMessageProperty request = new HttpRequestMessageProperty();
            request.Headers["Cookie"] =  please get the cookie you stored when you   successfully logged in               
 OperationContext.Current.OutgoingMessageProperties[
                HttpRequestMessageProperty.Name] = request;
// please put the call of method in OperationContextScope
            string msg = authSoapClient.GetMsg();
        }

如果您觉得在成功登录后每次发送cookie都很麻烦。您可以考虑使用MessageInspector,请参阅链接的最后一段代码https://megakemp.com/2009/02/06/managing-shared-cookies-in-wcf/

以上是关于如何在WPF应用程序中的SOAP客户端的“Set-Cookie”标头响应的新请求中设置“Cookie”标头的主要内容,如果未能解决你的问题,请参考以下文章

elang(基于 yaws_soap_lib)soap 客户端的问题

xml 转储jax-ws客户端的SOAP消息

如何用 Delphi Win32 编写 SOAP 1.2 客户端的最佳方式

更改 Axis 1.4 生成的 SOAP Java 客户端的超时设置

php PHP:SOAP服务器和客户端的超级最小示例

WSDL SOAP Webservice Java 客户端的错误 415