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);
}
}
第一個選項完美的作品,謝謝:) –