Ctrl + Сдвиг + R -> Осуществляют рефакторинг с Resharper
Вы можете создать 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 = "";
I'm not too hot on WCF as I'm more used to .Net 2.0, but would this do it?
HttpContext.Current.Request.Url.ToString()
That should give you the url of the calling request. The catch here is that you could possibly have multiple domains or virtual directories pointing to the same service and it will only give you the url the client specified. However if you have multiple entry points, there is no "one" url anyway.
Начну с предположения, что вы используете HTTP - я уверен, что вы можете скорректировать подход в зависимости от того, что диктуют ваши конкретные условия. Я также пытался получить ответ, используя HttpContext, и обнаружил, что при запуске под Cassini значение равно null, поэтому я попробовал альтернативный подход.
System.ServiceModel.OperationContext содержит правильный контекст запроса. Вы можете проследить запрос вплоть до фактического сообщения запроса и вычистить заголовок.
Uri requestUri = System.ServiceModel.OperationContext.Current.RequestContext.RequestMessage.Headers.To;