找不到默认的端点元素
我已经添加了一个Web服务的代理到VS2008 / .NET 3.5解决scheme。 当构build客户端.NET时会引发这个错误:
找不到在服务模型客户端configuration部分中引用合同“IMySOAPWebService”的默认端点元素。 这可能是因为没有为您的应用程序findconfiguration文件,或者因为在客户端元素中找不到匹配此合同的终点元素
search这个错误告诉我使用合同中的完整命名空间。 这是我的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,所以这也不是问题。
任何线索?
“如果您正在调用类库中的服务并从另一个项目调用类库,则会出现此错误。”
在这种情况下,您需要将WSconfiguration设置包含在主要项目app.config中,如果它是winapp或web.config(如果是web应用程序)。 即使使用PRISM和WPF / Silverlight也是如此。
经过testing了几个选项,我终于通过使用解决了这个问题
合同= “IMySOAPWebService”
即在configuration中没有完整的命名空间。 由于某种原因,全名没有正确解决
我已经通过自己创build绑定和端点地址实例解决了这个问题(我认为正如其他人可能已经提出的那样),因为我不想将新的设置添加到configuration文件中(这是replace一些现有的库代码,使用广泛,以前使用旧的Web服务参考等),所以我想能够在不添加任何新的configuration设置的情况下放弃。
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
。
我有这个相同的问题。 事实certificate,对于Web REFERENCE,您必须提供URL作为构造函数的第一个参数:
new WebService.WebServiceSoapClient("http://myservice.com/moo.aspx");
对于新样式的Web SERVICE REFERENCE,您必须提供一个引用configuration中端点条目的名称:
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>
很难去除“在一个较旧的程序中工作”的隧道视野…
我有这样的情况,我有
- WCF服务托pipe在某处
- 主项目
- 消费者项目types'类库'具有服务引用到WCF服务
- 主项目调用消费者项目的方法
现在Consumer项目已经在我的app.config的<system.serviceModel>
Tag中有了所有相关的configuration设置,它仍然抛出与上面相同的错误。
我所做的只是将相同的标记<system.serviceModel>
到我的主项目的app.config文件中,最后我们很好。
真正的问题,就我而言,就是读错了configuration文件。 而不是消费者的app.config,它是指主proj的configuration。 我花了两个小时才弄清楚。
这个让我疯狂。
我用WCF使用Silverlight 3 Prism(CAB)
当我在Prism模块中调用WCF服务时,出现同样的错误:
找不到在服务模型客户端configuration部分中引用合同“IMyService”的默认端点元素。 这可能是因为没有为您的应用程序findconfiguration文件,或者因为在客户端元素中找不到匹配此合同的终点元素
事实certificate,它在Shell的.xap文件中查找ServiceReferences.ClientConfig文件,而不是在模块的ServiceReferences.ClientConfig文件中查找。 我添加了我的端点并绑定到Silverlight Shell应用程序中的现有ServiceReferences.ClientConfig文件(它将其称为它自己的WCF服务)。
然后我不得不重buildShell应用程序来为我的Web项目的ClientBin文件夹生成新的.xap文件。
现在这行代码终于起作用了:
MyServiceClient myService = new MyServiceClient();
“如果您正在调用类库中的服务并从另一个项目调用类库,则会出现此错误。”
“在这种情况下,如果Webconfiguration是winapp或web.config,那么您需要将WSconfiguration设置包含到主项目app.config中,即使使用PRISM和WPF / Silverlight也是如此。
是的,但是如果你不能改变主项目(例如Orchard CMS),你可以在你的项目中保留WCF服务configuration。
您需要使用客户端生成方法创build服务助手:
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 ... }
请参阅本文中的详细信息。
我在一个ASP.NET应用程序中得到了这个错误,在这个应用程序中,WCF服务被添加到一个类库中,该类库被作为一个被引用的bin文件夹中的.dll文件添加到ASP.NET应用程序中。 要解决此错误,需要将引用WCF服务的类库中的app.config文件中的configuration设置复制到ASP.NET网站/应用程序的web.config设置中。
我发现(以及复制到客户端用户界面的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" />
我有同样的问题,但改变合同命名空间不适合我。 所以我尝试了.Net 2风格的Web引用而不是.Net 3.5服务引用。 这工作。
要在Visual Studio 2008中使用Web引用,请单击“添加服务引用”,然后在出现对话框时单击“高级”。 在这一点上,你会发现一个选项,可以让你使用Web引用,而不是服务引用。
unit testing消耗服务的非库应用程序可能会导致此问题。
其他人input的信息解决了这个问题的根源。 如果您正在尝试编写自动化testing用例,并且您正在testing的单元将实际调用服务接口,则需要将该服务引用添加到testing项目中。 这是使用库types的错误的应用程序的味道。 我没有立即意识到这一点,因为我的代码消耗接口不在库中 。 然而,当testing实际运行时,它将从testing组件运行,而不是被测组件。
添加服务引用到unit testing项目解决了我的问题。
我有一个在unit testing中的情况。 我将app.config文件复制到unit testing项目。 所以unit testing项目也包含端点信息。
我曾经遇到过这个问题。 这是因为我还在开发使用WCF服务的接口。 我configuration了testing应用程序并继续开发。 然后在开发中,我改变了一些服务的命名空间。 所以我再次检查web.config中的“system.serviceModel – >客户端 – >端点 – >契约”以匹配WCF类。 然后问题解决了。
当你面对从一个类文件引用服务的思维麻木的错误时,这里有几个反应正确的解决scheme:将服务configuration信息复制到你的控制台或Windows应用程序的app.config web.config中。 这些答案似乎都没有告诉你要拷贝什么。 让我们试着纠正这一点。
这是我从我的类库的configuration文件中复制到我的控制台应用程序的configuration文件,以绕过这个疯狂的错误,我写一个名为“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>
您的configuration中的命名空间应该反映客户端的默认命名空间(如项目属性中所configuration的)之后的命名空间path的其余部分。 根据你发布的答案,我的猜测是你的客户端被configuration在“Fusion.DataExchange.Workflows”命名空间中。 如果您将客户端代码移动到另一个名称空间,则需要更新configuration以匹配剩余的名称空间path。
对于有同样问题的其他人, 我为我的方法写了一个unit testing,试图连接到我的服务。 它每次都有这样的例外 – 我不知道为什么。 当我从一个winform运行它,它工作正常。
如果您正在调用类库中的服务并从另一个项目调用类库,则会出现此错误。
我有一个相同的问题。我在类库中使用WCF服务,并从Windows应用程序项目调用类库。但我忘记更改<system.serviceModel>
在Windows应用程序项目的configuration文件相同的<system.serviceModel>
类库的app.Config文件。
解决scheme:更改外部项目的configuration与类库的wcfconfiguration相同。
如果在类库中引用Web服务,则必须将app.config复制到Windows应用程序或控制台应用程序
解决scheme:更改外部项目的configuration与类库的wcfconfiguration相同。
为我工作
嗨,我遇到了同样的问题,但最好的解决scheme是让.NETconfiguration您的客户端configuration。 我发现这是当我添加一个查询string为http:/namespace/service.svc?wsdl = wsdl0的服务引用时,它不会在客户端创buildconfiguration端点。 但是,当我删除?wsdl-wsdl0并仅使用url http:/namespace/service.svc时,它将在客户端configuration文件中创build端点configuration。 简称“WSDL = WSDL0”。
不要把服务客户端声明行作为类字段,而不是这样,在每个使用的方法上创build实例。所以问题将被修复。 如果您将服务客户端实例创build为类字段,则会发生devise时错误!
如果您正在使用PRISM框架使用WPF应用程序,那么configuration应该存在于您的启动项目中(即您的引导程序驻留的项目中)。
似乎有几种方法来创build/修复这个问题。 对我来说,我使用的CRM产品是用本地代码编写的,能够调用我的.NET DLL,但是我碰到了需要在主应用程序上面的configuration信息。 对于我来说,CRM应用程序不是.NET,所以我不得不把它放在我的machine.config文件(不是我想要的地方)。 另外,由于我的公司使用Websense,由于需要407代理validation问题,所以我甚至添加了服务引用也很困难,因此需要修改machine.cong。
代理解决scheme
为了让WCF服务引用起作用,我必须将我的DLL的app.config中的信息复制到主应用程序configuration中(但是对于我来说就是machine.config)。 而且我还必须将端点信息复制到同一个文件。 一旦我做到了,就开始为我工作。
好。 我的情况有点不同,但最后我发现了它的修复:我有一个Console.EXE – > DLL – >调用WS1 – > DLL – >调用WS2
我build议使用Console.EXE.config中的WS1和WS2服务模型的configuration。 – 没有解决这个问题。
但是,直到我将WS2的WebReference也添加到WS1中 ,而不仅仅是实际创build和调用WS2的代理的DLL,它仍然不起作用。
我遇到过同样的问题
我正在使用桌面应用程序,并使用全球天气Web服务
我删除了服务引用,并添加了Web引用和问题解决谢谢
我的解决scheme是从客户端web.config中的端点名称属性中删除端点名称,这允许代理使用
ChannelFactory<TService> _channelFactory = new ChannelFactory<TService>("");
只花了一整天的时间去锻炼。 此外,合同名称是错误的,一旦这个修复程序就位,虽然最初的错误出现时是错误的。 双然后三重检查合同名字串的人! attrib:伊恩
请允许我再添加一件东西来寻找。 ( 汤姆·海格的答案已经暗示,但我想要明确)
我的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>
正如LR正确指出的那样,这需要在正确的地方进行定义。 对我来说,这意味着在我的unit testing项目的app.config中,以及在主服务项目的web.config中。
我在没有全局作用域操作符的情况下在configuration文件元素中引用合约时出现此错误。
即
<endpoint contract="global::MyNamepsace.IMyContract" .../>
作品,但是
<endpoint contract="MyNamepsace.IMyContract" .../>
给出“无法find引用合同的默认端点元素”错误。
包含MyNamepsace.IMyContract的程序集与主应用程序位于不同的程序集中,因此可能需要使用全局作用域parsing。
我得到同样的错误,我尝试了很多东西,但没有工作,比我注意到,我的“合同”是不一样的整个项目,我改变了合同,因为将解决scheme中的所有项目和它的工作相同。 这是项目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>
当你添加一个服务引用
当心你input的命名空间:
您应该将其附加到您的界面的名称:
<client> <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService" binding="basicHttpBinding" contract="MyNamespace.IMySOAPWebService" /> </client>