380

我已将代理添加到 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(我之所以提到这一点,是因为许多谷歌点击提到了 win2k3) app.config 被复制到 app.exe.config,所以这也不是问题。

有什么线索吗?

4

34 回答 34

608

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

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

于 2010-04-29T13:18:41.840 回答
94

我通过自己创建绑定和端点地址实例解决了这个问题(我认为其他人可能已经建议) - 因为我不想向配置文件添加新设置(这是对一些现有库代码的替代品,这些代码被广泛使用,并且以前使用过较旧的 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.

于 2011-06-16T08:57:00.913 回答
80

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

合同="IMySOAPWebService"

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

于 2008-12-10T13:19:45.783 回答
59

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

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

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

new WebService.WebServiceSoapClient("WebServiceEndpoint");

Web.configor中有相应的条目App.config

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

很难消除“它在旧程序中工作”的隧道视野......

于 2010-06-10T17:44:39.880 回答
17

我有这样的情况,我有

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

现在 Consumer 项目在我的 app.config 的 Tag 中有所有相关的配置设置<system.serviceModel>,它仍然抛出与上面相同的错误。

我所做的只是将相同的标签添加<system.serviceModel>到我的主项目的 app.config 文件中,最后我们一切顺利。

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

于 2011-08-11T05:03:32.067 回答
17

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

“在这种情况下,您需要将 WS 配置设置包含到主项目 app.config(如果它是一个 winapp)或 web.config(如果它是一个 Web 应用程序)中。即使使用 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 ...
            }

请参阅本文中的详细信息。

于 2014-12-05T07:06:57.910 回答
15

这让我发疯了。

我正在将 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();
于 2009-10-15T18:57:48.327 回答
15

当您面临从类文件中引用服务的令人麻木的模糊错误时,这里的几个响应找到了正确的解决方案:将服务配置信息复制到控制台或 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>

于 2017-07-05T20:11:01.310 回答
11

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

于 2014-08-29T10:27:54.437 回答
10

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

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

于 2009-04-07T11:47:35.210 回答
10

我发现(以及在使用类库接口时复制到客户端 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" />
于 2010-10-30T11:14:43.283 回答
9

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

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

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

于 2012-02-14T23:31:27.137 回答
8

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

于 2015-09-23T13:16:45.580 回答
5

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

于 2012-09-22T12:25:58.383 回答
4

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

于 2008-12-10T15:54:36.750 回答
3

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

于 2010-04-15T12:10:06.147 回答
3

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

于 2010-06-14T13:16:52.973 回答
3

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

于 2011-07-11T14:16:40.153 回答
3

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

于 2011-07-31T22:04:01.357 回答
3

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

于 2012-08-29T20:49:34.297 回答
2

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

代理解决方案:

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

于 2010-05-06T21:14:47.080 回答
2

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

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

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

于 2010-07-08T09:37:44.417 回答
2

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

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

为我工作

于 2010-10-25T00:48:12.143 回答
2


我在使用桌面应用程序和使用 Global Weather Web 服务时 遇到了同样的问题

我删除了服务参考并添加了网络参考并解决了问题谢谢

于 2011-11-04T12:58:29.653 回答
2

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

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

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

于 2011-12-23T09:37:28.707 回答
2

请允许我再添加一件要查找的内容。(汤姆黑格的回答已经暗示了这一点,但我想明确一点)

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

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

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

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

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

于 2014-05-13T20:06:15.440 回答
2

当我在没有全局范围运算符的配置文件元素中引用合同时,我遇到了这个错误。

IE

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

有效,但是

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

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

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

于 2014-10-29T23:07:43.703 回答
2

添加服务参考时

在此处输入图像描述

注意您输入的命名空间:

在此处输入图像描述

您应该将其附加到您的接口名称:

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" 
            contract="MyNamespace.IMySOAPWebService" />
</client>
于 2016-05-31T17:35:58.500 回答
2

我遇到了同样的错误,我尝试了很多东西但没有奏效,然后我注意到我的“合同”在所有项目中都不相同,我更改了合同,因为解决方案中的所有项目都相同,并且它起作用了。这是项目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>
于 2016-09-21T09:58:58.507 回答
1

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

于 2016-08-24T09:10:05.023 回答
1

就我而言,我在启动项目和使用同名服务的项目中都添加了服务。有效...

于 2020-08-11T07:30:45.670 回答
0

就我而言,我已手动将 app.config 重命名为 [appname].exe.config。这最终为文件名添加了一个额外的 .config 后缀。解决方案是将其重命名为 [appname].exe 以消除额外的 .config 扩展名。

于 2020-03-06T16:41:50.483 回答
0

还有另一种方法我找到了正确的endpointConfigurationName

添加endpointConfigurationName如下

EservicesNew.ServiceClient eservicenew = new EservicesNew.ServiceClient("BasicHttpsBinding_IService");

找到endpointConfigurationName如下

添加 Web 参考后,从生成的参考文件中打开 configuration.svcinfo 文件。

在此处输入图像描述

找到了两个端点,我使用了正确的端点bindingConfiguration值,即 BasicHttpsBinding_IService

在此处输入图像描述

于 2021-04-29T07:12:00.020 回答
-1

就我而言,我指的是图书馆项目中的这项服务,而不是启动项目。一旦我将部分复制<system.serviceModel>到主启动项目的配置中,问题就解决了。

在任何应用程序的运行阶段,配置将从启动/父项目中读取,而不是读取单独的子项目中提到的自己的配置。

于 2018-04-10T09:31:00.407 回答