Сообщение Re[2]: Как передать в WCF веб-сервис ссылку на другой компон от 19.04.2015 7:04
Изменено 19.04.2015 7:05 IvanXXX
Здравствуйте, Михаил.
Относительно IInstanceProvider: проблема в том, что экземпляр провайдера создается средой WCF путем вызова конструктора без провайдеров. Если у меня была проблема — передать ссылки на какие-то объекты создаваемому веб-сервису, то теперь проблема — передать их провайдеру, который создает сервис.
Нашел решение попроще:
Теперь из любого метода веб-сервиса можно обратиться к свойству данным, переданным приложением:
Смущает только очевидная простота схемы по сравнению с расширением WCF через custom IInstanceProvider.
Относительно IInstanceProvider: проблема в том, что экземпляр провайдера создается средой WCF путем вызова конструктора без провайдеров. Если у меня была проблема — передать ссылки на какие-то объекты создаваемому веб-сервису, то теперь проблема — передать их провайдеру, который создает сервис.
Нашел решение попроще:
namespace Server.Impl
{
class Program
{
static void Main(string[] args)
{
// Step 1 Create a URI to serve as the base address.
var baseAddress = new Uri("http://localhost:8000/Server.Impl/");
// Step 2 Create a ServiceHost instance
var host = new MyServiceHost("Inititalization data should be here", typeof(Service), baseAddress);
try
{
// Step 3 Add a service endpoint.
host.AddServiceEndpoint(typeof(IService), new WSHttpBinding(), "http://localhost:8000/Server.Impl/service/wshttpbinding");
// Step 4 Enable metadata exchange.
var smb = new ServiceMetadataBehavior {HttpGetEnabled = true};
host.Description.Behaviors.Add(smb);
// Step 5 Start the service.
host.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
host.Close();
}
catch (CommunicationException ce)
{
Console.WriteLine("An exception occurred: {0}", ce.Message);
host.Abort();
}
}
}
public class MyServiceHost : ServiceHost
{
public object Data { get; private set; }
public MyServiceHost(object data, Type serviceType, params Uri[] baseAddresses)
:base(serviceType, baseAddresses)
{
Data = data;
}
}
}
Теперь из любого метода веб-сервиса можно обратиться к свойству данным, переданным приложением:
var appData = ((MyServiceHost)OperationContext.Current.Host).Data;
Смущает только очевидная простота схемы по сравнению с расширением WCF через custom IInstanceProvider.
Здравствуйте, Михаил.
Относительно IInstanceProvider: проблема в том, что экземпляр провайдера создается средой WCF путем вызова конструктора без провайдеров. Если у меня была проблема — передать ссылки на какие-то объекты создаваемому веб-сервису, то теперь проблема — передать их провайдеру, который создает сервис.
Нашел решение попроще:
Теперь из любого метода веб-сервиса можно обратиться к данным, переданным приложением:
Смущает только очевидная простота схемы по сравнению с расширением WCF через custom IInstanceProvider.
Относительно IInstanceProvider: проблема в том, что экземпляр провайдера создается средой WCF путем вызова конструктора без провайдеров. Если у меня была проблема — передать ссылки на какие-то объекты создаваемому веб-сервису, то теперь проблема — передать их провайдеру, который создает сервис.
Нашел решение попроще:
namespace Server.Impl
{
class Program
{
static void Main(string[] args)
{
// Step 1 Create a URI to serve as the base address.
var baseAddress = new Uri("http://localhost:8000/Server.Impl/");
// Step 2 Create a ServiceHost instance
var host = new MyServiceHost("Inititalization data should be here", typeof(Service), baseAddress);
try
{
// Step 3 Add a service endpoint.
host.AddServiceEndpoint(typeof(IService), new WSHttpBinding(), "http://localhost:8000/Server.Impl/service/wshttpbinding");
// Step 4 Enable metadata exchange.
var smb = new ServiceMetadataBehavior {HttpGetEnabled = true};
host.Description.Behaviors.Add(smb);
// Step 5 Start the service.
host.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
host.Close();
}
catch (CommunicationException ce)
{
Console.WriteLine("An exception occurred: {0}", ce.Message);
host.Abort();
}
}
}
public class MyServiceHost : ServiceHost
{
public object Data { get; private set; }
public MyServiceHost(object data, Type serviceType, params Uri[] baseAddresses)
:base(serviceType, baseAddresses)
{
Data = data;
}
}
}
Теперь из любого метода веб-сервиса можно обратиться к данным, переданным приложением:
var appData = ((MyServiceHost)OperationContext.Current.Host).Data;
Смущает только очевидная простота схемы по сравнению с расширением WCF через custom IInstanceProvider.