如何配置WCF服务以接受更长的参数列表?

时间:2011-07-18 23:36:19

标签: silverlight wcf web-config

从Silverlight调用WCF服务时,它适用于较小的参数,但对于较大的参数(具有“400:错误请求”响应)则失败,如何配置服务器以接受大量参数?

长版: 我试图从Silverlight调用WCF服务,我正在传递一个包含2000 Guids的Guids列表。服务调用最多可达1100(完全),但过去的任何操作都将导致错误。我查看了与Fiddler的回复,我收到了响应代码400(错误请求)。我相信这是一个可配置的参数,但我不确定需要更改哪个设置。我不是100%确信我的配置文件设置正在应用,因为我不知道如何以编程方式检查这些设置是否被使用。但是,我尝试将system.web下的httpRuntime元素的maxRequestLength,maxQuestyStringLength和maxUrlLength设置为极高值而不做任何更改。我已将自定义绑定的httpTransport元素的maxReceivedMessageSize,maxBufferPoolSize和maxBufferSize设置为高值而不起作用。我设置了basicHttpBinding的readerQuota元素的maxDepth,maxArrayLength,maxBytesPerRead,maxNameTableCharCount和maxStringContentLength也没有效果。

如果现在不明显,我会根据网上几个地方的建议在黑暗中随机拍摄,但没有任何效果。如果有人确切地知道我应该设置哪个属性以便我可以再试一次,我会非常感谢一些知识渊博的建议。如果某人有关于如何以编程方式检查我的配置文件中正在使用的设置的建议,这将特别有用,这至少可以让我确认我已经尝试过的东西正以我认为的方式应用是

更新: 仔细观察情况,我的问题非常类似于描述的情况 Large WCF web service request failing with (400) HTTP Bad Request。 我不相信这是同一个问题,因为我按照解决方案中的描述设置了maxReceivedMessageSize并且它没有解决问题。但是,我认为我的web.config没有正确应用,因为我刚刚检查了fiddler中的消息大小,最后一次成功调用(1100 Guids)导致消息大小为65481,并且第一个失败的请求发生在消息大小为65540.这使它刚刚超过65536的默认限制。

这是我当前的web.config serviceModel部分:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="basicHttpBinding" closeTimeout="01:00:00"
                openTimeout="01:00:00" receiveTimeout="01:00:00"
                sendTimeout="01:00:00" maxBufferPoolSize="2147483647"
                maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
                    <readerQuotas maxDepth="2147483647"
                        maxStringContentLength="2147483647"
                        maxArrayLength="2147483647" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <services>
        <service behaviorConfiguration="ReportDataServiceBehavior"
            name="DSTM.Reporting.ReportDataService">
            <endpoint address="" binding="basicHttpBinding"
                contract="DSTM.Reporting.IReportDataService" />
            <endpoint address="mex" binding="mexHttpBinding"
                contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ReportDataServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
                <dataContractSerializer maxItemsInObjectGraph="2147483647" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

如何确保我的服务正在使用我期望的绑定?

2 个答案:

答案 0 :(得分:2)

您的端点声明中有binding="basicHttpBinding",它指示服务使用内置的WCF绑定BasicHttpBinding。但是,除非您添加bindingConfiguration="basicHttpBinding"以引用已定义的特定绑定,否则它将不会使用您的自定义绑定。您可能还想更改<binding>的名称,以便更清楚地引用绑定配置,而不是basicHttpBinding本身。

答案 1 :(得分:0)

您是在传递URL中的参数作为GET请求还是使用POST请求? IIS中对GET请求的URL长度有限制。 如果是这种情况,您可以更改webmethod动词以接受POST。