【问题标题】:How to read HTTP request headers in a WCF web service?如何读取 WCF Web 服务中的 HTTP 请求标头?
【发布时间】:2013-09-23 12:42:02
【问题描述】:

在 WCF Web 服务中,如何读取 HTTP/HTTPS 请求标头?在这种情况下,我试图确定客户端使用的原始 URL 主机。这可能位于负载均衡器的 X-Forwarded-Host 标头中,如果是直接框,则可能位于 Host 标头中。

我已经尝试过OperationContext.Current.IncomingMessageHeaders.FindHeader,但我认为这是查看 SOAP 标头而不是 HTTP 标头。

那么,如何读取 HTTP 标头?当然这是一个简单的问题,我错过了一些明显的东西。

编辑 - @sinfere 的回答几乎正是我所需要的。为了完整起见,这就是我最终得到的结果:

IncomingWebRequestContext request = WebOperationContext.Current.IncomingRequest;
WebHeaderCollection headers = request.Headers;
string host = null;

if (headers["X-Forwarded-Host"] != null)
    host = headers["X-Forwarded-Host"];
else if (headers["Host"] != null)
    host = headers["Host"];
else 
    host = defaulthost; // set from a config value

【问题讨论】:

  • 使用 ... WebOperationContext.Current.IncomingRequest.Headers
  • 虽然技术上不是标头,但 WCF 会处理来自原始 HTTP 请求的内容,因此您将无法访问服务内的请求内容。但是,您可以在 OperationsHandler 中调用服务方法之前获取它

标签: c# wcf web-services


【解决方案1】:

试试WebOperationContext.Current.IncomingRequest.Headers

我使用以下代码查看所有标题:

IncomingWebRequestContext request = WebOperationContext.Current.IncomingRequest;
WebHeaderCollection headers = request.Headers;

Console.WriteLine("-------------------------------------------------------");
Console.WriteLine(request.Method + " " + request.UriTemplateMatch.RequestUri.AbsolutePath);
foreach (string headerName in headers.AllKeys)
{
  Console.WriteLine(headerName + ": " + headers[headerName]);
}
Console.WriteLine("-------------------------------------------------------");

【讨论】:

  • 并非所有这些都有效(第二行 Consol.WriteLine 行),但其余部分让我到达了那里。谢谢。 +1
【解决方案2】:

这是我在我的 Azure WCF Web 服务之一中读取它们的方式。

IncomingWebRequestContext woc = WebOperationContext.Current.IncomingRequest;

string applicationheader = woc.Headers["HeaderName"];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2011-07-26
    • 2017-12-08
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多