如何判断WCF服务是通过HTTP还是HTTPS调用的?

如何判断WCF服务是通过HTTP还是HTTPS调用的?,wcf,Wcf,假设您有一个可以通过HTTP和HTTPS访问的WCF服务,但您只希望某些方法可以通过HTTPS访问——我如何检查当前请求是否为HTTPS?由于HttpContext为空,您不能简单地检查HttpContext.Current.Request.IsSecureConnection——还有其他想法吗?提前感谢。HTTPS通过与HTTP不同的端口提供。假设您知道端口,也许检查一下就足够了。考虑一下,WCF应用程序也可以作为Windows服务托管,根本不需要ASP.NET,在这种情况下,就没有“安全”和

假设您有一个可以通过HTTP和HTTPS访问的WCF服务,但您只希望某些方法可以通过HTTPS访问——我如何检查当前请求是否为HTTPS?由于HttpContext为空,您不能简单地检查HttpContext.Current.Request.IsSecureConnection——还有其他想法吗?提前感谢。

HTTPS通过与HTTP不同的端口提供。假设您知道端口,也许检查一下就足够了。

考虑一下,WCF应用程序也可以作为Windows服务托管,根本不需要ASP.NET,在这种情况下,就没有“安全”和“不安全”这样的东西。这就是为什么WCF不尝试提供这些信息的原因之一

一个选项是在中运行WCF服务,您可以访问
HttpContext.Current
实例

然而,我的选择只是为安全操作创建一个不同的、仅限SSL的服务。我真的认为你无论如何都想这么做,所以合同是明确的;否则,您就只能进行运行时检查,客户端可能不知道他们尝试使用的方法是不允许的

web服务中的“最佳实践”是使这些类型的限制尽可能明确,只有通过SSL才能使用单独的服务是描述服务限制的最清晰的方法。

(基于Matt Ellen在answer中的@Aaronaught评论…)

看起来像

OperationContext.Current.RequestContext.RequestMessage.Headers.To.Scheme
包含“http”或“https”等()。

如何:

var iwrc = WebOperationContext.Current.IncomingRequest;
var isHttps = iwrc.UriTemplateMatch.BaseUri.Scheme.Equals("https", StringComparison.InvariantCultureIgnoreCase);

这非常简单,不依赖端口号,在自主机WCF服务器(站点中没有IIS)中工作正常。

对,那么您如何找到正在使用的端口?元问题。@Aaronaught:
OperationContext.Current.RequestContext.RequestMessage.Headers.To
应该返回请求发送到的uri。