简体   繁体   English

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

[英]How do I set “Cookie” header in a new request from “Set-Cookie” header response for a SOAP client in a WPF application

I'm integrating my WPF application with 2 WCF applications (one is an "Authentication Application" and the other is a "real" application that requires authentication). 我正在将WPF应用程序与2个WCF应用程序集成在一起(一个是“身份验证应用程序”,另一个是需要身份验证的“真实”应用程序)。 The "Authentication Application" returns 3 Set-Cookie headers, and I need to add them to the request header of the "real" application. “身份验证应用程序”返回3个Set-Cookie标头,我需要将它们添加到“真实”应用程序的请求标头中。 But I'm unsure of how to get those headers (only the result) I can get: 但是我不确定如何获取这些标头(只有结果)我可以得到:

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

That first call to PerformLoginAsync returns true or false for successfully logged in, and the headers inclue Set-Cookie . 首次调用PerformLoginAsync对于成功登录将返回true或false,并且标头包括Set-Cookie How can I grab those headers and set Cookie headers on the next request to PostAsync ? 如何获取这些标头并在对PostAsync的下一个请求上设置Cookie标头?

If there are further questions, please let me know! 如果还有其他问题,请告诉我!

You should use OperationContext, it has properties that could send cookie. 您应该使用OperationContext,它具有可以发送Cookie的属性。 To enable cookie , you should set the allowcookie property to true in your binding configuration. 要启用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>

Then you could call the login method as follows. 然后,您可以按以下方式调用登录方法。

 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  
        }

After you get the cookie, you should set it in your header every time you call your method. 获取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();
        }

If you feel it troublesome to send cookie every time after successfully logging in. You could consider using MessageInspector, refer to the link's last piece of code https://megakemp.com/2009/02/06/managing-shared-cookies-in-wcf/ 如果您觉得成功登录后每次发送cookie都很麻烦。您可以考虑使用MessageInspector,请参阅链接的最后一段代码https://megakemp.com/2009/02/06/managing-shared-cookies-in -wcf /

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM