从WCF服务器接收值

  • 本文关键字:服务器 WCF c# wcf
  • 更新时间 :
  • 英文 :


我已经设置了WCF服务器和客户端,所有这些都很好,我可以在服务器上调用该方法,并从该调用中初始化的对象接收...伟大。

我遇到的问题是服务器在启动时会收到一些参数,我看不到的是如何从服务器获得这些值服务器本身。

有没有办法提供此信息,除了将其保存在服务器首次接收时将其保存到文件之外,然后从服务器方法读取该文件?

谢谢

最简单的方法是拥有一个单顿服务对象。这可以通过用ServiceBehavior属性标记服务类并将此对象传递给ServiceHost构造函数来完成:

[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();

当单身模式不合适时,可以使用依赖注入,例如与团结:

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);
    }
}

最新更新