为啥 app.config 中缺少 <system.serviceModel> 部分?

Posted

技术标签:

【中文标题】为啥 app.config 中缺少 <system.serviceModel> 部分?【英文标题】:Why is the <system.serviceModel> section missing from app.config?为什么 app.config 中缺少 <system.serviceModel> 部分? 【发布时间】:2012-10-25 05:29:06 【问题描述】:

我正在尝试使用 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 部分,如您所见。我应该手动添加吗?如果可以,我应该在里面放什么?

【问题讨论】:

一个很好的资源。请通过它(msdn.microsoft.com/en-us/library/ms731354.aspx) 【参考方案1】:

此部分用于 WCF 配置。在 Visual Studio 的“工具”部分中,您有一个“WCF 服务配置编辑器”,可帮助您创建此部分。如果您没有此部分,则必须在代码中对其进行配置,但这不是最佳做法。 在本节中,您必须放置端点、安全设置、绑定、wcf 合同……

【讨论】:

谢谢!在我看到你的答案之前,我已经设法手动添加了这个部分,它似乎解决了这个特殊问题:&lt;endpoint address="http://.../SiriServerApp/BusStopService?wsdl" binding="basicHttpBinding" contract="BusStopServiceBinding.BusStopPortType" name="MyBinding"/&gt;【参考方案2】:

如果您将服务引用添加到库,而不是主项目(exe 或 Web 应用程序等),那么必要的添加(通过 Visual Studio 工具)将添加到内部的 app.config库项目,而不是在您的主项目中。

但是,在运行时,仅使用主项目的app.config,因此您需要将库中(无用的)app.config 中的相关部分复制到主项目的部分中。

【讨论】:

是的,这是我在网上找到的答案,但就我而言,只有一个项目。总之,问题解决了。【参考方案3】:

我遇到了同样的错误,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");

【讨论】:

以上是关于为啥 app.config 中缺少 <system.serviceModel> 部分?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 app.config 来存储配置数据?

web.config 覆盖 app.config ...为啥?

为啥在添加 Microsoft.Bcl.Async 包后在 app.config 文件中添加了“bindingRedirect”?

为啥这个类库 dll 没有从 app.config 获取信息

为啥 App.config 存储连接字符串的位置比源代码中更安全?

为啥将 **appSettings** 部分添加到 App.config 会导致 WPF 应用程序出错?