gpt4 book ai didi

asp.net - 如何在 HTTP 请求中设置 http cookies( header )

转载 作者:可可西里 更新时间:2023-11-01 16:31:18 32 4
gpt4 key购买 nike

我正在尝试以 ASP.Net 兼容模式设置托管在 IIS 中的 WCF 服务,该服务通过 Forms 身份验证保护并通过 IE 中的 .Net 用户控件访问。 (参见 Secure IIS hosted WCF service for access via IE hosted user control)。

IE 中的用户控件是必需的,因为它使用特定的第三方控件,在 Silverlight 或 AJAX 中不存在任何可比的控件。

因此,我需要 UserControl 在访问 WCF 服务之前在 http 请求 header 中设置身份验证和 session ID cookie。我的方法是设置执行此操作的消息检查器。

所以我定义了 Message Inspector:

public class CookieInspector : IClientMessageInspector {

public void AfterReceiveReply(ref Message reply, object correlationState) {
}

public object BeforeSendRequest(
ref Message request,
IClientChannel channel) {

HttpRequestMessageProperty messageProperty;

if (request.Properties.ContainsKey(HttpRequestMessageProperty.Name)) {
messageProperty = (HttpRequestMessageProperty) request.Properties[
HttpRequestMessageProperty.Name
];
}
else {
messageProperty = new HttpRequestMessageProperty();
request.Properties.Add(
HttpRequestMessageProperty.Name,
messageProperty
);
}

// Set test headers for now...
messageProperty.Headers.Add(HttpRequestHeader.Cookie, "Bob=Great");
messageProperty.Headers.Add("x-chris", "Beard");

return null;
}
}

和端点行为:

public class CookieBehavior : IEndpointBehavior {
public void AddBindingParameters(
ServiceEndpoint endpoint,
BindingParameterCollection bindingParameters) {
}

public void ApplyClientBehavior(
ServiceEndpoint endpoint,
ClientRuntime clientRuntime) {
clientRuntime.MessageInspectors.Add(new CookieInspector());
}

public void ApplyDispatchBehavior(
ServiceEndpoint endpoint,
EndpointDispatcher endpointDispatcher) {
}

public void Validate(ServiceEndpoint endpoint) {
}
}

然后我在代码中配置和创建我的 channel 和 WCF 客户端:

var ea = new EndpointAddress("http://.../MyService.svc");

// EDIT: Http cookies can't be set with WSHttpBinding :-(
// var binding = WSHttpBinding();
var binding = new BasicHttpBinding();


// Disable automatically managed cookies (which enables user cookies)
binding.AllowCookies = false;


binding.MaxReceivedMessageSize = 5000000;
binding.ReaderQuotas.MaxStringContentLength = 5000000;
var cf = new ChannelFactory<ITranslationServices>(binding, ea);
cf.Endpoint.Behaviors.Add(new CookieBehavior());

ITranslationServices service = cf.CreateChannel();

但是,当我使用 Fiddler 查看我的请求时,未设置 http header 和 cookie,我不知道为什么。我已经阅读了 Net、Stackoverflow 等上的各种文章,基本上说它应该可以工作,但事实并非如此。是我遗漏了一些明显的东西,还是 WCF 或其他东西中存在错误?

最佳答案

好吧,我想通了,如果我使用 basicHttpBinding 而不是 WSHttpBinding,它就可以工作。不知道为什么...

关于asp.net - 如何在 HTTP 请求中设置 http cookies( header ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4955401/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com