找不到默认端点元素


369

我已将代理添加到VS2008 / .NET 3.5解决方案的Web服务。构造客户端.NET时,会引发以下错误:

在ServiceModel客户端配置部分中找不到引用合同'IMySOAPWebService'的默认终结点元素。这可能是因为没有为您的应用程序找到配置文件,或者是在client元素中找不到与该协定匹配的端点元素。

搜索此错误告诉我在合同中使用完整的名称空间。这是带有完整名称空间的我的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
Darren C

该服务不是.NET服务,它不在Web服务器上运行。
edosoft

我在.NET中开发的项目中解决了此问题,但是在VB6中有一些项目,但我遇到了同样的问题。有任何想法吗?
加布里埃尔·因特里亚戈

Answers:


588

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

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


1
这不是我特定问题的原因,但是我相信这会帮助其他人。谢谢
edosoft

9
有没有办法自动合并两者?如果类库更新其配置怎么办?您是否只是想记住要在引用它的所有项目中更新复制的配置信息?此修复程序似乎过于依赖开发人员的警惕...
Sean Hanley 2010年

1
我在WP7应用程序中遇到了相同的错误(我相信是Silverlight),花了我很长时间才注意到ServiceReferences.ClientConfig在项目目录中生成了该错误。将<bindings>and <client>元素从库中的文件复制到我的主应用程序(以前为空),可以正常工作。
戴维·梅森

4
发生这种情况的原因(据我了解)是从解决方案中的主项目中读取配置值,例如web,winforms,wpf等。例如,您有一个类库项目来访问数据库,其中的connectionString条目将需要在主项目配置中,而不是在类库配置中。
Ciaran Bruen

6
因此我们可以得出结论,如果我们在库中使用WCF,最好直接设置代码,如所示的链接stackoverflow.com/questions/7688798/…
Youngjae 2012年

90

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


1
这是一个有用的答案。在我正在使用的Web服务上,自定义终结点必须绑定在对象的初始声明中。如果我稍后尝试这样做,将无法正常工作。
保罗·莫雷尔

2
我怀疑最高答案可能也能解决问题,但您的解决方案却奏效了,对我来说,黑客入侵自己的配置文件似乎更可取。
山姆,我说要恢复莫妮卡(Monica)2012年

很有魅力!我更喜欢能够在代码中设置端点,而不是通过我的应用程序分发“ app.config”文件。
Daniel Gee 2013年

1
如果它是Https Web服务,请记住将BasicHttpBinding()更改为BasicHttpsBinding()
安东尼

此解决方案最适合像EXCEL-DNA这样没有app.config或web.config的应用程序。
user781700 2014年

75

测试了几个选项之后,我终于通过使用

contract =“ IMySOAPWebService”

即在配置中没有完整的名称空间。由于某些原因,全名无法正确解析


3
看来,合同名称必须与客户完全相同地书写。就我而言,var proxy = new ExternalServices.ServiceClient("MyServiceEndpoint");当我将名称空间添加到协定中时,它就起作用了:contract="ExternalServices.IMyService"
Anatoly Mironov 2012年

这对我没有用。我的问题可能有所不同。我有时不时收到此错误。可能是什么问题。可以在服务端出错吗?_谢谢
信天翁

57

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

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

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

new WebService.WebServiceSoapClient("WebServiceEndpoint");

Web.config或中具有相应的条目App.config

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

非常难以消除关于“它在较旧的程序中起作用”的愿景。


3
啊哈!这为我解决了这个问题,之前我只是使用一个空的构造函数,而该构造函数一直失败:new WebService.WebServiceSoapClient(); //失败
travis 2010年

这个果胶确实起作用了!但是,我真的很好奇为什么未加载默认终点?有什么想法可能是什么原因?
Dipti Mehta,

@Andomar很抱歉提出一个旧主题。一个相对于另一个-WebReference和ServiceReference有什么优势吗?我认为前者对我来说更方便,但是ServiceReference是我认为很酷的新事物……
Kev 2013年

17

我遇到过这样的情况

  • WCF服务托管在某个地方
  • 主要项目
  • 类型为“类库”的消费者项目,其中有对WCF服务的服务引用
  • 主项目从消费者项目调用方法

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

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

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


1
相同。<system.serviceModel>在您的库中搜索,然后将其复制到主应用程序的app.config。运行时未读取类库app.configs的另一种症状。我花了很多时间来补偿这种疏忽(imo)。如果我想让库从app.config中读取它的config,请允许它。否则,为什么首先要有一个用于类库的app.config?
SteveCinq '17

15

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

“在这种情况下,您需要将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 ...
            }

请参阅本文的详细信息。


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>


14

这使我发疯。

我在WCF中使用Silverlight 3 Prism(CAB)

当我在棱镜模块中调用WCF服务时,出现相同的错误:

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

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

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

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

MyServiceClient myService = new MyServiceClient();

11

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


虽然其他答案可能也描述了相同的问题。这个答案描述了我的确切情况,我终于理解了这个问题。感谢您保存我的一天
Wouter Vanherck

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" />

1
我必须做同样的事情。我真的不明白为什么。
布里格

8

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

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


2
这也是我最终要做的。我希望这个问题对我来说有意义。
加勒特·威德曼2009年

这也对我有用。现在,我的解决方案(Settings.Settings,一个新的Web References文件夹)中没有所有这些多余的垃圾,没有充分的理由。当我有更多时间时,将不得不回来并重新访问。
迈克·K

同意 我遇到了同样的问题,并通过将其更改为Web参考来解决。
史蒂芬·霍斯金

7

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

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

将服务引用添加到单元测试项目可以解决我的问题。


7

我在单元测试中遇到的情况。我将app.config文件复制到了单元测试项目。因此,单元测试项目还包含端点信息。


2
我没有复制完整的app.config,而是该system.serviceModel部分。就这样!
kwrl

一样,除了我将其复制system.serviceModel到控制台应用程序的app.config
AlbatrossCafe

5

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


4

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


3

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


3

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


3

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


3

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



2

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

代理解决方案:

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


2

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

建议在Console.EXE.config中同时进行WS1和WS2服务模型的配置。-没有解决问题。

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


2

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

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

为我工作



2

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

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

只花了整整一天的时间。同样,此修复程序到位后,合同名称是错误的,尽管在出现初始错误时它是错误的。两次然后三次检查合同名称字符串的人!attrib:Ian


2

请允许我再添加一件事。(Tom Haigh的答案已经暗示了这一点,但我想明确地说)

我的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中。


2

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

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

可行,但是

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

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

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


2

添加服务参考时

在此处输入图片说明

当心您输入的名称空间:

在此处输入图片说明

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

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

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>

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.