"Bu hata, hizmeti bir sınıf kitaplığında çağırıyor ve sınıf kitaplığını başka bir projeden çağırıyorsanız ortaya çıkabilir."
"Bu durumda WS yapılandırma ayarlarını ana projeler app.config içine bir winapp veya web.config ise bir web uygulaması eklemeniz gerekir. PRISM ve WPF / Silverlight ile bile gitmenin yolu budur."
Evet, ancak ana projeyi değiştiremiyorsanız (örneğin Orchard CMS), projenizde WCF hizmeti yapılandırmasını koruyabilirsiniz.
İstemci oluşturma yöntemiyle bir hizmet yardımcısı oluşturmanız gerekir:
public static class ServiceClientHelper
{
public static T GetClient<T>(string moduleName) where T : IClientChannel
{
var channelType = typeof(T);
var contractType = channelType.GetInterfaces().First(i => i.Namespace == channelType.Namespace);
var contractAttribute = contractType.GetCustomAttributes(typeof(ServiceContractAttribute), false).First() as ServiceContractAttribute;
if (contractAttribute == null)
throw new Exception("contractAttribute not configured");
//path to your lib app.config (mark as "Copy Always" in properties)
var configPath = HostingEnvironment.MapPath(String.Format("~/Modules/{0}/bin/{0}.dll.config", moduleName));
var configuration = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = configPath }, ConfigurationUserLevel.None);
var serviceModelSectionGroup = ServiceModelSectionGroup.GetSectionGroup(configuration);
if (serviceModelSectionGroup == null)
throw new Exception("serviceModelSectionGroup not configured");
var endpoint = serviceModelSectionGroup.Client.Endpoints.OfType<ChannelEndpointElement>().First(e => e.Contract == contractAttribute.ConfigurationName);
var channelFactory = new ConfigurationChannelFactory<T>(endpoint.Name, configuration, null);
var client = channelFactory.CreateChannel();
return client;
}
}
ve kullanın:
using (var client = ServiceClientHelper.GetClient<IDefaultNameServiceChannel>(yourLibName)) {
... get data from service ...
}
Bu makaledeki ayrıntılara bakın .