【问题标题】:strange WCF client side app.config generated生成奇怪的 WCF 客户端 app.config
【发布时间】:2009-08-07 05:17:28
【问题描述】:

我指的是 VSTS2008(C# 控制台应用程序,使用 .Net 3.5),通过使用添加服务引用功能添加对同一 LAN 中另一台机器的 IIS 7.0 中托管的 WCF 服务的引用。我发现客户端自动生成的app.config很奇怪。这是内容,

我的困惑是端点地址是“http://labtest1/WcfDemo/service.svc/10.10.200.10/wcfDemo”,但实际上它应该是“http://labtest1/WcfDemo/service.svc”(我可以在 IE 中使用http://labtest1/WcfDemo/service.svc 从 WCF 主机 labtest1 获取 WSDL)。但我无法通过使用地址“http://labtest1/WcfDemo/service.svc/10.10.200.10/wcfDemo”从 IE 获取 WSDL。机器 labtest1 的内部 IP 地址为 10.10.200.10。有什么想法有什么问题吗?

顺便说一句:但是客户端函数可以工作,即对 WCF 端点方法的调用可能会返回预期的结果。 “错误”的端点地址如何返回正确的结果?

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IOrderManagement" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://labtest1/WcfDemo/service.svc/10.10.200.10/wcfDemo"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IOrderManagement"
                contract="ServiceReference1.IOrderManagement" name="BasicHttpBinding_IOrderManagement" />
        </client>
    </system.serviceModel>
</configuration>

编辑 1:

这是我在 IIS 7.0 端使用的配置文件 (web.config)。我将 service.svc 放在机器 labtest1 的默认网站(端口 80)的 WcfDemo 子目录下。我认为正确的端点地址应该是“http://labtest1/WcfDemo/service.svc”而不是“http://labtest1/WcfDemo/service.svc/10.10.200.10/wcfDemo”?

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="Foo.ServiceBehavior"
        name="Foo.OrderManagement">
        <endpoint address="" binding="basicHttpBinding" contract="Foo.IOrderManagement" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Foo.ServiceBehavior">
          <!-- 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>
  </system.serviceModel>
</configuration>

【问题讨论】:

  • 因为它托管在 IIS 中,所以服务地址应该是(虚拟目录的 URL)+(SVC 文件的名称),所以在你的情况下:labtest1/WcfDemo/service.svc - 我仍然没有了解为什么添加服务参考会创建该添加服务地址,更奇怪的是,为什么它会起作用:-)
  • 谢谢 Marc,您以前遇到过类似的问题吗?我的困惑是端点地址是可预测的,不应该这么奇怪。 :-)

标签: c# .net wcf visual-studio-2008


【解决方案1】:

您需要将两个 URL 分开:

  • 用于从中检索 WSDL 的那个
  • 用于实际调用服务的那个

这些可以不同!仅仅因为您可以从 http://labtest1/WcfDemo/service.svc 检索 WSDL 并不意味着该服务可以在那里调用。

但我同意 - 配置文件看起来很奇怪....再说一次,“添加服务引用”功能并不以创建出色的配置而闻名....

我的建议:尝试使用 WcfTestClient.exe(您可以在“程序文件\Microsoft Visual Studio 9.0\Common7\IDE”目录中找到)连接到您的服务,然后查看返回的内容。

要发现该服务,您需要输入可以在其中找到 WSDL 的地址 - 即在您的情况下为 http://labtest1/WcfDemo/service.svc。这个测试客户端找到了哪些端点??

马克

【讨论】:

  • Marc,实际上我的困惑来自另一台计算机,当我添加服务参考时,它是labtest1/WcfDemo/service.svc。在 IE 中 labtest1/WcfDemo/service.svc 有效,但 labtest1/WcfDemo/service.svc/10.10.200.10/wcfDemo 在 IE 中无效,并且可以在我的客户端应用程序中调用 WCF 服务。我已经使用 WCFTestClient.exe 进行了测试,来自 WCFTestClient UI 的配置文件的内容包含地址“labtest1/WcfDemo/service.svc”,有什么问题吗?
  • George2:IE 只能“看到”和显示服务页面——该页面位于元数据 (WSDL) 可用的地址。 IE 不能 能够在其真实服务地址实际调用服务 - 您的调用需要 SOAP 消息,而 IE 无法发送该 SOAP 消息 - 它不是为此而构建的。为此使用 WcfTestClient。
  • WcfTestClient 不使用您的任何配置文件 - 它只会尝试与您提供的 URL 建立连接,并尝试从那里下载服务信息。这应该让您了解该服务在哪个服务地址上做广告。 WcfTEstClient 还允许您在该端点调用该服务并查看它的反应(如果它有效)
  • George2:我没有使用 Team System,所以我不能说,对不起。
  • 不,抱歉 - 我从未见过这样的事情,我无法理解。也许只是暂时的侥幸?
【解决方案2】:

我已经看到当 WCF 服务托管在域内的服务器上时会发生这种情况。该实用程序似乎创建了一个 Intranet URL 而不是 Internet URL。

【讨论】:

  • “域内的服务器”——域内是什么意思?在同一个 Windows Active Directory 域或同一个 LAN 上?能否提供更多信息?
  • 我试图在同一个解决方案中删除 VSTS IDE 和 Service References 子文件夹中的所有服务引用,然后使用添加服务引用再次添加引用,生成的 cient 端 app.config 看起来美好的。有任何想法吗?我很困惑。
  • 对于“域内的服务器”,我的意思是确实是一个 Windows 活动目录域。我不能再帮你了。我只是放弃了实用程序创建的配置文件并编写了自己的(对于要求不高的应用程序)
  • 我确实认为,当服务每次都托管在域内时,添加服务引用向导会创建一个 Intranet 端点。我尝试在命令提示符下使用 svcutil,但这也有同样的缺陷。正如我所说,我现在放弃了 svcutil 生成的代码,因为我的应用程序在使用最少的手动编码配置设置时运行良好。
  • 1.是的 ;-) 但我没有对它进行广泛的测试。我只是放弃了它,从那以后就不再需要它了。 2. 没有 ;-)
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
相关资源
最近更新 更多