如何解决WCF中的EndpointNotFound异常

时间:2014-08-08 13:22:25

标签: wcf security configuration

我一直在努力解决我在云平台上托管的WCF服务遇到的问题。服务是针对.NET 4.0编写的。我可以使用wsHttpBinding和basicHttpBinding来访问该服务,而不仅仅是普通的http。但是,当我尝试通过https端点访问服务时,它始终给我一个端点未找到异常,这很奇怪,因为在客户端我添加一个指向https端点的服务引用,这应该足以构建一个兼容的代理?

该网站具有SSL证书设置,该设置有效,托管该服务的站点在IIS中具有使用此证书的绑定。我可以从IIS管理单元中浏览到https URL,它可以找到没有问题的服务,并且我可以使用桌面上的相同URL并获得正常的“您已经创建了一个服务页面”。 IIS仅启用匿名身份验证。

对于WCF配置而言,我对此无能为力。

  1. 在服务器web.config中我有安全模式的Transport和 客户凭证无(认为我需要这个因为 主机服务上的匿名身份验证)

  2. 同样在服务器web.config中我为每个设置了mex端点     已定义的服务器端点。

  3. 我还有什么需要做的吗?

    在客户端

    1. 我创建了一个基本的控制台应用,并创建了一个服务 指向https网址的引用,找到了

    2. 在代码中,我实例化代理并调用一个调用的方法 服务。

    3. 当我运行代码时,我得到了终点未找到异常。
    4. 我在本地IIS上创建了一个非常基本的ASP.NET网站,它提供了一个非常简单的服务。我添加了一个自签名证书,在mmc管理单元中,我将其作为可信证书导入。我已经为安全和非安全设置了一个wsHttp端点,当我创建一个引用该服务的简单客户端时,我在使用https端点时会遇到同样的问题。所以我可以复制我在现场看到的问题环境。

      事件查看器没有对任何发生的事情有所了解。在我的各种搜索中,我发现了重新注册asp.net和WCF运行时组件的引用。试过这一切无济于事。变得非常困难。我已经从我当地的asp.net网站和客户端配置中包含了配置,以便人们可以扫描我拥有的内容。关于我还能尝试什么的任何建议都会很棒。我希望我忽略了一些显而易见的事情,即对WCF有更多经验的另一双眼睛可以发现。

      提前致谢。

      服务器配置:

      <system.serviceModel>
          <diagnostics>
            <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="500" />
          </diagnostics>
          <services>
            <service name="NorthwindServices.ProductService">
              <host>
                <baseAddresses>
                  <add baseAddress="http://localhost:8732/Design_Time_Addresses/NorthwindServices/ProductService/" />
                </baseAddresses>
              </host>
              <endpoint address="" binding="wsHttpBinding" contract="NorthwindServices.IProducts">
                <identity>
                  <dns value="localhost" />
                </identity>
              </endpoint>
              <endpoint address="mex" binding="wsHttpBinding" contract="IMetadataExchange" />
            </service>
          </services>
          <bindings>
            <wsHttpBinding>
              <binding name="Secure">
                <security mode="TransportWithMessageCredential">
                  <transport clientCredentialType="Basic">
      
                  </transport>
                </security>
              </binding>
            </wsHttpBinding>
          </bindings> 
          <behaviors>
            <serviceBehaviors>
              <behavior name="">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
              </behavior>
            </serviceBehaviors>
          </behaviors>
          <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
        </system.serviceModel>
      </
      
      ==================================================================================
      Client config:
      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
          <system.serviceModel>
              <bindings>
                  <wsHttpBinding>
                    <binding name="WSHttpBinding_IProducts">
                      <security mode="Transport"></security>
                    </binding>
      
                  </wsHttpBinding>
              </bindings>
              <client>
                  <endpoint address="https://localhost/Northwind.svc" binding="wsHttpBinding"
                      bindingConfiguration="WSHttpBinding_IProducts" contract="ProductProxy.IProducts"
                      name="WSHttpBinding_IProducts">
                      <identity>
                          <dns value="localhost" />
                      </identity>
                  </endpoint>
              </client>
          </system.serviceModel>
      </configuration>
      

1 个答案:

答案 0 :(得分:0)

BindingConfiguration是可选的,因为端点主要由地址,绑定和契约组成。如果在绑定下没有定义wsHttpBinding,则将使用默认配置;如果在没有名称或空名称的wsHttpBinding下有一个,如果端点没有声明命名的端点,则将使用绑定配置。并且您可以在wsHttpBinding下具有多个命名绑定配置,并且每个端点可以相应地选择一个。到目前为止,根据您列出的配置文件存在的问题与bindingConfiguration无关,因为它们看起来都很好。但是,服务端的baseAddress和客户端端点地址似乎不匹配,我认为您正在使用svc文件进行服务激活。然后,您需要通过正确的路由确保svc文件位于正确的位置。或者,您可以在不使用svc文件的情况下使用配置激活。