我有一个DLL(vs2008中的库项目),它调用外部Web服务。 Project具有对外部Web服务的服务引用
我在单元测试项目中有单元测试和app.config(带有servicemodel配置),一切都是正确的。
现在,我使用Addin VS 2008,并且没有像Windows Forms或Asp.net这样的配置文件。 addin是一个DLL,它有配置文件。
如果我使用WCF(使用我的项目DLL),则找不到config system.servicemodel
我见过这个: http://vassiltonev.blogspot.com/2009/03/loading-custom-config-file-instead-of.html
但添加自定义wcf行为扩展会导致ConfigurationErrorsException
无法加载为扩展名'customTextMessageEncoding'注册的类型'Microsoft.ServiceModel.Samples.CustomTextMessageEncodingElement,CalidadCodigo.Integracion.CustomTextEncoder'。 (E:\ TFS \ pro \ AddIn \ bin \ Debug \ MyAddIn.dll.config第123行
我在我的扩展WCF中使用Assembly QualifiedName进行测试但是错误。
更多建议或任何示例代码?
我的配置
<extensions>
<bindingElementExtensions>
<add name="customTextMessageEncoding"
type="Microsoft.ServiceModel.Samples.CustomTextMessageEncodingElement,CalidadCodigo.Integracion.CustomTextEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bindingElementExtensions>
</extensions>
代码
internal static WebServicePortTypeClient CrearClienteWCF()
{
try
{
return new WebServicePortTypeClient();
}
catch (Exception ex)
{
//TODO: not found serviceModel config
var addInConfig = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Reflection.Assembly.GetExecutingAssembly().Location);
var endpointAddress = addInConfig.AppSettings.Settings[EasyVistaSvcEndPointAddress].Value;
var endpoint = new System.ServiceModel.EndpointAddress(endpointAddress);
return new WebServicePortTypeClient(EndPointConfigurationName, endpoint);
// The type 'Microsoft.ServiceModel.Samples.CustomTextMessageEncodingElement, CalidadCodigo.Integracion.CustomTextEncoder' registered for extension 'customTextMessageEncoding' could not be loaded. (E:\TFS\pro\AddIn\bin\Debug\MyAddIn.dll.config line 123)
}
}
答案 0 :(得分:1)
AFAIK无法在DLL中使用ConfigurationManager。我在编写VS2010的插件时遇到了同样的问题。
我的解决方案是从文件加载设置,在我自己的代码中创建端点和endpointadress,如下所示:
Uri myUri = loadUriFromFile();
var endpoint = new EndpointAddress(myUri);
NetTcpBinding binding = GetNewTcpBindingFromFile();
return new WebServicePortTypeClient(binding, endpoint);