在 Azure 托管的 WCF 中找不到终结点

Posted

技术标签:

【中文标题】在 Azure 托管的 WCF 中找不到终结点【英文标题】:Cannot find Endpoint in Azure Hosted WCF 【发布时间】:2012-07-29 01:51:48 【问题描述】:

我在 Azure 中托管我的 WCF 时遇到的一个问题,我到处寻找答案,但我已经放弃了。我现在问这个问题,希望有人能回答。

我的 IIS7 中的 WCF 运行良好,并且我的客户端应用程序已经顺利连接到它。这一切都在本地工作。我的 WCF 配置文件中有这个绑定配置:

<system.serviceModel>
<standardEndpoints />
<bindings>
  <basicHttpBinding>
    <binding name="basicHttp" closeTimeout="00:10:00" openTimeout="00:10:00"
      sendTimeout="00:10:00" allowCookies="true" maxBufferSize="2147483647"
      maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>
  </basicHttpBinding>
  <webHttpBinding>
    <binding name="webHttp" closeTimeout="00:10:00" openTimeout="00:10:00"
      sendTimeout="00:10:00" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>
  </webHttpBinding>
</bindings>
<services>
  <service name="SurveyWCFService.SurveyService">
    <clear />
    <endpoint address="soap" binding="basicHttpBinding" bindingConfiguration="basicHttp"
      bindingName="basicHttp" contract="SurveyWCFService.SurveyService" />
    <endpoint address="json" behaviorConfiguration="jsonBehavior"
      binding="webHttpBinding" bindingConfiguration="webHttp" contract="SurveyWCFService.SurveyService" />
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="jsonBehavior">
      <webHttp />
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="">
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

如您所见,我有 2 个端点,一个用于连接到我的服务的 C# 应用程序的 SOAP 端点,以及一个用于使用 REST 访问它的客户端的 JSON 命名端点。我使用“Azure Web Role”模板中的默认配置将其部署到 Azure,我的客户端已经可以访问 Azure 生成的给定 URL。但奇怪的是:

1) 每当我的客户端使用任何给定的服务方法时,都会返回此异常:

System.ServiceModel.EndpointNotFoundException: There was no endpoint listening at
http://<hostedservicename>/SurveyService.svc that could accept the message. 
This is often caused by an incorrect address or SOAP action. 
See InnerException, if present, for more details. ---> 
System.Net.WebException: The remote name could not be resolved: '<hostedservicename>'

这很奇怪,因为这意味着我的应用没有连接到 .cloudapp.net。所以我尝试使用我的浏览器调用一些服务方法。 Fiddler 告诉我响应是“HTTP 400”。在引用端点地址的 URL 后,我还仔细检查了生成的客户端配置文件,地址是正确的。

2) Azure 决定用自己的端点和绑定替换我的端点和绑定。当我使用 Fiddler 检查并检查 wsdl 文件时,我得出了这个结论,这里是 wsdl 文件的底部:

本地 WSDL

<wsdl:service name="SurveyService"><wsdl:port name="basicHttp_SurveyService" 
binding="tns:basicHttp_SurveyService"><soap:address location="http://localhost
/SurveyServiceLibrary/SurveyService.svc/soap"/></wsdl:port></wsdl:service>

Azure WSDL

<wsdl:service name="SurveyService"><wsdl:port name="BasicHttpBinding_SurveyService" 
binding="tns:BasicHttpBinding_SurveyService"><soap:address location=
"http://<hostedservicename>.cloudapp.net/SurveyService.svc"/></wsdl:port>   
</wsdl:service>

如何让我的 WCF 像在本地环境中一样工作?我需要在 WCF 上进行一些配置吗?在 Azure 上?

【问题讨论】:

【参考方案1】:

我建议您查看调用您的 WCF 服务的应用程序。我的印象是它没有使用完整的 URL。查找 client/endpoint 元素,如下所示:

  <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
      <system.serviceModel>
          ...
          <client>
              <endpoint address="http://<hostedservicename>.cloudapp.net/SurveyService.svc" ... />
          </client>
      </system.serviceModel>
  </configuration>

哦,无法解析远程名称错误也可能意味着您尚未获得 DNS 复制。在这些情况下,我倾向于手动将我的 DNS 服务器更改为 8.8.8.8(Google 的 DNS 服务器),并且大部分时间都可以正常工作(您可以在几分钟后将其更改回自动)。

【讨论】:

感谢提示,也已经检查过了,客户端调用了正确的端点地址,但奇怪的是,当我使用本地 WCF 时,它会在客户端配置上生成正确的端点和 behaviorConfiguration (它生成 SOAP 之一)。使用 Azure 托管的 WCF,它会生成某种默认的 bindingConfiguration。【参考方案2】:

把这个留给那些遇到同样问题的人:

我检查了我在服务配置文件中提供的 namespace,我在命名空间上有一个 mistype我真傻 :) em>

【讨论】:

以上是关于在 Azure 托管的 WCF 中找不到终结点的主要内容,如果未能解决你的问题,请参考以下文章

WCF 服务的内部终结点不适用于 Azure Web 角色

Azure 中无法访问的终结点

WCF--找不到具有绑定 BasicHttpBinding 的终结点的与方案 https 匹配的基址。注册的基址方案是 [http]。

用于 postgresql 的 Azure 专用终结点无法与多个 Vnet 一起使用

在客户端应用程序中,在代码中创建 WCF 终结点配置?

保护来自 Azure 函数的 WCF (asmx) 调用