我正在尝试使用WCF服务。我添加了一个服务参考,现在我试着称之为:
BusStopServiceBinding.BusStopPortTypeClient client = new BusStopServiceBinding.BusStopPortTypeClient();
但是,我收到了这个错误:
找不到引用合同的默认端点元素 ServiceModel客户端中的“BusStopServiceBinding.BusStopPortType” 配置部分。这可能是因为没有配置文件 找到您的应用程序,或者因为没有端点元素匹配 这个合同可以在客户元素中找到。
我的app.config
文件如下所示:
<?xml version="1.0"?>
<configuration>
<configSections>
</configSections>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
</configuration>
正如您所见,没有serviceModel
部分。我应该手动添加它,如果是这样,我应该放入什么?
答案 0 :(得分:1)
此部分适用于WCF配置。在visual studio的Tools部分中,您有一个“WCF服务配置编辑器”,可帮助您创建此部分。如果您没有此部分,则必须在代码中对其进行配置,但这不是最佳做法。 在本节中,您必须提供终点,安全设置,绑定,wcf合同......
答案 1 :(得分:1)
如果您将服务引用添加到库,而不是您的主项目(exe或Web应用程序等),那么将(通过Visual Studio工具)对app.config
进行必要的添加在图书馆项目内,而不是在你的主项目中。
但是,在运行时,只使用主项目的app.config
,因此您需要将库中(无用)app.config
的相关部分复制到主项目中。
答案 2 :(得分:0)
我遇到了同样的错误,Damien_The_Unbeliever的回答帮助我理解了&&解决了我的问题:“但是,在运行时,只使用了主项目的app.config”。
我在类库项目中有wsdl代理。虽然我的UnitTest项目能够从该类库的app.config中读取,但是在运行时该类库的app.config变得无关紧要。
我的解决方案是为自动生成的客户端类创建局部类,然后 依靠从代码配置的System.ServiceModel,而不是从知道什么app.config的人那里读取它:
public partial class WsdlClient
{
public WsdlClient (string endpointUrl, TimeSpan timeout, string username, string password) :
base(WsdlClient.GetBindingForEndpoint(timeout), WsdlClient.GetEndpointAddress(endpointUrl))
{
this.ChannelFactory.Credentials.UserName.UserName = username;
this.ChannelFactory.Credentials.UserName.Password = password;
}
private static System.ServiceModel.Channels.Binding GetBindingForEndpoint(TimeSpan timeout)
{
var httpsBinding = new BasicHttpsBinding();
httpsBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
httpsBinding.Security.Mode = BasicHttpsSecurityMode.Transport;
var integerMaxValue = int.MaxValue;
httpsBinding.MaxBufferSize = integerMaxValue;
httpsBinding.MaxReceivedMessageSize = integerMaxValue;
httpsBinding.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
httpsBinding.AllowCookies = true;
httpsBinding.ReceiveTimeout = timeout;
httpsBinding.SendTimeout = timeout;
httpsBinding.OpenTimeout = timeout;
httpsBinding.CloseTimeout = timeout;
return httpsBinding;
}
private static System.ServiceModel.EndpointAddress GetEndpointAddress(string endpointUrl)
{
if (!endpointUrl.StartsWith("https://"))
{
throw new UriFormatException("The endpoint URL must start with https://.");
}
return new System.ServiceModel.EndpointAddress(endpointUrl);
}
}
WsdlClient MyWsdlClient =>
new WsdlClient (ConfigurationManager.AppSettings["endpointUrl"]
, new TimeSpan(0, 0, 1, 0),
"blabla",
"blabla");