WCF服务,如何从类库中获取网站URL?

时间:2009-11-30 22:14:31

标签: c# .net wcf

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

4 个答案:

答案 0 :(得分:25)

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

System.ServiceModel.OperationContext包含正确的请求上下文。您可以将请求按照实际请求消息进行操作并清除标题。

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

答案 1 :(得分: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 :(得分:3)

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

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

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

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

  3. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.AbsoluteUri - 提供服务完整网址

  4. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.AbsoluteUri - 提供服务完整网址

  5. 您可以在MSDN

    上获得有关WebOperationContext课程的更多信息

答案 3 :(得分:2)

我对WCF不太热,因为我已经习惯了.Net 2.0,但是这样做了吗?

HttpContext.Current.Request.Url.ToString()

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