我将WPF应用程序与2个WCF应用程序集成在一起(一个是“身份验证应用程序”,另一个是需要身份验证的“真实”应用程序)。 “身份验证应用程序”返回3个ToString
标头,我需要将它们添加到“真实”应用程序的请求标头中。但我不确定如何获取这些标头(仅结果):
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");
的首次调用对于成功登录将返回true或false,并且标头包含PerformLoginAsync
。如何获取这些标头并在对Set-Cookie
的下一个请求中设置Cookie
标头?
如果还有其他问题,请告诉我!
答案 0 :(得分:2)
您应该使用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>
然后您可以按以下方式调用登录方法。
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/