我有一个在IIS中运行的WCF服务,它调用httpContext可用的类库中的函数。如何动态获取网站网址,这也可能是虚拟目录?
答案 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服务。
WebOperationContext.Current.IncomingRequest.Headers["host"]
- 提供服务主机名
WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.Host
- 提供服务主机名
WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.AbsoluteUri
- 提供服务完整网址
WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.AbsoluteUri
- 提供服务完整网址
您可以在MSDN
上获得有关WebOperationContext
课程的更多信息
答案 3 :(得分:2)
我对WCF不太热,因为我已经习惯了.Net 2.0,但是这样做了吗?
HttpContext.Current.Request.Url.ToString()
那应该给你调用请求的url。这里的问题是你可能有多个域或虚拟目录指向同一个服务,它只会给你客户指定的url。但是,如果您有多个入口点,则无论如何都没有“一个”网址。