0
我已经建立了一个WCF服务器和客户端,并且所有工作都很好,我可以在服务器上调用该方法,并从该调用接收初始化的对象...很好。从WCF服务器接收值
我遇到的问题是服务器在启动时接收到一些参数,但我无法看到的是我如何从服务器获取这些值,因为看起来我无法从中获取消息或预初始化的类服务器本身。
有没有办法提供这种信息,而不是将其保存到文件,当服务器第一次收到它,然后从服务器方法读取该文件?
谢谢
我已经建立了一个WCF服务器和客户端,并且所有工作都很好,我可以在服务器上调用该方法,并从该调用接收初始化的对象...很好。从WCF服务器接收值
我遇到的问题是服务器在启动时接收到一些参数,但我无法看到的是我如何从服务器获取这些值,因为看起来我无法从中获取消息或预初始化的类服务器本身。
有没有办法提供这种信息,而不是将其保存到文件,当服务器第一次收到它,然后从服务器方法读取该文件?
谢谢
最简单的方法是有一个单身服务对象。
[ServiceContract]
public interface IExampleService
{
[OperationContract]
int GetInitValue();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class ExampleService : IExampleService
{
private readonly int initValue;
public ExampleService(int initValue)
{
this.initValue = initValue;
}
public int GetInitValue() => initValue;
}
// ...
// public ServiceHost(object singletonInstance, params Uri[] baseAddresses)
var host = new ServiceHost(new ExampleService(someValue)));
host.AddServiceEndpoint(typeof(IExampleService),
new WSHttpBinding(), "http://localhost:8080");
host.Open();
当单模式是不合适的,可以使用依赖注入,例如:这可以通过标记与ServiceBehavior
属性的服务类和传递该对象ServiceHost
构造进行与团结:
var container = new UnityContainer();
container
.RegisterType<IExampleService, ExampleService>()
// When service object is created, someValue is passed to it's constructor
new InjectionConstructor(someValue));
var host = new ServiceHost(typeof(ExampleService));
host.AddServiceEndpoint(typeof(IExampleService),
new WSHttpBinding(), "http://localhost:8080")
.EndpointBehaviors.Add(new UnityEndpointBehavior(container));
host.Open();
// ...
class UnityEndpointBehavior : IEndpointBehavior
{
private readonly IUnityContainer container;
public UnityEndpointBehavior(IUnityContainer container)
{
this.container = container;
}
public void AddBindingParameters(ServiceEndpoint endpoint,
BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint,
ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint,
EndpointDispatcher endpointDispatcher)
{
endpointDispatcher.DispatchRuntime.InstanceProvider =
new UnityInstanceProvider(container, endpoint.Contract.ContractType);
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
class UnityInstanceProvider : IInstanceProvider
{
private readonly IUnityContainer container;
private readonly Type contractType;
public UnityInstanceProvider(IUnityContainer container, Type contractType)
{
this.container = container;
this.contractType = contractType;
}
public object GetInstance(InstanceContext instanceContext)
{
return GetInstance(instanceContext, null);
}
public object GetInstance(InstanceContext instanceContext, Message message)
{
return container.Resolve(contractType);
}
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
container.Teardown(instance);
}
}
第一个选项完美的作品,谢谢:) –