找不到引用合同的默认终结点元素

16

我知道这个问题已经被反复讨论过了,但我无法让它像应该的那样工作。 我有一个包含多个合同的WCF服务。 当直接调用它们时,它们都可以正常工作,例如:http://merlin.com/CompanyServices/CompanyWcfService.svc/Get_Document_Dates_Received/223278 我已经成功地在InfoPath表单和Nintex工作流程中使用了这个WCF服务。 现在我创建了一个简单的ASP.Net应用程序,就像http://www.webcodeexpert.com/2013/04/how-to-create-and-consume-wcf-services.html所示。 我按照文章中的描述添加了一个服务引用。 我在表单中添加了一个按钮,并在Button1_Click事件中添加了以下代码:

protected void Button1_Click(object sender, EventArgs e)
{
    ServiceReference1.CompanyWcfServiceClient x = new ServiceReference1.CompanyWcfServiceClient();
    var result = x.Get_Document_Dates_Received("223278");
}

当我点击按钮时,会出现以下错误:

"在 ServiceModel 客户端配置部分中找不到引用合同 'ServiceReference1.ICompanyWcfService' 的默认端点元素。这可能是因为未找到应用程序的配置文件,或者因为未在客户端元素中找到与此合同匹配的端点元素。"

因此,我尝试将以下内容添加到 web.config 文件中:(直接从 CompanyWcfService 的 web.config 文件复制)。

<system.serviceModel>
<services>
  <service name="CompanyWcfServices.CompanyWcfService" behaviorConfiguration="ServiceBehavior">
    <endpoint address="" binding="webHttpBinding" contract="CompanyWcfServices.ICompanyWcfService" behaviorConfiguration="webHttpEndpointBehavior" >
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange">                                                                
    </endpoint>
  </service>
</services>
<bindings>
  <webHttpBinding>
    <binding>
      <security mode="None">
      </security>
    </binding>
  </webHttpBinding>
</bindings>
<behaviors>
  <endpointBehaviors>
    <behavior name ="webHttpEndpointBehavior">
      <webHttp helpEnabled ="true" faultExceptionEnabled="true" automaticFormatSelectionEnabled="true"/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
我遇到了完全相同的错误,肯定还有其他问题存在。
最后我放弃了,按照以下方式调用了该服务:
HttpWebRequest request = WebRequest.Create(@"http://merlin/Companyservices/CompanyWcfService.svc/Get_Document_Dates_Received/223278") as HttpWebRequest;
request.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse response = null;

var result = "";
try
{
    response = request.GetResponse() as HttpWebResponse;
    if (response.StatusCode == HttpStatusCode.OK)
    {
        using (Stream stream = response.GetResponseStream())
        {
            StreamReader reader = new StreamReader(stream, Encoding.UTF8);
            result = reader.ReadToEnd();
        }
    }
}
catch (Exception ex)
{
    result = "";
}

我花了数小时阅读帖子,大多数建议将配置信息复制到web.config文件中。这对我来说似乎有问题(除了似乎不起作用的事实之外)。如果我需要使用第三方WCF服务怎么办?我必须从第三方请求配置信息吗?反之亦然,如果我创建一个旨在被第三方使用的WCF服务,我是否也需要提供配置文件?

7个回答

23

该错误表示在客户端配置部分中未定义端点。当您将服务引用添加到项目中时,它应该会为您创建客户端部分。如果没有,请在您的应用程序的web.config文件的system.serviceModel部分中添加以下内容:

<client>
  <endpoint 
      name="CompanyWcfService_webhttpBinding"
      address="http://merlin.com/CompanyServices/CompanyWcfService.svc" 
      binding="webHttpBinding" 
      contract="CompanyWcfServices.ICompanyWcfService" 
      behaviorConfiguration="webHttpEndpointBehavior"
  />
</client>

此外,在您的应用程序web.config文件中的system.ServiceModel部分,您不需要services部分。我会删除它。您只需要定义在客户端部分引用的项目。例如,如果您进行了自定义,则需要behaviorConfiguration或binding设置。 - Matt Klepeis
Matt,谢谢您的回复。不过很抱歉,我仍然遇到了相同的错误。 - user1337493
这个问题似乎是服务和应用程序中的web.config不匹配导致的。错误提示找不到合同为“ServiceReference1.ICompanyWcfService”的服务。请注意,在您的Web应用程序的web.config中,合同是“CompanyWcfServices.ICompanyWcfService”。您是否创建了一个服务,在Web应用程序中添加了一个引用,然后更改了服务命名空间? - Matt Klepeis
我会检查服务中的命名空间,以及终结点定义中的契约,然后重新添加服务引用到应用程序,并检查应用程序的web.config文件,看看是否添加了所需的内容。如果您可以发布服务的system.ServiceModel部分,我们就可以进行比较。 - Matt Klepeis
非常准确!在我们的情况下,所有东西在开发环境中都正常工作,但是当在生产机器上时,出现了异常:_XXX.yyy.zzz的类型初始化程序引发了异常_。 - StinkyCat

15

如果我们有分层架构,请确保

1) add app.config in "all projects"
2) add service config details in all app.config
3) run the project

许多相同配置的副本“以防万一”,有一天我们更新了WCF配置但忘记了一个副本,导致不同文件中有不同的配置。数据库连接字符串也是如此。微软做得并不好,看起来像业余水平。 - mins

7
如果您的项目引用了一个库,并尝试从该库的函数中使用WCF功能,则可以尝试将客户端终结点从项目配置文件复制到dll的配置文件中。有一件事,就像我之前遇到的那样,由于我在项目中引用的库不会使用项目配置文件(其中配置了客户端终结点,因为服务是在那里引用的),而是使用自己的配置文件,结果是系统找不到终结点配置。

同样的问题--在我的情况下,这是一个测试项目,引用了主项目中的共享函数。被引用的app.config是测试项目中的,而不是主项目中的。谢谢! - Jeff

5

在我的情况下,我有一个引用外部UserControl的WPF项目,该UserControl具有服务引用。我还必须将服务引用添加到主项目中。


1
谢谢!这正是我遇到的同样问题。 - Chance
在我的情况下,这是一个库项目和桌面应用程序项目,首先我添加了对库项目的引用,但是在看了你的答案后,我也将同样的引用添加到了桌面应用程序项目中,解决了!问题很相似! - hi0001234d

3
将app.config中的绑定和客户端值添加到默认的web.config中解决了我的问题。

1
实际上,这个问题的诀窍是使用svcutil.exe创建代理。我之前一直尝试通过Visual Studio的"添加服务"向导创建代理。一旦我这样做了,配置就非常容易了。

SvcUtil.exe


0

当涉及到WCF时,通常需要在调用它的可执行文件的配置文件中定义配置。

因此,如果你不幸地需要从VB6程序中调用WCF DLL(例如使用COM-interop .NET模块时可能会出现这种情况),并且你需要调试VB6程序,那么你需要在存放VB6.exe的目录中创建一个VB6.exe.config文件。

如果没有执行上述操作,则可能会导致“找不到引用合同的默认终结点元素”。

作为解决方法,可以在运行时加载dll的配置文件,然后使用Binding和EndpointAddress作为参数(从dll的配置文件中获取)调用所使用的Service的构造函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接