找不到默认端点元素

我已经在VS2008/中添加了web服务的代理。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

有线索吗?

384806 次浏览

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

合同= " IMySOAPWebService "

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

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

我遇到了同样的问题,但是更改契约名称空间对我不起作用。所以我尝试了。net 2风格的web引用,而不是。net 3.5的服务引用。这工作。

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

这让我抓狂。

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

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

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

原来它在Shell的.xap文件中寻找ServiceReferences。ClientConfig文件,而不是模块的ServiceReferences中。ClientConfig文件。我将端点和绑定添加到现有的servicereference中。我的Silverlight Shell应用程序中的ClientConfig文件(它调用它自己的WCF服务)。

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

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

MyServiceClient myService = new MyServiceClient();

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

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

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

似乎有几种方法可以制造/解决这个问题。对我来说,我正在使用的CRM产品是用本地代码编写的,并且能够调用我的. net dll,但是我遇到了需要在主应用程序上/上面的配置信息。对我来说,CRM应用程序不是。net,所以我最终不得不把它放在我的机器上。配置文件(不是我想要的地方)。此外,由于我的公司使用Websense,我甚至很难添加服务引用,因为407代理认证要求的问题,这需要修改machine. conn。

< p >代理解决方案:

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

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

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

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

< p > Ok。我的情况有点不同,但最后我找到了解决办法: 我有一个控制台。exe -> DLL ->调用WS1 -> DLL ->调用WS2

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

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

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

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

为我工作

我发现(以及复制到客户端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" />

我通过自己创建绑定和端点地址实例解决了这个问题(我认为其他人可能已经建议了)——因为我不想向配置文件添加新的设置(这是对一些广泛使用的现有库代码的替换,以前使用的是旧的Web Service Reference等),所以我希望能够在不添加新的配置设置的情况下将其放入。

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

不把服务客户端声明行作为类字段, 中使用的每个方法都创建实例。 这样问题就会解决。如果您将服务客户端实例创建为类字段,则会出现设计时错误!

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

我遇到过这样的情况,我

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

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

我所做的只是将相同的标记<system.serviceModel>添加到我的主项目的app.config文件中,最后我们就可以开始了。

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

我有同样的问题
我正在使用桌面应用程序和使用全球天气Web服务

我删除了服务引用,并添加了web引用,问题解决了 由于< / p >
对我来说,解决方案是从客户端web.config中的端点名称属性中删除端点名称 这允许代理使用

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

只花了一整天的时间锻炼。 此外,一旦这个修复到位,合同名称是错误的,尽管它在最初的错误出现时是错误的。 再三检查合同名称字符串的人!! 属性:伊恩< / p >

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

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

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

如果你使用WPF应用程序使用PRISM框架,那么配置应该存在于你的启动项目中(即在你的bootstrapper驻留的项目中)。

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

请允许我再补充一点。(汤姆黑的的答案已经暗示了它,但我想明确)

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

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

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

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

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

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

当我在配置文件元素中引用没有全局作用域操作符的契约时,出现了这个错误。

即。

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

有效,但

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

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

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

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

在这种情况下,如果是winapp或web,则需要将WS配置设置包含到主项目app.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 ...
}

详见这篇文章

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

在添加服务引用时

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>

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

我得到了同样的错误,我尝试了很多事情,但没有工作,然后我注意到我的“合同”在所有项目中都不一样,我改变了合同,因为在解决方案中所有项目都是一样的,然后它起作用了。 这是项目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>

当你在类文件中引用服务时,这里有几个响应可以找到正确的解决方案:将服务配置信息复制到app.config web中。这些答案似乎都没有告诉你应该复制什么。让我们试着纠正一下。

下面是我从我的类库的配置文件复制到我的控制台应用程序的配置文件中,为了解决这个疯狂的错误,我写了一个名为“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>

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

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

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

在我的情况下,我在启动项目和使用同名服务的项目中都添加了服务。它工作…

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

如下所示添加endpointConfigurationName

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

找到endpointConfigurationName如下所示

添加Web Reference之后,打开配置。Svcinfo文件中生成的参考文件。

enter image description here

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

enter image description here