【问题标题】:Could not find default endpoint element找不到默认端点元素
【发布时间】:2010-09-26 01:02:23
【问题描述】:

我已将代理添加到 VS2008/.NET 3.5 解决方案的 Web 服务。构建客户端.NET时抛出这个错误:

在 ServiceModel 客户端配置部分中找不到引用合同“IMySOAPWebService”的默认端点元素。这可能是因为找不到您的应用程序的配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素。

搜索此错误告诉我使用合同中的完整命名空间。这是我的带有完整命名空间的 app.config:

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" bindingConfiguration="IMySOAPWebServicebinding"
            contract="Fusion.DataExchange.Workflows.IMySOAPWebService" name="IMySOAPWebServicePort" />
</client>

我在本地运行 XP(我之所以提到这一点,是因为许多 Google 搜索结果都提到了 win2k3) app.config 被复制到 app.exe.config,所以这也不是问题。

有什么线索吗?

【问题讨论】:

  • 如果这是在 Web 服务器上运行,那么您需要添加 .svc。示例:“192.168.100.87:7001/soap/IMySOAPWebService.svc
  • 该服务不是 .NET 服务,它不在网络服务器上运行。
  • 我在 .NET 开发的项目中解决了这个问题,但是我在 VB6 中有一些项目,我也遇到了同样的问题。有什么想法吗?

标签: wcf .net-3.5 wcf-binding endpoint


【解决方案1】:

“如果您在类库中调用服务并从另一个项目中调用类库,则可能会出现此错误。”

在这种情况下,您需要将 WS 配置设置包含到主项目 app.config(如果它是一个 winapp)或 web.config(如果它是一个 Web 应用程序)中。这也是使用 PRISM 和 WPF/Silverlight 的方法。

【讨论】:

  • 这不是我的具体问题的原因,但我相信这会对其他人有所帮助。谢谢
  • 有没有办法自动合并两者?如果类库更新其配置怎么办?您是否只是忘记在所有引用它的项目中更新复制的配置信息?这个修复似乎太依赖开发者的警惕性了……
  • 我在 WP7 应用程序(我相信是 Silverlight)中遇到了同样的错误,我花了很长时间才注意到在项目目录中生成了 ServiceReferences.ClientConfig。将 &lt;bindings&gt;&lt;client&gt; 元素从我的库中的文件复制到我的主应用程序(以前是空的)可以正常工作。
  • 发生这种情况的原因(据我了解)是从解决方案中的主项目读取配置值,例如 web、winforms、wpf 等。例如,您有一个类库项目要访问数据库,connectionString 条目需要在主项目配置中,而不是在类库配置中。
  • 因此我们可以得出结论,如果我们在库中使用 WCF,最好像链接stackoverflow.com/questions/7688798/… 所示直接编码设置。
【解决方案2】:

我通过自己创建绑定和端点地址实例解决了这个问题(我认为其他人可能已经建议) - 因为我不想向配置文件添加新设置(这是对一些现有库代码的替代,它是被广泛使用,并且以前使用过较旧的 Web 服务参考等),因此我希望能够将其放入而无需在任何地方添加新的配置设置。

var remoteAddress = new System.ServiceModel.EndpointAddress(_webServiceUrl);

using (var productService = new ProductClient(new System.ServiceModel.BasicHttpBinding(), remoteAddress))
{
    //set timeout
    productService.Endpoint.Binding.SendTimeout = new TimeSpan(0,0,0,_webServiceTimeout);

    //call web service method
    productResponse = productService.GetProducts();
} 

编辑

如果您使用的是 https,那么您需要使用 BasicHttpsBinding 而不是 BasicHttpBinding

【讨论】:

  • 这是一个有用的答案。在我使用的 Web 服务上,自定义端点必须绑定在对象的初始声明中。如果我稍后尝试这样做,它就行不通了。
  • 尽管我怀疑最佳答案也可能起到了作用,但您的解决方案确实有效,而且我似乎更喜欢将我自己的配置文件一起破解。
  • 很有魅力!我更喜欢能够在代码中设置端点,而不是在我的应用中分发“app.config”文件。
  • 如果是 Https web 服务记得把 BasicHttpBinding() 改成 BasicHttpsBinding()
  • 此解决方案最适合 EXCEL-DNA 等没有 app.config 或 web.config 的应用程序。
【解决方案3】:

测试了几个选项,我终于通过使用解决了这个问题

contract="IMySOAPWebService"

即配置中没有完整的命名空间。由于某种原因,全名没有正确解析

【讨论】:

  • 看来,合同名称的书写方式必须与客户端完全相同。就我而言,我有 var proxy = new ExternalServices.ServiceClient("MyServiceEndpoint"); 当我将命名空间添加到合同时它起作用了:contract="ExternalServices.IMyService"
  • 这对我不起作用。我的问题可能有点不同。我有时会收到此错误,但并非总是如此。可能是什么问题。错误可能出现在服务端吗?_谢谢
【解决方案4】:

我也遇到过同样的问题。事实证明,对于 Web REFERENCE,您必须将 URL 作为第一个参数提供给构造函数:

new WebService.WebServiceSoapClient("http://myservice.com/moo.aspx");

对于新样式的 web SERVICE REFERENCE,您必须提供一个引用配置中端点条目的名称:

new WebService.WebServiceSoapClient("WebServiceEndpoint");

Web.configApp.config 中有相应的条目:

<client>
      <endpoint address="http://myservice.com/moo.aspx"
        binding="basicHttpBinding" 
        bindingConfiguration="WebService"
        contract="WebService.WebServiceSoap"
        name="WebServiceEndpoint" />
    </client>
  </system.serviceModel>

很难消除“它在旧程序中工作”的狭隘观点......

【讨论】:

  • 啊哈!这为我修复了它,我之前只是使用一个空的构造函数,它一直失败: new WebService.WebServiceSoapClient(); //失败
  • 这个解决方案确实有效!但是,我真的很好奇为什么没有加载默认端点?有什么想法可能是什么原因?
  • @Andomar 很抱歉提出一个旧线程。与另一个相比,WebReference 和 ServiceReference 有什么优势吗?我认为前者对我来说更方便,但 ServiceReference 是我猜想的很酷的新东西......
【解决方案5】:

我遇到过这样的情况

  • WCF 服务托管在某处
  • 主要项目
  • “类库”类型的消费者项目具有对 WCF 服务的服务引用
  • 主项目调用消费者项目中的方法

现在Consumer项目在我的app.config的&lt;system.serviceModel&gt;标签中有所有相关的配置设置,它仍然抛出和上面一样的错误。

我所做的只是将相同的标签 &lt;system.serviceModel&gt; 添加到我的主项目的 app.config 文件中,最后我们可以开始了。

就我而言,真正的问题是读取错误的配置文件。它指的是主项目的配置,而不是消费者的 app.config。我花了两个小时才弄明白。

【讨论】:

  • 相同。在库中搜索 &lt;system.serviceModel&gt;,然后将其复制到主应用程序的 app.config。只是在运行时未读取类库 app.configs 的另一个症状。我花了很多时间来补偿这种疏忽(imo)。如果我想让库从它的 app.config 中读取它的配置,就让它吧。否则,为什么首先要有一个用于类库的 app.config??
【解决方案6】:

“如果您在类库中调用服务并从另一个项目中调用类库,则可能会出现此错误。”

“在这种情况下,如果它是一个 winapp,则需要将 WS 配置设置包含到主项目 app.config 中;如果它是一个 Web 应用程序,则需要将其包含到主项目 app.config 中。即使使用 PRISM 和 WPF/Silverlight,这也是要走的路。”

可以,但是如果您不能更改主项目(例如 Orchard CMS),您可以在项目中保留 WCF 服务配置。

您需要使用客户端生成方法创建一个服务助手:

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;
    }
}

并使用它:

using (var client = ServiceClientHelper.GetClient<IDefaultNameServiceChannel>(yourLibName)) {
                ... get data from service ...
            }

详见this article

【讨论】:

    【解决方案7】:

    这个让我发疯了。

    我将 Silverlight 3 Prism (CAB) 与 WCF 结合使用

    当我在 Prism 模块中调用 WCF 服务时,我得到了同样的错误:

    找不到引用合约的默认端点元素 服务模型客户端配置部分中的“IMyService”。这 可能是因为没有为您的应用程序找到配置文件 或者因为找不到与此合同匹配的端点元素 在客户端元素中

    事实证明,它在 Shell 的 .xap 文件中查找 ServiceReferences.ClientConfig 文件,而不是在模块的 ServiceReferences.ClientConfig 文件中。我添加了我的端点并绑定到我的 Silverlight Shell 应用程序中的现有 ServiceReferences.ClientConfig 文件(它调用它自己的 WCF 服务)。

    然后我必须重新构建 Shell 应用程序,以便为我的 Web 项目的 ClientBin 文件夹生成新的 .xap 文件。

    现在这行代码终于可以工作了:

    MyServiceClient myService = new MyServiceClient();
    

    【讨论】:

      【解决方案8】:

      当您遇到从类文件中引用服务的令人麻木的模糊错误时,这里的几个响应找到了正确的解决方案:将服务配置信息复制到控制台或 Windows 应用程序的 app.config web.config 中。这些答案似乎都没有告诉你要复制什么。让我们试着纠正它。

      这是我从类库的配置文件中复制到控制台应用程序的配置文件中的内容,以便为我编写的名为“TranslationServiceOutbound”的服务解决这个疯狂的错误。

      您基本上想要 system.serviceModel 部分中的所有内容:

        <system.serviceModel>
      <bindings>
        <basicHttpBinding>
          <binding name="BasicHttpBinding_ITranslationServiceOutbound" />
        </basicHttpBinding>
      </bindings>
      <client>
        <endpoint address="http://MyHostName/TranslationServiceOutbound/TranslationServiceOutbound.svc"
          binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITranslationServiceOutbound"
          contract="TranslationService.ITranslationServiceOutbound" name="BasicHttpBinding_ITranslationServiceOutbound" />
      </client>
      

      【讨论】:

        【解决方案9】:

        我在 ASP.NET 应用程序中收到此错误,其中 WCF 服务已添加到类库中,该类库作为 bin 文件夹中的引用 .dll 文件添加到 ASP.NET 应用程序中。要解决该错误,需要将引用 WCF 服务的类库中 app.config 文件中的配置设置复制到 ASP.NET 站点/应用的 web.config 设置中。

        【讨论】:

        • 虽然其他答案可能已经描述了同样的问题。这个答案描述了我的确切情况,我终于明白了这个问题。谢谢你拯救了我的一天
        【解决方案10】:

        我遇到了同样的问题,但更改合同命名空间对我不起作用。所以我尝试了 .Net 2 样式的 Web 参考而不是 .Net 3.5 服务参考。那行得通。

        要在 Visual Studio 2008 中使用 Web 引用,请单击“添加服务引用”,然后在出现对话框时单击“高级”。在那里,您将找到一个选项,让您可以使用 Web 引用而不是服务引用。

        【讨论】:

        • 这也是我最终所做的。我希望这个问题对我有意义。
        • 这也对我有用。现在,我的解决方案(Settings.Settings,一个新的 Web References 文件夹)中无缘无故地出现了所有这些额外的垃圾。当我有更多时间时,将不得不回来并重新访问。
        • 同意。我有同样的问题,并通过将其更改为网络参考来解决它。
        【解决方案11】:

        我发现(以及在使用类库接口时复制到客户端 UI 的 App.config)我必须在绑定的名称前面加上服务引用的名称(我的是 ServiceReference 在下面)。

        例如:

        <endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
              bindingConfiguration="BasicHttpBinding_ISchedulerService"
              contract="ServiceReference.ISchedulerService" 
              name="BasicHttpBinding_ISchedulerService" />
        

        而不是默认生成的:

        <endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
              bindingConfiguration="BasicHttpBinding_ISchedulerService"
              contract="ISchedulerService" 
              name="BasicHttpBinding_ISchedulerService" />
        

        【讨论】:

        • 我必须做同样的事情。我真的不明白为什么。
        【解决方案12】:

        对使用服务的非库应用程序进行单元测试可能会导致此问题。

        其他人输入的信息解决了此问题的根本原因。如果您正在尝试编写自动化测试用例并且您正在测试的单元实际上会调用服务接口,则需要将服务引用添加到测试项目中。这是使用库类型错误的应用程序的一种风格。不过我并没有立即意识到这一点,因为我使用接口的代码不在库中。但是,当测试实际运行时,它将从测试程序集运行,而不是从被测程序集运行。

        向单元测试项目添加服务引用解决了我的问题。

        【讨论】:

        • 是的,就是这样!!
        【解决方案13】:

        我在单元测试中有一个情况。我将 app.config 文件复制到了单元测试项目中。所以单元测试项目也包含端点信息。

        【讨论】:

        • 我没有复制完整的 app.config,而是复制了 system.serviceModel 部分。就是这样!
        • 相同,只是我将system.serviceModel 复制到了控制台应用程序的 app.config 中
        【解决方案14】:

        我曾经遇到过这个问题。那是因为我还在开发使用 WCF 服务的接口。我配置了测试应用程序并继续开发。然后在开发中,我更改了一些服务的命名空间。所以我在 web.config 中仔细检查了“system.serviceModel -> 客户端 -> 端点 -> 合同”以匹配 WCF 类。那么问题就解决了。

        【讨论】:

          【解决方案15】:

          配置中的命名空间应反映客户端默认命名空间(在项目属性中配置)之后的命名空间路径的其余部分。根据您发布的答案,我的猜测是您的客户端配置为位于“Fusion.DataExchange.Workflows”命名空间中。如果您将客户端代码移动到另一个命名空间,则需要更新配置以匹配剩余的命名空间路径。

          【讨论】:

            【解决方案16】:

            如果您在类库中调用服务并从另一个项目调用类库,则可能会出现此错误。

            【讨论】:

              【解决方案17】:

              我有同样的问题。我在类库中使用 WCF 服务并从 windows 应用程序项目中调用类库。但我忘记更改 &lt;system.serviceModel&gt; 在 windows 应用程序项目的配置文件中与 &lt;system.serviceModel&gt; 相同类库的 app.Config 文件。
              解决方案:将外部项目的配置更改为与类库的wcf配置相同。

              【讨论】:

                【解决方案18】:

                您好,我遇到了同样的问题,但最好的解决方案是让 .NET 配置您的客户端配置。我发现当我使用 http:/namespace/service.svc?wsdl=wsdl0 查询字符串添加服务引用时,它不会在客户端创建配置端点。但是当我删除 ?wsdl-wsdl0 并且只使用 url http:/namespace/service.svc 时,它会在客户端配置文件中创建端点配置。简称“?WSDL=WSDL0”。

                【讨论】:

                  【解决方案19】:

                  不要将服务客户端声明行作为类字段, 而不是这个,在每个使用的方法上创建实例。 所以问题将得到解决。如果将服务客户端实例创建为类字段,则会发生设计时错误!

                  【讨论】:

                    【解决方案20】:

                    如果您使用 PRISM 框架使用 WPF 应用程序,那么配置应该存在于您的启动项目中(即在您的引导程序所在的项目中。)

                    【讨论】:

                      【解决方案21】:

                      似乎有几种方法可以创建/解决此问题。对我来说,我使用的 CRM 产品是用本机代码编写的,并且能够调用我的 .NET dll,但我遇到了需要位于/高于主应用程序的配置信息。对我来说,CRM 应用程序不是 .NET,所以我最终不得不将它放在我的 machine.config 文件中(不是我想要的位置)。此外,由于我的公司使用 Websense,由于 407 Proxy Authentication Required 问题,我什至很难添加服务参考,这需要对 machine.cong 进行修改。

                      代理解决方案:

                      为了让 WCF 服务引用正常工作,我必须将信息从我的 DLL 的 app.config 复制到主应用程序配置(但对我来说是 machine.config)。而且我还必须将端点信息复制到同一个文件中。一旦我这样做了,它就开始为我工作了。

                      【讨论】:

                        【解决方案22】:

                        好的。我的情况有点不同,但最后我找到了解决方法: 我有一个 Console.EXE -> DLL -> 调用 WS1 -> DLL -> 调用 WS2

                        我已经按照建议在 Console.EXE.config 中配置了 WS1 和 WS2 的服务模型配置。 - 没有解决问题。

                        但它仍然不起作用,直到我将 WS2 的 WebReference 也添加到 WS1 并且不仅添加到实际创建和调用 WS2 代理的 DLL 中。

                        【讨论】:

                          【解决方案23】:

                          如果您在类库中引用 Web 服务,则必须将 app.config 复制到 Windows 应用程序或控制台应用程序

                          解决方案:将外部项目的配置更改为与类库的wcf配置相同。

                          为我工作

                          【讨论】:

                            【解决方案24】:

                            我有同样的问题
                            我正在使用桌面应用程序并使用 Global Weather Web 服务

                            我删除了服务引用并添加了 Web 引用并解决了问题 谢谢

                            【讨论】:

                              【解决方案25】:

                              我的解决方案是从客户端 web.config 中的端点名称属性中删除端点名称 这允许代理使用

                              ChannelFactory<TService> _channelFactory = new ChannelFactory<TService>("");
                              

                              只花了一整天的时间来锻炼。 此外,一旦此修复到位,合同名称也是错误的,尽管在出现初始错误时它是错误的。 双重然后三重检查合同名称字符串的人! 署名:伊恩

                              【讨论】:

                                【解决方案26】:

                                请允许我再添加一件要查找的内容。 (Tom Haigh's 答案已经暗示了,但我想明确一点)

                                我的web.config 文件定义了以下内容:

                                <protocolMapping>
                                    <add binding="basicHttpsBinding" scheme="https" />
                                </protocolMapping>
                                

                                我已经在使用 basicHttpsBinding 作为一个参考,但后来我添加了一个需要 basicHttpBinding(没有)的新参考。我所要做的就是将其添加到我的protocolMapping 中,如下所示:

                                <protocolMapping>
                                    <add binding="basicHttpBinding" scheme="http" />
                                    <add binding="basicHttpsBinding" scheme="https" />
                                </protocolMapping>
                                

                                正如L.R. 正确指出的那样,这需要在正确的位置进行定义。对我来说,这意味着我的单元测试项目的 app.config 中的一个以及主服务项目的 web.config 中的一个。

                                【讨论】:

                                  【解决方案27】:

                                  当我在没有全局范围运算符的情况下在配置文件元素中引用合同时出现此错误。

                                  <endpoint contract="global::MyNamepsace.IMyContract" .../>
                                  

                                  有效,但是

                                  <endpoint contract="MyNamepsace.IMyContract" .../>
                                  

                                  给出“找不到引用合约的默认端点元素”错误。

                                  包含 MyNamepsace.IMyContract 的程序集与主应用程序位于不同的程序集中,因此这可以解释使用全局范围解析的必要性。

                                  【讨论】:

                                    【解决方案28】:

                                    当您添加服务引用时

                                    注意您输入的命名空间:

                                    你应该将它附加到你的接口名称:

                                    <client>
                                      <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
                                                binding="basicHttpBinding" 
                                                contract="MyNamespace.IMySOAPWebService" />
                                    </client>
                                    

                                    【讨论】:

                                      【解决方案29】:

                                      我遇到了同样的错误,我尝试了很多方法但没有成功,然后我注意到我的“合同”在所有项目中都不相同,我更改了合同,因为解决方案中的所有项目都相同,而不是它工作。 这是项目A

                                      <client>
                                          <endpoint address="https://xxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference.IIntegrationService" name="basic" />
                                      </client>
                                      

                                      项目 B:

                                      <client>
                                          <endpoint address="xxxxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference1.IIntegrationService" name="basic" />
                                      </client>
                                      

                                      最后我把两者都改成了:

                                      <client>
                                          <endpoint address="https://xxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="MyServiceReferrence.IIntegrationService" name="basic" />
                                      </client>
                                      

                                      【讨论】:

                                        【解决方案30】:

                                        我遇到了同样的问题,只有当主机应用程序和使用该端点的 dll 具有相同的服务引用名称时才能解决。

                                        【讨论】:

                                          猜你喜欢
                                          • 2012-04-25
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2010-11-28
                                          • 2014-09-14
                                          • 2011-10-20
                                          相关资源
                                          最近更新 更多