2009-11-30 85 views
9

我有一个在IIS中运行的WCF服务,该服务在可用的httpContext类库中调用一个函数。我如何动态获取网站的网址,这可能也是一个虚拟目录?WCF服务,如何从类库中获取网站的URL?

+0

WCF服务的URL或作为HttpContext源的网站的URL? – Russell 2009-11-30 22:33:16

+0

托管WCF服务的网站的URL ...例如:http:// localhost/virtualDirectory from http://localhost/virtualDirectory/myService.svc – 2009-11-30 22:36:52

+0

哪个版本的IIS? IIS 6或7或7.5? WAS是否实施? – 2010-07-16 18:52:38

回答

4

您可以创建一个ServiceHostFactory,手动启动您的服务主机,然后将端点地址存储在您的应用程序要使用的静态类中。下面是一个简单的例子:

(在你的myService.svc):

<% 
@ServiceHost 
Service="MyNamespace.MyService" 
Factory="MyNamespace.MyServiceHostFactory" 
    %> 

(在你的MyServiceHostFactory.cs):

/// <summary> 
/// Extends ServiceHostFactory to allow ServiceHostFactory to be used. 
/// </summary> 
public class MyServiceHostFactory : ServiceHostFactory 
{ 
    /// <summary> 
    /// Creates a new ServiceHost using the specified service and base addresses. 
    /// </summary> 
    /// <param name="serviceType"></param> 
    /// <param name="baseAddresses"></param> 
    /// <returns></returns> 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     ServiceHost host; 
     host = new ServiceHost(serviceType, baseAddresses); 

     MyGlobalStaticClass.Address = baseAddresses[0]; // assuming you want the first endpoint address. 

     return host; 
    } 

(在你MyGlobalStaticClass.cs):

public static string Address = ""; 
2

我对WCF不太热,因为我更习惯.Net 2.0,但会这样做吗?

HttpContext.Current.Request.Url.ToString() 

这应该给你的调用请求的网址。这里的问题是,你可能有多个域或虚拟目录指向同一个服务,它只会给你客户端指定的url。但是,如果您有多个入口点,则无论如何都没有“一个”网址。

+1

这也假设WCF绑定是basicHttpBinding或HTTP绑定的排序(例如netTcpBinding没有HttpContext)。 – Russell 2009-12-01 02:12:30

25

我将首先假定您使用的是HTTP--我确定您可以调整方法根据你的具体情况决定。我也尝试使用HttpContext获得答案,并发现在Cassini下运行时该值为null,所以我尝试了另一种方法。

System.ServiceModel.OperationContext包含正确的请求上下文。您可以将请求转到实际请求消息并清理标题。

Uri requestUri = System.ServiceModel.OperationContext.Current.RequestContext.RequestMessage.Headers.To; 
3

目前我正在使用WCF REST服务和我有同样的要求。我需要在我的一个方法中使用服务主机URL。下面是在类库中获取WCF REST服务主机/ URL的不同方式。

您可以使用WebOperationContext类,其中System.ServiceModel.Web命名空间中的类可用于获取服务url。请注意,此类仅适用于WCF REST服务。

  1. WebOperationContext.Current.IncomingRequest.Headers["host"] - 提供服务的主机名称

  2. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.Host - 提供服务的主机名称

  3. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.AbsoluteUri - 提供服务的完整URL

  4. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.AbsoluteUri - 提供服务的完整URL

您可以从MSDN获取有关WebOperationContext的更多信息

+1

对我来说,UriTemplateMatch始终为空,所以我不能使用3/4的这些建议。 – 2014-06-27 22:36:32