WCF服务参考支持文件未更新

时间:2011-09-24 02:14:00

标签: wcf wcf-binding

我有一个包含WCF服务项目和单元测试项目的VS 2010解决方案。单元测试项目具有对WCF服务的服务引用。

WCF服务项目的Web.config将许多绑定属性设置为非默认值:

web.config:(特别注意maxBufferSize =“ 20000000 ”)

<basicHttpBinding>
    <binding name="basicHttpBindingConfig" maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000">
      <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/>
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Ntlm"/>
      </security>
    </binding>
</basicHttpBinding>

在检查this issue时,我意识到单元测试项目的服务引用支持文件不包含我期望的值(即在WCF服务的web.config中配置的值):

configuration.svcinfo: (特别注意 maxBufferSize =“ 65536 ”)

  <binding hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" messageEncoding="Text" name="BasicHttpBinding_IBishopService" textEncoding="utf-8" transferMode="Buffered">
    <readerQuotas maxArrayLength="16384" maxBytesPerRead="4096" maxDepth="32" maxNameTableCharCount="16384" maxStringContentLength="8192" />
    <security mode="None">
      <message algorithmSuite="Default" clientCredentialType="UserName" />
      <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
    </security>
  </binding>

删除并重新创建服务引用或更新服务引用会重新创建文件,但我仍然会得到相同的值。

为什么?

更新

以下是客户端的 app.config

<binding name="BasicHttpBinding_IMyService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="200000000" maxBufferPoolSize="200000000" maxReceivedMessageSize="200000000"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="200000000" maxArrayLength="200000000"
                        maxBytesPerRead="200000000" maxNameTableCharCount="200000000" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>

2 个答案:

答案 0 :(得分:0)

这是正确的行为。绑定中包含的某些信息仅特定于配置的一侧,并且客户端和服务器都可以使用完全不同的值。此外,这些值是对拒绝服务附加的防御,因此服务不希望公开显示它们。

这些值仅影响传入消息的处理,因此服务配置它将如何处理传入请求,并且客户端配置它将如何处理传入的响应。请求和响应可以具有不同的特征和不同的配置。如果服务始终仅接收少量KB请求并返回1MB响应,则无需将服务配置为接受1MB请求。

顺便说一下。这是与一般Web服务无关的WCF特定功能,因此没有标准化的方法来在WSDL中描述它。

答案 1 :(得分:0)

这里有同样的问题,半天后没有解决配置文件的问题...改变自动生成的文件通常是不受欢迎的,所以我的感觉说“必须有一个更好的方式,丹尼斯”。

更新:我通过删除绑定配置中的name属性来修复问题。 所以你当前的web.config看起来像这样

<basicHttpBinding>
  <binding name="basicHttpBindingConfig" maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000">
    <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/>
    <security mode="TransportCredentialOnly">
      <transport clientCredentialType="Ntlm"/>
    </security>
  </binding>
</basicHttpBinding>

会变成

<basicHttpBinding>
  <binding maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000">
    <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/>
    <security mode="TransportCredentialOnly">
      <transport clientCredentialType="Ntlm"/>
    </security>
  </binding>
</basicHttpBinding>

我认为你只需要在客户端这样做。通过删除name属性,您实际上可以更改应用程序的默认basicHttpBinding配置,据我所知。此解决方案的致谢here

另一个更新:如果您正确命名服务配置(包括命名空间),它将获取绑定配置。而不是

<service name="ServiceName">

你需要

<service name="My.Namespace.ServiceName">