找不到默认端点元素

时间:2008-12-09 13:06:42

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

我已经在Web服务中添加了代理到VS2008 / .NET 3.5解决方案。构建客户端.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,因此也不是问题。

任何线索?

35 个答案:

答案 0 :(得分:565)

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

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

答案 1 :(得分:76)

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

答案 2 :(得分:73)

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

解决了这个问题
  

合同= “IMySOAPWebService”

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

答案 3 :(得分:54)

我遇到过同样的问题。事实证明,对于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>

很难删除隧道视觉“它在旧程序中工作”......

答案 4 :(得分:16)

我有这种情况,我有

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

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

我所做的只是将相同的标记<system.serviceModel>添加到我的主项目的app.config文件中,最后我们很高兴。

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

答案 5 :(得分:13)

  
    

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

         
      

&#34;在这种情况下,如果是winapp,则需要将WS配置设置包含到主项目app.config中,如果是web应用,则需要包含web.config。即使使用PRISM和WPF / Silverlight也是如此。&#34;

    
  

是的,但如果您无法更改主项目(例如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中的详细信息。

答案 6 :(得分:12)

这个让我疯狂。

我正在使用带有WCF的Silverlight 3 Prism(CAB)

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

  

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

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

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

现在这行代码最终有效:

MyServiceClient myService = new MyServiceClient();

答案 7 :(得分:12)

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

这是我从我的类库的配置文件中复制到我的控制台应用程序的配置文件中的内容,以便为我写的一个名为&#的服务解决这个疯狂的错误34; TranslationServiceOutbound&#34 ;.

您基本上想要 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>

答案 8 :(得分:11)

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

答案 9 :(得分:9)

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

e.g:

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

答案 10 :(得分:7)

我遇到了同样的问题,但更改合同命名空间对我来说并不适用。所以我尝试了.Net 2样式的Web引用而不是.Net 3.5服务引用。这很有用。

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

答案 11 :(得分:6)

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

答案 12 :(得分:6)

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

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

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

答案 13 :(得分:4)

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

答案 14 :(得分:3)

对于有同样问题的其他人;我为我的方法编写了一个单元测试,试图连接到我的服务。它每次都失败了同样的例外 - 我不知道为什么。当我从winform运行它时,它可以正常工作。

答案 15 :(得分:3)

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

答案 16 :(得分:2)

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

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

为我工作

答案 17 :(得分:2)

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

答案 18 :(得分:2)

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

答案 19 :(得分:2)

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

答案 20 :(得分:2)

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

答案 21 :(得分:1)

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

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

答案 22 :(得分:1)

我得到了同样的错误,我尝试了很多东西但是没有用,比我注意到我的“合同”对于整个项目都不一样,我改变了合同,因为对于解决方案内的所有项目而言它都是相同的工作。 这是项目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>

答案 23 :(得分:1)

就我而言,我在启动项目和使用相同名称的服务的项目中添加服务。工作正常...

答案 24 :(得分:1)

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

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

有效,但

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

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

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

答案 25 :(得分:1)

请允许我添加一个要查找的内容。 (Tom Haigh's答案已经提到了它,但我想要明确)

我的web.config文件定义如下:

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

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

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

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

答案 26 :(得分:1)

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

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

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

答案 27 :(得分:1)

确定。我的情况有点不同但最后我找到了解决方法: 我有一个Console.EXE - &gt; DLL - &gt;调用WS1 - &gt; DLL - &gt;调用WS2

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

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

答案 28 :(得分:1)

似乎有几种方法可以创建/修复此问题。对我来说,我使用的CRM产品是用本机代码编写的,并且能够调用我的.NET dll,但是我遇到了需要位于主应用程序之上/之上的配置信息。对我来说,CRM应用程序不是.NET,所以我最终不得不把它放在我的machine.config文件中(不是我想要的)。此外,由于我的公司使用Websense,由于需要407代理身份验证问题,我甚至很难添加服务引用,这需要修改machine.cong。

代理解决方案:                  

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

答案 29 :(得分:1)

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

答案 30 :(得分:0)

添加服务参考时

enter image description here

注意您输入的命名空间:

enter image description here

您应该将其附加到您的界面名称:

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

答案 31 :(得分:0)

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

答案 32 :(得分:0)

就我而言,我是从框架项目中引用此服务。 一旦我将部分复制到主要启动项目的配置,问题就解决了。

答案 33 :(得分:0)

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

答案 34 :(得分:0)

我通过另一种方式找到了正确的 endpointConfigurationName

如下添加endpointConfigurationName

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

找到 endpointConfigurationName 如下

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

enter image description here

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

enter image description here