日期:2014-05-18  浏览次数:21029 次

请教WCF的Endpoints Configuration问题
WCF   的Endpoints   Configuration如果存在数据库表的某个字段而非配置文件,类型为string或xml。如果创建ServerHost?谢谢指教。

------解决方案--------------------
所有写在app.config中与ENDPOINT有关的配置都可以用其他方式存储及获得
例如:
public CustomServiceHost(Uri uri, string configData)

{

this.InitConfig(configData);

this.InitializeDescription(new UriSchemeKeyedCollection(new Uri[] { uri }));


}

private void InitConfig(string configData)

{

this._config = ConfigHelper.GetConfig(configData);

ValidateConfig(configData);

}

private void ValidateConfig(string configData)

{

//TODO:

}

System.Configuration.Configuration _config;

public System.Configuration.Configuration Config

{

get { return _config; }

set { _config = value; }

}

protected override System.ServiceModel.Description.ServiceDescription CreateDescription(out IDictionary <string, System.ServiceModel.Description.ContractDescription> implementedContracts)

{

Dictionary <string, ContractDescription> contracts = new Dictionary <string, ContractDescription> ();

List <ServiceEndpoint> endpoints = new List <ServiceEndpoint> ();

Configuration c = this.Config;

ServicesSection ss = c.GetSection( "system.serviceModel/services ") as ServicesSection;

ServiceElement service = ss.Services[0];

ServiceEndpointElement epe = service.Endpoints[0];


ContractDescription cd = ContractDescription.GetContract(ContractType(epe.Contract));

contracts.Add(cd.Name, cd);

foreach (OperationDescription od in cd.Operations)

od.Behaviors.Add(new AdapterOperationBehavior());

Binding b = GetBinding(epe.Binding);

EndpointAddress ea = new EndpointAddress(epe.Address);

ServiceEndpoint ep = new ServiceEndpoint(cd, b, ea);

endpoints.Add(ep);

ServiceDescription sd = new ServiceDescription(endpoints);


ServiceBehaviorAttribute sb = new ServiceBehaviorAttribute();

sb.SetWellKnownSingleton(this);

sb.InstanceContextMode = InstanceContextMode.Single;

sd.Behaviors.Add(sb);

//add behaviors

ServiceMetadataBehavior smb = new ServiceMetadataBehavior();

smb.HttpGetEnabled = true;

sd.Behaviors.Add(smb);

implementedContracts = contracts;

return sd;

}

private Binding GetBinding(string name)

{

BindingsSection bindings = this.Config.GetSection( "system.serviceModel/bindings ") as BindingsSection;

BindingCollectionElement bc = bindings[name];

Binding b = Activator.CreateInstance(bc.BindingType) as Binding;

return b;

}

Type ContractType(string type)

{

Type t = null;

t = Type.GetType(type);

return t;

}